我看thinking in java第四版的时候,他说构造器也是static的方法,当类的第一个对象被创建或者类的任何static成员被访问的时候类就会被加载,但是这里有一个问题,构造器不是要new出来的吗?new就产生对象了,但是它却又是静态的?在构造器里面可以用this关键字,在一般的静态方法里面去不能?这是甚么原因啊?还有一个问题,继承的时候,他说private声明的方法隐藏了final声明,也就是这个方法不能被覆盖.那么我重写一个普通方法的时候,内存里面究竟有1个方法还是有2个方法?按书上说的,重写会覆盖原来方法那么内存里面就有一个方法了,但是用super却可以调用父类原来被覆盖的那个方法,这又是为什么呢?
另一个问题的回答:
重写一个方法覆盖原private方法时,新类可调用的是新的方法,super方法调用的是父类的方法,此时已经是两个不同的类在调用两个不同的方法了。因为内存里加载的是两个类:父类和新类。
举例来说:
构造器里的Exception是<init>方法里抛出的,所以我认为它不是静态的
另外,构造器就是构造器,不必钻这种牛角尖方法是放在方法区里面的,所以加载子类时必定加载了父类,所以内存里面有2个方法
private int i = 9;
protected int j;
Insect(){
System.out.println("i = "+i+", j = "+j);
j=39;
} private static int x1 = printInit("static Insect.x1 initialized");
static int printInit(String s){
System.out.println(s);
return 47;
}
}public class Beetle extends Insect{
private int k = printInit("Beetle.k initialized");
public Beetle(){
System.out.println("k= "+k);
System.out.println("j= "+j);
}
private static int x2 = printInit("static Beetle.x2 initialized");
public static void main(String[] args){
System.out.println("Beetle constructor");
//Beetle b = new Beetle();
}
}问题就在这里,子类的构造器里面要输出j,j在父类上面定义了,但是只在父类构造器里面初始化,也就是说子类构造器依赖了父类的构造器,那么我没有创建对象代码还是能够编译过去,这是不是能说明加载的时候如果没有加载到构造器,j就还没得到初始化就不能编译过去了??
1 -------- new 构造()
2 -------- 初始化静态成员
构造方法也是方法,需要对象.来调用,但是还没构造之前哪来的对象,从这两点可见,它必须是个静态的。
在构造中this表示自身对象,来完成一定功能。而普通静态方法是类相关的,放在池中,所有对象共用一份。还有一个问题,继承的时候,他说private声明的方法隐藏了final声明,也就是这个方法不能被覆盖.那么我重写一个普通方法的时候,内存里面究竟有1个方法还是有2个方法?按书上说的,重写会覆盖原来方法那么内存里面就有一个方法了,但是用super却可以调用父类原来被覆盖的那个方法,这又是为什么呢? 既然声明为私有当然用在本类,子类也别想继承,是不是加了final就可以实现呢?重写父类的普通方法,做为子类当然有2个方法,一个是自己重写了的用this.调用,一个是父类继承来的用super.调用。比如一个人类,有一个运动员类继承人类,人类有走的方法,walk(){每小时5公里走} 运动员重写了走方法,walk(){每小时10公里走},那你作为一个运动员当然可以执行自己的走方法,也可以执行作为一个人类的走方法。
一个对象实例其实就是一堆数据,既然内存已经分配完毕,那么可以认为这个实例已经创建,只不过直到执行完所有调用的构造方法初始化这些数据之后才返回这个实例而已
这个在JLS 3RD 12.5节中明确讲过:"刚好在指向新创建的对象的引用作为结果被返回之前,将会使用指定的构造函数进行初始化"
public class Date {
public String toString();
...
}
Date d = new Date();
String s = d.toString();
相当于在调用
public class Date {
public static String toString(Date this); //此处this不是关键字而代表this指针
...
}
Date d = new Date();
String s = Date.toString(d);
而这里的 this 参数会自动处理,源代码中是体现出来的是this关键字,实例方法中可以使用 this 来引用实例域的原因也在于此。
Thinking in Java 偏重于讲解 Java 底层原理,所以书中有很多“相当于”只是为了便于深层理解 Java。
构造器是创建对象的时候用到的,也就是new()方法;
你的主函数里没有创建对象,所以没有用到构造器,自然也就没有初始化j了