1.super()概念
1.this相当于当前类的对象的指针
2.super相当于父类对象的指针,可以在非静态函数中用super调用父类的函数
3.如果在子类中没有显示的用super调用父类的构造方法,那么子类在建立的时候会默认建立父类的无参构造方法,但是要想调用父类的有参构造方法,就必须用super(param)将参数传入
2.向上转型,向下转型概念
向上转型:
子类直接调用父类的非私有方法就是向上转型
向下转型:
- 父类对象不能直接调用子类的方法,不然会报类型转换异常ClassCastException,所以在向下转换之前要用instanceof方法确认一下实例所属的类是哪一个
-
解决方法:为了体现多态性,需要使父类型的变量是子类型的一个实例,即
父类 实例名 = new 子类(); -
此实例不仅可以调用父类的方法,还可以通过向下转换调用子类方法,
转换方法:((子类名)实例名).子类函数
3.例子:
父类:定义了一个带参构造方法,私有字符串属性,以及设置和获取该字符串的方法
public class A {
private String greate = "hello";
public A(String s){
System.out.println("This is A"+s);
}
public void setGreate(String s){
this.greate = s;
}
public void getGreate(){
System.out.println(this.greate);
}
}
子类:由于父类只定义了带参构造方法,所以子类构造方法必须使super()传入参数调用父类的构造方法,并定义了一个
public class A2 extends A {
public A2(String s){
super(s);
}
public void text(){
System.out.println("子类的方法");
}
}
主函数类:
public static void main(String[] args) {
//1.定义子类实例,通过super(s)使子类的构造函数调用父类的带参构造函数
A2 b = new A2("这是子类");
//2.向上转型,子类实例可以直接调用父类函数
b.setGreate("子类调用父类函数");
b.getGreate();
//定义父类实例
A a = new A("这是父类");
//3.向下转型,以下代码报错显示:java.lang.ClassCastException: A cannot be cast to A2
// String s = ((A2)a).text(); //因为.的优先级高于强转换的符号,所以要用括号将转换的实例名括起来再调用子类方法
//为了不让它报类型转换的错误,首先应该用instanceof判断要转换的实例所属类是否是子类
if(a instanceof A2){
System.out.println("以下是父类实例调用的子类方法");
((A2)a).text();
}
//父类型的变量是子类型的一个实例,只有这样能才能保留调用父类方法的能力同时通过向下转换拥有调用子类方法的能力
A a2 = new A2("父类型的变量是子类型的一个实例");
if(a2 instanceof A2) {
System.out.println("以下是父类型的变量是子类型的一个实例调用的子类方法:");
((A2) a2).text();
}
}
版权声明:本文为MaxineZhou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。