📈阅读下面代码,思考输出结果
package Homework343;
import javax.print.DocFlavor;
public class homework348 {
public static void main(String[] args) {
new Demo().test();
new Demo("Join").test();
}
class Test{
String name="Rose";
Test(){
System.out.println("Test");
}
Test(String name){
this.name=name;
}
}
class Demo extends Test{
String name="jack";
Demo(){
super();
System.out.println("Demo");
}
Demo(String s){
super(s);
}
public void test(){
System.out.println(super.name);
System.out.println(this.name);
}
}
}
📚详解分析:
✏️(1)在主函数里, new Demo().test()
没有指向对象,所以为一个匿名对象,new Demo("Join").test()
也为一个匿名对象。
✏️(2)在主函数中,创建一个匿名对象,第一步走Demo
的无参构造,
Demo(){
super();
System.out.println(“Demo”);
}
首先调用其父类的无参构造,找到Test的无参构造,即输出"Test"
;
输出完以后,回到Demo的无参构造,输出"Demo"
;
✏️(3)Demo对象创建完毕,调用test方法,该方法输出super.name,super.name找的是父类的name属性,父类name属性为"Rose",
即输出Rose
;this.name是本类的name,即输出jack
.
✏️(4) 执行以下语句:
new Demo(“Join”).test();
走的是子类的有参构造器,s在这里就是Join,调用父类的有参构造器,
Test(String name){//是传进来的Join
this.name=name;//将Join赋给this.name,将父类的name改为Join
}
属性没有动态绑定机制,哪里声明就在哪里使用
✏️(5) 调用test方法,super.name,在这里找父类的name,但是父类的name已经被改为Join,所以在此输出为Join
;
✏️(6) 指的是本类name,即jack
;
⛳️知识点补充
1. 继承的特点
(1)子类只能继承一个父类(单继承),可以多层继承,例如C继承自B,B继承自A,那么C同样可以调用A类的属性或者方法;
(2)子类继承父类的普通属性和方法
(3)子类不能继承父类的构造方法,但是在子类的构造方法第一行隐 式的存在一个super(),用来调用父类的构造方法;
(4)子类无法继承父类中被private修饰的属性或者方法;
(5)子类可以继承父类中的静态方法和静态属性;
(6)父类中必须有无参构造方法,才能被继承,只有有参构造方法无法被继承。
2. super关键字
(1) super.属性——调用父类的属性
(2) super.方法——调用父类的方法
(3)super()——调用父类的构造方法
2.1 super注意事项
(1)super调用父类的构造方法,必须在构造方法的第一个
(2)super 必须只能出现在子类的方法或者构造方法中!
(3)super 和 this 不能同时调用构造方法
2.1 super与this不同
代表的对象不同:
this :本身调用者这个对象
super : 代表父类这个对象的应用
前提
this :没有继承也可以使用
super :只能在继承的条件下才可以使用
构造方法
this :本类的构造
super :父类的构造