在下面的代码中,我会重点解释向上引用,子类转换成父类,父类构造器和子类构造器的关系,在每个代码中都会有非常详细的注释,我一直认为,代码加注释才更是最好的老师;
下面先来看父类(了解他的大体就可以,重点在子类)
package text.extends_s;
public class B{
private int b;
private int b2;
private String b3;
B(){
System.out.println("调用了父类无参构造器");
}
public B(int b,int b2,String b3){
this.b=b;
this.b2=b2;
this.b3=b3;
}
public void YH()
{
System.out.println("这是你爹");
}
public void YHH()
{
System.out.println("这是你大爷");
}
}
再来子类
package text.extends_s;
public class AAA extends B {
private int a;
public static int a2;
private String a3;
private String a4;
AAA(){
System.out.println("调用了子类的无参构造器");
}
AAA(int a,String a3,String a4){//我们如果要在子类里面创建一个与父类无关的构造器,父类里面必须有一个无参构造器
this.a=a; //其实这里面默认调用了父类的无参构造器;
this.a3=a3;
this.a4=a4;
}
public AAA(int b,int b2,String b3,String a4){
super(b,b2,b3);//如果你想用父类的变量,必须调用父类相应的构造器
this.a4=a4; //而且,如果你的子类中有变量列表与父类中构造器相同,
// 是绝对不允许的,大家可以试试创建一个AAA(int a,int a2,String a3)这样一个子类构造器,会报错哦
}
public void YH()//覆盖父类的YH
{
System.out.println("这是你儿子");
}
public void YM()
{
System.out.println("实验点1");
}
public static void main(String[] args) {
AAA m=new AAA();//作为一个子类,我可以调用自身的方法,也可以调用父类的(前提是该子类中并没有把他覆盖)
m.YH(); //创建子类无参对象,首次要调用父类无参构造器,再调用子类无参构造器;
m.YHH();
m.YM();
System.out.println("---------------");
B n=new B();
n.YH();//作为一个父类,我可以调用我的方法,这里我还没有引用子类哦
n=m;//这里我把子类转成父类;从这一刻开始,n就已经是一个“伪父类”了,他本身父类的方法,被
n.YH(); //子类中相同的方法所覆盖了。但是!他仍然不可以调用子类方法!!
// 所以不太建议这样引用,价值不是太大。而且容易造成程序混乱
n.YHH();
System.out.println("-------------");
// n.YM();//编译会出错
B k=new AAA();//来一个向上转型,与子类转成父类极其相似,不过这里简洁多了,因为之前并没有创建,所以需要
//先调用父类无参构造器,再调用子类无参构造器
k.YH();
k.YHH();
// k.YM();//这里报错
}
}
都看到这了,教你一个秘籍------点赞,收藏,加关注