类的继承性

本篇学习面向对象语言的第二特性——继承性。

1 .为什么需要继承

我们来举个例子:我们知道动物有很多种,是一个比较大的概念。在动物的种类中,我们熟悉的有猫(Cat)、狗(Dog)等动物,它们都有动物的一般特征(比如能够吃东西,能够发出声音),不过又在细节上有区别(不同动物的吃的不同,叫声不一样)。在Java语言中实现Cat和Dog等类的时候,就需要继承Animal这个类。继承之后Cat、Dog等具体动物类就是子类,Animal类就是父类。

 使用继承不仅大大的减少了代码量,也使得代码结构更加清晰可见,增加代码的复用性。 

4998a1de9e53461095aa7dea538fdb04.jpeg  

2.继承的概念

继承表示两个类之间的一种关系,是已有类创建新类的机制。子类不仅可以从父类中继承成员变量和方法,还可以重新定义他们以及扩充新的内容。子类也叫派生类,父类也叫基类或者超类。继承主要解决的问题是共性的抽取,实现代码的复用。

172e3b05d18a4868bb03630971690647.jpeg

3. 继承的语法 

  修饰符 class 子类 extends 父类 {

     }

代码示例:

class Animal {
    String name;
    int age;
    public void eat() {
        System.out.println("正在吃饭");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println(name + "汪汪汪~");
    }
}

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        System.out.println(dog.name+dog.age);
//Dog类中并没有定义任何成员变量,name和age属性肯定是从父类Animal中继承而来的
        dog.bark();
        dog.eat();
//Dog访问的eat()和sleep()方法也是从Animal中继承而来的
    }
}

 注意:
1. 子类会将父类中的成员变量或者成员方法继承到子类中了
2. 子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了

4 .父类成员访问

在继承体系中,子类将父类中的方法和字段继承下来了,那在子类中能否直接访问父类中继承下来的成员呢?

4.1 子类中访问父类的成员变量

在子类方法中或者通过子类对象访问成员时:
(1)如果访问的成员变量子类中有,优先访问子类的成员变量。
(2)如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
(3)如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。 

4.2 子类中访问父类的成员方法

(1)通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到则访问,否则编译报错。
(2)通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错; 

问题:如果子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢?

5、final关键字 

final关键字可以用来修饰变量、成员方法及类。

1、修饰变量或字段,表示常量(不能被修改)。

2、修饰类,表示此类不能被继承。

3、修饰方法,表示不能被重写。

6、super关键字  

Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。 

 

class Animal {
    String name="父类";
    int age=99;
    public void eat() {
        System.out.println("父类eat方法");
    }
}

class Dog extends Animal {
    String name="子类";
    public void eat() {
        System.out.println("子类eat方法");
    }
    public void  method(){
       super.eat();
    }
}

【注意事项】
1. 只能在非静态方法中使用
2. 在子类方法中,访问父类的成员变量和方法。 

 7、构造方法的继承

遵行原则:

1、子类未定义构造方法时,创建对象时将无条件的无参调用父类构造方法。

2、对于父类的含参构造方法,子类需要在自己构造方法中使用关键字super来调用它,语法:super(参数)  。但是,super关键字必须在子类构造方法中的第一个可执行语句。

3、若没有使用super关键字,那么在创建对象时,则先执行父类的无参构造方法,再执行子类自己定义的构造方法。

4、super(...)只能在子类构造方法中出现一次,并且不能和this同时出现。

8、super和this的比较

super和this都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,那他们之间有什么区别呢?

【相同点】
1. 都是Java中的关键字
2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
【不同点】
1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现
4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

9、继承上的执行顺序

示例代码如下:

 
  1. class Animal {

  2. String name;

  3. int age;

  4.  
  5. public Animal(String name, int age) {

  6. this.name = name;

  7. this.age = age;

  8. System.out.println("父类构造方法");

  9. }

  10. {

  11. System.out.println("父类实例代码块");

  12. }

  13. static {

  14. System.out.println("父类静态代码块");

  15. }

  16. }

  17. class Dog extends Animal{

  18. public Dog(String name, int age) {

  19. super(name, age);

  20. System.out.println("子类构造方法");

  21. }

  22. {

  23. System.out.println("子类实例代码块");

  24. }

  25. static {

  26. System.out.println("子类静态代码块");

  27. }

  28. }

  29. public class Test {

  30. public static void main(String[] args) {

  31. Dog dog =new Dog("旺财",3);

  32. System.out.println("———————————————");

  33. Dog dog1=new Dog("小花",5);

  34. }

  35. }

8d2d95ca4f094fb4ab2925494e137fc6.png 

 从结果可以得出结论:继承上的执行顺序是:

1、父类静态代码块优先于子类静态代码块执行,且是最早执行
2、父类实例代码块和父类构造方法紧接着执行
3、子类的实例代码块和子类构造方法紧接着再执行
4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行 

 本篇类的继承性学习到这里是不是收获满满呢,如果觉得文章写的不错,留下小红心再走吧。后面一篇学习多态,关注我,不要错过哦!~

java开发语言

autho.png

“技术故障”背刺巴菲特,金融大模型到底靠不靠谱?pointRight.png

发布于2024-06-19著作权归作者所有

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值