[java][19]继承

java小白的学习记录......

1. 继承的作用:

方便修改代码,减少代码量


2. 实例

1)父类、子类框架

父类:Pet

子类:Dog,Penguin

关系如图:


目录树:


2)父类    Pet.java代码:

public class Pet {

//属性

private String name;
private int health;

private int love;

//构造方法

public Pet(){
System.out.println("这是父类Pet中的无参构造方法");
}
public Pet(String name,int health,int love){ //父类的有参构造方法
this.name=name; 
this.health=health;
this.love=love;

}

// name, health, love属性都是private的,参考博客[java][15][抽象和封装],为了对其访问,需调用se/get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;

}

       ......health和love同上,省略

//print方法
public void print(){
System.out.println("name:"+this.name+"\nhealth:"+health
+"\nlove:"+love+"\n");
}

}


3)子类 Dog继承自Pet

public class Dog extends Pet{  //使用extends关键字表示继承关系
private String strain;//子类自己的属性-品种

//构造函数

public Dog(){
//super
();//注意:必须是子类构造方法中的第一条语句(此处是无参构造,super()可以注释掉)。
System.out.println("这是子类Dog中的无参构造方法");

}

public Dog(String name,int health,int love,String strain){
super
(name,health,love);//注意:必须是子类构造方法中的第一条语句,默认调用父类的有参构造
this.strain=strain;

}

//print函数
public void print(){
//super调用父类中的方法
//子类不能继承父类中的私有变量和私有方法 (如:System.out.println(super.name);报错 )

System.out.println("name:"+super.getName()+"\nhealth:"+this.getHealth()+
"\nlove:"+this.getLove()+"\nstrain:"+strain+"\n");
}

}


4)子类Penguin与Dog类似

public class Penguin extends Pet{
private String sex;//子类自己的属性-性别

public Penguin(String name,int health,int love,String sex){
super(name,health,love);//默认调用父类的有参构造
this.sex=sex;
}

    public void print(){
    //重写父类的print
super.print();
System.out.println("\nsex:"+this.sex);
}
}

3. super关键字 

super代表父类对象

1)访问父类构造方法

在子类构造方法中调用且必须是第一句

见2  3)

2)访问父类属性

若Pet中name的属性不是private ( 而是public,protected,或默认 ) ,Dog中可用super.name进行访问

3)访问父类方法

如:super.getname(),见 2 3)


4. 子类不能继承父类的哪些资源

1)private成员

如3 2)

2)子类与父类异包,不可访问父类的默认成员

若同包,就可访问默认成员了,如3 2)

3)构造方法


5. 继承关系的初始化顺序

父类属性-》父类构造方法-》子类属性-》子类构造方法

如:Test1.java

public class Test {
public static void main(String[] args){
Dog dog1=new Dog();//1)实例化子类对象,默认会先执行父类的无参数构造,再执行子类的无参数构造

dog1.print();

         /*2)实例化子类的有参数构造时,使用super(参数)重复调用父类中的有参数构造;
默认直接调用父类中的有参数构造,不会调用父类中的无参数构造。*/
Dog dog2=new Dog("lucky",100,99,"萨摩耶");

dog2.print();

}

}

输出结果为:


由dog1的结果可见:先调用父类构造方法,后调用子类构造方法。


6. 方法重写

Pet的print()只能打印公共信息,所以需在子类中进行修改,

由2 4)-- Penguin的print()重写Pet的print(),较之 2  3)--Dog的print()更为简洁

与重载比较:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值