class A {
int i=1;
public void printI() {
System.out.println("i="+i);
}
}
class B extends A{
int i=2;
public static void main(String[] args) {
B b=new B();
b.printI();
}
}
得到的结果肯定是i=1,因为B是子类,A是父类,B的printI()方法是继承A的,所以B是使用的是A的printI方法,自然打印的是A的成员属性i,因为B继承的方法中是默认使用super指针的
如果你想打印自己的成员变量,即使用子类的成员变量,可以进行重写
class A {
int i=1;
public void printI() {
System.out.println("i="+i);
}
}
class B extends A{
int i=2;
@Override
public void printI(){
System.out.println("i="+i);
}
public static void main(String[] args) {
B b=new B();
b.printI();
}
}
public class Test {
public static void main(String[] args) {
A a = new B();
a.printA();
}
}
class A {
int a = 5;
public A() {
System.out.println("A类初始化");
printA();
}
public void printA() {
System.out.println(a);
}
}
class B extends A {
int a = 15;
public B(){
System.out.println("B类初始化");
printA();
}
@Override
public void printA(){
System.out.println("打印a属性的值");
System.out.println(a);
}
}
首先要了解子父类初始化顺序:
static 父类——>static子类——>父类成员变量初始化——>父类构造代码块——>父类构造方法——>子类成员变量初始化——>子类构造代码——>子类构造方法
和半初始化对象,可以简单认为一个类在加载的时候,成员基本类型变量和引用都会先初始化,像int name = 1,会先把int name建出来,然后给默认值0,然后再进行赋值1
然后就是多态
分析:
运行结果:
分析:
首先,是多态,B重写了A的printI()方法,然后就是B自己也定义了a变量,会覆盖了继承过来的a变量,因为创建B的时候,会先将B的所有父类都先创建出来,然后因为重写,这时父类A初始化时使用的printI()方法是使用B的,自然也就使用B自己的a变量,这个时候子类B的a变量还没有初始化完成,只会是0,然后等B初始化完成了自然打印的就是15
因篇幅问题不能全部显示,请点此查看更多更全内容