03 类与对象 课后作业2

【验证1】:

ClassAndObjectTest.java:

实验截图:

【验证2】:

Demo: ObjectEquals.java:

实验截图:

【验证3】:

TestStaticInitializeBlock.java:

实验截图:

【动手动脑1】:

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

结论:

系统默认的是引用Foo类,而不是Foo方法

如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。

 【自找麻烦】

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

 

执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。
执行类的构造函数。

类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

【动手动脑2】:

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

 

静态初始化块的执行顺序:

1、静态初始化块只执行一次。
2、创建子类型的对象时,也会导致父类型的静态初始化块的执行。

【一个有趣的问题】:

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

请编写代码验证你的想法。

想法:在静态方法中,创建类的一个对象,通过对象调用没有附加static关键字的字段或方法

代码:

import java.util.Scanner;

public class VisitUnstatic
{
 private int x=0,y=0;
 Scanner input=new Scanner(System.in);
 public void setNumber()
 {
  x=input.nextInt();
  y=input.nextInt();
 }
 public static void getNumber(int a,int b)
 {
  VisitUnstatic obj=new VisitUnstatic();
  obj.setNumber();
  a=obj.x;
  b=obj.y;
  System.out.println(a);
  System.out.println(b);
 }

 public static void main(String[] args)
 {
  int c=0;int d=0;
  VisitUnstatic p1=new VisitUnstatic();
  p1.getNumber(c, d);
 }

}

【Integer的“诡异”特性”】:

StrangeIntegerBehavior.java:

测试结果:

提示:
 使用javap来分析生成class文件,看它调用了Interger类的哪个方法,然后打开JDK源文件查看源码,就可以找到答案。

调用了Integer.valieOf方法;因为从-127到128之间的Integer数,Java在Integer中有事先缓存好的原型对象,每次返回的都是同一个Integer对象,只有不在这个范围的数才会新创建出一个Integer,最后所指都不是同一个对象,所以比较的不是同一个对象。

 

posted @ 2017-10-20 14:33  DaisyYuan  阅读(92)  评论(0编辑  收藏  举报