您的位置:首页 > 编程语言 > Java开发

令人混淆的几个Java语言特性

2017-08-22 00:00 316 查看
在父类构造方法中调用方法会调用子类的方法

class Parent {
public Parent() {
System.out.println("init parent");
printName();
}
public void printName() {
System.out.println("name: parent");
}
}

class Son extends Parent {
public Son() {
System.out.println("init son");
printName();
}

@Override
public void printName() {
System.out.println("name: son");
}
}

public class Main {
public static void main(String[] args) {
Son son = new Son();
}
}

最终输出

init parent
name: son
init son
name: son

原因: 动态绑定到子对象的方法上了.

如果子类未定义方法, 则会调用父类的方法, 而不是自动继承下来.

class Parent {
private int a = 20;

public int getA() { return a; }
public void setA(int a) { this.a = a; }
}

class Son extends Parent {
private int a = 10;

@Override
public int getA() {
System.out.println("get a");
return a;
}
public int getSuperA() {
return super.getA();
}
}

public class Main {
public static void main(String[] args) {
Parent parent = new Parent();
parent.setA(30);
int result = parent.getA();
System.out.println(result);

Son son = new Son();
System.out.println("=====before set=====");
System.out.println(son.getA());
System.out.println(son.getSuperA());
son.setA(50);

System.out.println("=====after set=====");
System.out.println(son.getA());
System.out.println(son.getSuperA());
}
}

属性不具有多态, 只有方法具有多态.

class Parent {
public int var = 5;
public String str = "parent";
}

class Son extends Parent {
public int var = 10;
public String str = "son";
}

public class Main {
public static void main(String[] args) {
Parent son = new Son();
System.out.println(son.var);
System.out.println(son.str);
}
}

输出结果

5
parent
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java