class Super {
private int s = 100; Super() {
abc();
} void abc() {
System.out.println("s " + s);
}
}
class Sub extends Super {
private int s = 200; void abc() {
System.out.println("s " + s);
}
public static void main(String[] args) {
new Sub();
}}
private int s = 100; Super() {
abc();
} void abc() {
System.out.println("s " + s);
}
}
class Sub extends Super {
private int s = 200; void abc() {
System.out.println("s " + s);
}
public static void main(String[] args) {
new Sub();
}}
改下程序,可以明显看出,父类的方法已经被覆盖。class Super {
private int s = 100; Super() {
abc();
} void abc() {
System.out.println("s1" + s);
}
}
class Sub extends Super {
private int s = 200; void abc() {
System.out.println("s2 " + s);
}
public static void main(String[] args) {
new Sub();
}
}
运行一边不就得了class Super {
private int s = 100; Super() {
abc();
} void abc() {
System.out.println("s1" + s);
}
}
class Sub extends Super {
private int s = 200; void abc() {
int s=300;
System.out.println("s2 " + s);
}
public static void main(String[] args) {
new Sub();
}
}
class Super {
public static int s = 100; Super() {
abc();
} void abc() {
System.out.println("s1=" + s);
}
}class Sub extends Super {
public static int s = 200; void abc() {
System.out.println("s2=" + s);
}
public static void main(String[] args) {
new Sub();
}}
先调用父类的构造方法输出 s100
再说,子类的 abc() 它有调用吗??
上学期刚刚学完java
烤得就是这样的这样的程序
用笔答得,挺有意思的
private int s = 100;
Super() {
abc();
}
void abc() {
System.out.println("s1" + s);
}
}class Sub extends Super {
private int s = 200;
void abc() {
System.out.println("s2 " + s);
}
public static void main(String[] args) {
Sub s= new Sub();
s.abc();
}
}运行结果:
javac Super.java
java Sub
s2 0 //此为对象s创建时类Sub初始化继承Super初始化时就输出的值,此时私有变量s没被继承,默0,即Sub中初始化为0,又由于被Sub 的abc()重载故为s2而非s1
s2200//此为s对象调用Sub.abc()s被重新初始化为200
对象初始化先类初始化,类初始化写初始化父类,父类初始化就输出,又被子类方法重载;
即子类的初始化时变量没有被继承默为0,而方法时构造方法重载的方法
而new Sub()完全还没有到对象,只是类的初始化
s.abc()才是你要的结果
就是运行父类的构造函数的时候发现子类重写了父类的构造函数中用到的方法,就调用子类中的方法?
访问Sub.main()时,编译器就会寻找 Sub.class文件,在装载过程中,装载器发现它有一个基类Super,于是它再装载基类,无论你创建不创建基类对象,这个过程都要发生。下一步,它就会执行基类的static初始化,以此类推。
现在所有的类都已经装载完毕,可以创建对象了
首先,对象中所有的primitive都会被设置成它们的缺省值,而reference都会被设置成为null,对象的内存都会被设置成为二进制的零。然后调用基类的构造函数,然后按照各个变量的字面顺序进行初始化,最后会执行子类构造函数的其余部分.
private int s = 100; Super() {
abc();
} void abc() {
System.out.println("s " + s);
}
}
class Sub extends Super {
private int s = 200; void abc() {
System.out.println("s " + s);
}
public static void main(String[] args) {
new Sub();
}}运行结果:s0