• Java(类与对象)


    1>对象判等

    请输入并运行以下代码,得到什么结果?

     1 public class Test {
     2 
     3     public static void main(String[] args) {
     4         // TODO Auto-generated method stub
     5         Foo obj1 = new Foo();
     6         Foo obj2 = new Foo();
     7         System.out.println(obj1 == obj2);
     8     }
     9 }
    10 class Foo{
    11     int Value = 100;
    12 }

    结果:

    分析:

    1)当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等

    2)当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。

    3)引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。两个对象各有各的地址,所以结果为false。

    2>构造方法

    以下代码为何无法通过编译?哪儿出错了?

    原因:如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。因为上面的Foo类中提供出了自己的构造方法,所以用new默认构造方法不再提供使用。

    3>类的初始化块

    如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?

     1 public class Test2 {
     2 
     3     public static void main(String[] args) {
     4         
     5         InitializeBlockClass obj=new InitializeBlockClass();
     6         System.out.println(obj.field);
     7         
     8         obj=new InitializeBlockClass(300);
     9         System.out.println(obj.field);
    10     }
    11 
    12 }
    13 class InitializeBlockClass{
    14     //下面这句在初始化块之前与之后,会影响到field字段的初始值
    15     //public int field=100;
    16     
    17     {
    18         field=200;
    19     }
    20     public int field=100;
    21     public InitializeBlockClass(int value){
    22         this.field=value;
    23     }
    24     public InitializeBlockClass(){
    25         
    26     }
    27 }

    结果:如果{field=200;}在 filed=100 之前:

           如果{field=200;}在 filed=100 后

    分析:执行类成员定义时指定的默认值或类的初始化块,“排在前面”的先执行。也可通过执行类的构造函数为其赋值。

    4>静态初始化块的执行顺序

       请运行 TestStaticInitializeBlock.java 示例,观察输出结果,总结出“静态初始化块的执行顺序”。

     1 class Root
     2 {
     3     static{
     4         System.out.println("Root的静态初始化块");
     5     }
     6     {
     7         System.out.println("Root的普通初始化块");
     8     }
     9     public Root()
    10     {
    11         System.out.println("Root的无参数的构造器");
    12     }
    13 }
    14 class Mid extends Root
    15 {
    16     static{
    17         System.out.println("Mid的静态初始化块");
    18     }
    19     {
    20         System.out.println("Mid的普通初始化块");
    21     }
    22     public Mid()
    23     {
    24         System.out.println("Mid的无参数的构造器");
    25     }
    26     public Mid(String msg)
    27     {
    28         //通过this调用同一类中重载的构造器
    29         this();
    30         System.out.println("Mid的带参数构造器,其参数值:" + msg);
    31     }
    32 }
    33 class Leaf extends Mid
    34 {
    35     static{
    36         System.out.println("Leaf的静态初始化块");
    37     }
    38     {
    39         System.out.println("Leaf的普通初始化块");
    40     }    
    41     public Leaf()
    42     {
    43         //通过super调用父类中有一个字符串参数的构造器
    44         super("Java初始化顺序演示");
    45         System.out.println("执行Leaf的构造器");
    46     }
    47 }
    48 
    49 public class TestStaticInitializeBlock
    50 {
    51     public static void main(String[] args) 
    52     {
    53         new Leaf();    
    54     }
    55 }

    结果:

    分析:静态初始化块只执行一次。创建子类型的对象时,也会导致父类型的静态初始化块的执行。在类初始化阶段执行静态初始化块,而不是在创建对象时才执行。因此静态初始化块总是比普通初始化块先执行。先执行java.lang.Object类中的静态初始化块,然后执行其父类的静态初始化块,最后才执行该类的静态初始化块。经过这个过程,才完成了该类的初始化过程。只有当类初始化完成后,才可以在系统中使用这个类,或者用这个类来创建实例。最先执行所有的静态初始化块,再执行类的普通初始化块,最后执行类的构造器。

    5>类的静态方法

    静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?

    public class Text3
    {
     int x = 3;//类的实例变量,初始化值为3
     static int  y = 4;//类的静态变量,初始化值为4
     public static void method()//静态方法
      {   
       System.out.println("实例变量x = " + new Text3().x);//在静态方法中访问类的实例变量需首先进行类的实例化
       System.out.println("静态变量y = " + y);//在静态方法中可直接访问类的静态变量
      }
    
     public static void main(String[] args) 
        {
         Text3.method();
         Text3 ex = new Text3();
            System.out.println("x = " + ex.x);
            System.out.println("y = " + ex.y);
        }
    }

    结果:

    分析:在静态方法中访问类的实例变量首先需要进行类的实例化。类中静态的方法或者属性,本质上来讲并不是该类的成员,在java虚拟机装在类的时候,这些静态的东西已经有了对象,它只是在这个类中"寄居",不需要通过类的构造器(构造函数)类实现实例化;而非静态的属性或者方法,在类的装载是并没有存在,需在执行了该类的构造函数后才可依赖该类的实例对象存在。在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。

    6>使用类的静态字段和构造函数

     使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。

    //请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”
    public class Test4 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Objectnumber obj1 = new Objectnumber();
            Objectnumber obj2 = new Objectnumber();
        }
    
    }
    class Objectnumber{
        private static int number ;
        public Objectnumber()
        {
            number++;
            System.out.printf("你已经创建了%d个对象",number);
            System.out.print("\n");
        }
    }
                   

    结果:

    分析:将计数器写在构造函数里,每生成一个对象就会调用一次构造函数,将计数的 number 设置成静态类以保证下一次调用不会改变上一次的数值。

  • 相关阅读:
    c语言|博客作业05
    C语言I博客作业04
    C语言II博客作业04
    C语言II博客作业03
    C语言II博客作业02
    C语言II博客作业01
    学期总结
    我的第一周C语言作业
    C语言I博客作业08
    C语言I博客作业07
  • 原文地址:https://www.cnblogs.com/ttzz/p/5982467.html
Copyright © 2020-2023  润新知