• Java学习(六)


    Java的字段与局部变量的区别:1.字段Field变量存在于类中,局部变量local variable存在于方法中;2.两者的生命周期不同。局部变量在方法调用时才在中生成,调用结束后被系统自动回收;字段变量在类实例化后于中生成,并一直保持到程序结束;3.字段变量可以在用户不初始化而系统自动初始化。基本类型置为0,引用类型置为null;局部变量必须要用户进行初始化;4.字段变量可以被public、private、static、final修饰,而局部变量只可以被final修饰。

    此外,堆中只保存引用类型数据的地址。如果需要指向返回的引用类型数据,则需要在栈中用new新开辟地址。具体示例如下:

     1 package helloWorld;
     2 
     3 public class Variable {
     4     int i;
     5     public Variable(int i)
     6     {
     7         this.i=i;
     8     }
     9     public Variable(){}
    10     
    11     public void variable()
    12     {
    13         int n=0;
    14         System.out.println(n);
    15     }
    16     
    17     public void modify(int a)
    18     {
    19         a=a+1;//实际上a的值未改变
    20     }
    21     public void modify(int[] a)
    22     {
    23         for(int i=0;i<a.length;i++)
    24             a[i]=a[i]+1;
    25         a=new int[a.length];//新开辟栈中的空间用于存储改变后的a值
    26     }
    27     
    28     public void display(int a)
    29     {
    30         System.out.println(a);
    31     }
    32     public void display(int[] a)
    33     {
    34         for(int i=0;i<a.length;i++)
    35             System.out.print(a[i]+" ");
    36         System.out.println();
    37     }
    38     
    39     public void print()
    40     {
    41         System.out.println(i);
    42     }
    43     
    44 }
     1 Variable var=new Variable();
     2         int i1=1;
     3         int[] i2=new int[]{1,2,3,4};
     4         var.print();
     5         var.modify(i1);
     6         var.display(i1);
     7         var.modify(i2);
     8         var.display(i2);
     9 结果为:
    10 0
    11 1
    12 2 3 4 5 

    虚函数:在Java的类中,子类可以被转换为父类。所以如果定义了父类的表示方法,子类中也定义了相关的方法函数,那么系统会根据传递的类名来自动选择那个类中的方法。

    package helloWorld;
    
    public class VirtualMethod {
        protected String name="Person";
        public VirtualMethod(){}
        public void display()
        {
            System.out.println(name+": "+"virtualMethod");
        }
    
    }
    
    class VirtualMethodTemp extends VirtualMethod{
        private String name="Students";
        public VirtualMethodTemp(){}
        public void display()
        {
            System.out.println(this.name+": "+super.name+": "+"VirtualMethodTemp");
        }
    }
    
    class TestVirtualMethod
    {
        static void display(VirtualMethod v)
        {
            v.display();
        }
    }
    1 VirtualMethod vm=new VirtualMethod();
    2         VirtualMethodTemp vmt=new VirtualMethodTemp();
    3         TestVirtualMethod tvm=new TestVirtualMethod();
    4         tvm.display(vm);
    5         tvm.display(vmt);
    6 显示结果为:
    7 Person: virtualMethod
    8 Students: Person: VirtualMethodTemp

    构造函数与初始化 

    Java的类中,如果用户没有定义构造函数,那么系统会自动定义一个默认的构造函数,此函数不带参数,也不对字段赋值。但若用户定义了构造函数,那么系统不会定义默认构造函数。

    类中的static对象或方法总是在类初始化前执行。因为一个类可以实例出许多对象,但这些对象共用一个static。因此在实例化对象之前会对static进行处理。

     1 package helloWorld;
     2 
     3 public class Initialize {
     4     private String name;
     5     private int age;
     6     public Initialize(){System.out.println("Initialize class");}
     7     public Initialize(String name,int age)
     8     {
     9         this.name=name;
    10         this.age=age;
    11         System.out.println("Initialize class");
    12     }
    13     static {
    14         System.out.println("Initialize static");
    15     }
    16 }
    1 Initialize ini=new Initialize();
    2 结果为:
    3 Initialize static
    4 Initialize class

    对于类的继承,子类构造函数在构造前会调用父类的构造函数。如果没有特殊说明,会调用默认的父类构造函数default。因此,用户如果在父类中定义了构造函数,则一定需要包括空构造函数,否则子类的构造函数在编译时无法通过。

    此外,在子类的static、父类构造函数、子类构造函数中,执行的优先级依次降低

     1 class IniStudent extends Initialize
     2 {
     3     public IniStudent()//系统自动加入super(){}
     4     {
     5         System.out.println("Initialize Student");
     6     }
     7     public IniStudent(String name,int age)
     8     {
     9         super(name,age);
    10         System.out.println("Initialize Students");
    11     }
    12     static
    13     {
    14         System.out.println("Initialize Student class");
    15     }
    16 }
    1 IniStudent inis=new IniStudent();
    2 结果为:
    3 Initialize Student class
    4 Initialize class
    5 Initialize Student

    Java中有一种垃圾回收机制,用户可以用包java.lang.AutoClose中的try(){}来回收文件或网络执行完后产生的垃圾内存。其效果相当于resources.closee()。

     1 try(Scanner scanner=new Scanner(System.in))
     2         {
     3             String str=scanner.nextLine();
     4             try
     5             {
     6             PrintStream fileOut=new PrintStream("./test.txt");
     7             System.setOut(fileOut);
     8             System.out.println(str);
     9             }catch(IOException e)
    10             {
    11                 e.printStackTrace();
    12             }
    13         }
    14         System.setOut(System.out);        
  • 相关阅读:
    Cousera课程Learning How to Learn学习报告
    C语言中当无符号数遇到符号数
    STC15 串口(工作方式1)使用小结
    取C语言头文件的文件名
    linux 的 shell 逻辑
    Win7 局域网内简单共享的设置
    写了一个批处理,可以实现文件备份,自动对比删除冗余文件。
    C语言 函数指针的应用
    自动控制原理 典型环节频率特性对比
    51单片机汇编的溢出标志位OV和进位标志位CY
  • 原文地址:https://www.cnblogs.com/2Bthebest1/p/8416086.html
Copyright © 2020-2023  润新知