java利用类与对象输出_Java(类与对象)

本文介绍了Java中类与对象的相关概念,包括对象的判等、构造方法、类的初始化块和静态初始化块的执行顺序。通过示例代码解析了在不同场景下如何使用构造方法、初始化块,并讨论了静态方法中访问实例成员的规则。此外,还提出了一个使用静态字段和构造函数来跟踪类中对象数量的设计思路。
摘要由CSDN通过智能技术生成

1>对象判等

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

1 public classTest {2

3 public static voidmain(String[] args) {4 //TODO Auto-generated method stub

5 Foo obj1 = newFoo();6 Foo obj2 = newFoo();7 System.out.println(obj1 ==obj2);8 }9 }10 classFoo{11 int Value = 100;12 }

结果:

1cca2e8257b3452a67c9c835d9e47b9e.png

分析:

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

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

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

2>构造方法

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

f72ae8a09571a9413e20470e3c7ae2eb.png

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

3>类的初始化块

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

1 public classTest2 {2

3 public static voidmain(String[] args) {4

5 InitializeBlockClass obj=newInitializeBlockClass();6 System.out.println(obj.field);7

8 obj=new InitializeBlockClass(300);9 System.out.println(obj.field);10 }11

12 }13 classInitializeBlockClass{14 //下面这句在初始化块之前与之后,会影响到field字段的初始值15 //public int field=100;

16

17 {18 field=200;19 }20 public int field=100;21 public InitializeBlockClass(intvalue){22 this.field=value;23 }24 publicInitializeBlockClass(){25

26 }27 }

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

574adb53664d8db33e19d6e3004a8079.png

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

79534f7d42dcb6f6b63addb746db0e4f.png

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

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

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

1 classRoot2 {3 static{4 System.out.println("Root的静态初始化块");5 }6 {7 System.out.println("Root的普通初始化块");8 }9 publicRoot()10 {11 System.out.println("Root的无参数的构造器");12 }13 }14 class Mid extendsRoot15 {16 static{17 System.out.println("Mid的静态初始化块");18 }19 {20 System.out.println("Mid的普通初始化块");21 }22 publicMid()23 {24 System.out.println("Mid的无参数的构造器");25 }26 publicMid(String msg)27 {28 //通过this调用同一类中重载的构造器

29 this();30 System.out.println("Mid的带参数构造器,其参数值:" +msg);31 }32 }33 class Leaf extendsMid34 {35 static{36 System.out.println("Leaf的静态初始化块");37 }38 {39 System.out.println("Leaf的普通初始化块");40 }41 publicLeaf()42 {43 //通过super调用父类中有一个字符串参数的构造器

44 super("Java初始化顺序演示");45 System.out.println("执行Leaf的构造器");46 }47 }48

49 public classTestStaticInitializeBlock50 {51 public static voidmain(String[] args)52 {53 newLeaf();54 }55 }

结果:

62ad4dd29238530a741607befb3d7150.png

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

5>类的静态方法

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

public classText3

{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 voidmain(String[] args)

{

Text3.method();

Text3 ex= newText3();

System.out.println("x = " +ex.x);

System.out.println("y = " +ex.y);

}

}

结果:

3586834c2c0254e35559493283b4a424.png

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

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

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

//请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”

public classTest4 {public static voidmain(String[] args) {//TODO Auto-generated method stub

Objectnumber obj1 = newObjectnumber();

Objectnumber obj2= newObjectnumber();

}

}classObjectnumber{private static intnumber ;publicObjectnumber()

{

number++;

System.out.printf("你已经创建了%d个对象",number);

System.out.print("\n");

}

}

结果:

94a0652a9f939c1c23a56e607fec9fae.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值