继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

生活中的继承形如:

例如兔子和老虎都会睡觉、吃东西(公共的方法),只不过吃的东西(即属性)不一样、吃的方式(即方法)也会不同。
如果不使用继承,那么在兔子类、老虎类里我们需要分别定义各自的eat方法以及food属性,这无疑增加重复的代码,导致代码的复用性差。
但是有了继承,我们可以通过子类继承父类的方式,使子类能够拥有父类非private的属性和方法。

继承的好处:

  • 提高了代码的复用性。
  • 让类和类之间产生了关系,给第三个特征多态提供了前提。

继承的注意点:

  • java支持单继承(一个子类只能有一个父类);Java支持多层继承(A继承B,B继承C,C继承D);不直接支持多继承(一个子类继承多个父类),对C++中的多继承机制进行了改良。可以用如下图片表示。
  • 子类与父类成员变量相同时,如果需要获取父类的成员变量,要用super调用父类。super代表的是一个父类空间。
  • 子类方法重写父类方法时,子类权限必须大于等于父类的方法权限。
  • 静态方法只能重写静态方法,或者被静态重写。(这个时候主要依赖于类,而不再是对象了)

代码

  • 父类(Animal)
    父类属性用到了封装,所以子类如果想使用父类属性只能用父类中的get方法。(super好像不行,待测试)
class Animal{//封装private String name;private String food;//初始化构造函数public Animal() {};//不带参public Animal(String name, String food) {//带参构造函数this.setName(name);this.setFood(food);}void eat() {System.out.println(getName()+" is eating "+getFood());}void sleep() {System.out.println(getName()+" is sleeping.");}//静态方法只能重写静态或者被静态重写。static void show() {System.out.println("叫");}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getFood() {return food;}public void setFood(String food) {this.food = food;}
}
  • 子类(Tiger)
    Tiger类用到了重写,那么什么时候需要重写?
    答:当需要对父类中的某一功能方法进行扩展时,就需要用到重写操作。所以,重写操作一定会保证子类和父类的该方法名字相同、参数的个数与类型相同、返回值也一样,这才是正确的重写操作。

重写和重载的区别也十分重要,菜鸟教程官网的介绍很详细了,这里直接引用。

class Tiger extends Animal{public Tiger() {};public Tiger(String name, String food) {this.setName(name);this.setFood(food);  }//重写老虎的eat()方法,因为我们需要对子类方法进行一个扩展。public void eat() {System.out.print("We gotta make a hunt firstly! Watch out! ");System.out.println(getName()+" killed "+getFood()+" and ate it.");}//测试super关键字对父类的引用public void superTest() {super.eat();}
}

主函数里测试:

 Tiger tiger1 = new Tiger("tiger1", "chicken");tiger1.eat();tiger1.superTest();

  • 子类(Rabit)
    Rabit类和Tiger类在继承的时候用了两种不同的写法,Rabit类显得更简洁。
class Rabit extends Animal{public Rabit() {};public Rabit(String name, String food) {super(name, food);}
}

主函数里测试:

 Animal animal = new Animal("animal", "food");animal.eat();Rabit rabit1 = new Rabit("rabit1", "carrot");rabit1.eat();Rabit rabit2 = new Rabit();rabit2.setName("rabit2");rabit2.setFood("grass");rabit2.eat();

继承中子类、父类构造函数的特点

在子类构造对象时,会发现访问子类构造函数时,父类构造函数也会被访问。
原因:子类的构造函数第一行有一个默认的隐式语句。super();

public class InheritanceDemo {public static void main(String[] args) {// TODO Auto-generated method stubnew Zi();}
}class Fu{Fu(){System.out.println("A, Fu Run");}
}class Zi extends Fu{Zi(){//子类的构造函数第一行有一个默认的隐式语句。super()//super();System.out.println("Zi Run");}
}

  • 那如果执行子类中的带参构造函数,是否会调用父类的不带参构造函数呢?
    运行结果显示,这种情况依然会执行父类的不带参构造函数。
public class InheritanceDemo {public static void main(String[] args) {// TODO Auto-generated method stubnew Zi(4);}
}class Fu{Fu(int x){System.out.println("Fu Run"+ x);}Fu(){System.out.println("Fu Run");}
}class Zi extends Fu{Zi(int x){//super(4);System.out.println("Zi Run"+ x);}Zi(){//子类的构造函数第一行有一个默认的隐式语句。super()//super();System.out.println("Zi Run");}
}

  • 那如果是执行子类的带参构造函数,如何调用父类中的带参构造函数?
    可以通过super(带参);来实现
class Zi extends Fu{Zi(int x){super(4);System.out.println("Zi Run"+ x);}Zi(){//子类的构造函数第一行有一个默认的隐式语句。super();//super();System.out.println("Zi Run");}
}

总结

子类的构造函数(不管是带参的还是不带参的)一旦被调用,都会调用父类的不带参构造函数。但是子类的带参构造函数被调用,不会引起父类的带参构造函数被调用,如果想,可以用super(带参)实现。

为什么子类实例化的时候要访问父类中的构造函数呢?

那是因为子类继承了父类,获取到了父类中内容(属性),所以在使用父类内容之前,要先看父类是如何对自己的内容进行初始化的。

注意:super语句必须要定义在子类构造函数的第一行,因为父类的初始化动作需要先完成。

Java继承思想(理解+代码)相关推荐

  1. Java继承个人的理解_我对java继承的理解

    关于java继承和多态的文章已经很多了,如果你对java的继承和多态已经有很好的理解,请绕过本变文章, 如果你对java的继承和多态不是很理解,还在找寻这方面的东西,那这篇文章可能对你有所帮助. 首先 ...

  2. 通过java理解linux,Java继承的理解

    继承: 1)概念 把多个类中相同的成员给提取出来定义到一个独立的类中.然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些内容.这个关系叫继承. 1.1)定义类时,通过"继承&quo ...

  3. java继承矩形例子代码_Java代码实现矩形覆盖实例

    Java代码实现矩形覆盖实例 题目 我们可以用2×1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2×1的小矩形无重叠地覆盖一个2×n的大矩形,总共有多少种方法? 程序核心思想 2*(n-1)的方块 ...

  4. 重新精读《Java 编程思想》系列之组合与继承

    Java 复用代码的两种方式组合与继承. 组合 组合只需将对象引用置于新类中即可. 比如我们有一个B类,它具有一个say方法,我们在A类中使用B类的方法,就是组合. public class B {p ...

  5. 谈谈java面向对象思想_对于Java面向对象思想的理解

    在Java中,除了8种基本数据类型.其他皆为对象! 面向对象主要有 三个基本特征:封装,继承,多态. 封装 主要概念是指:隐藏对象的属性和实现细节,仅对外暴露公共的访问方式.封装是面向对象最基本的特征 ...

  6. 《Java编程思想》学习笔记(一)——再度理解OOP

    实践是认识的来源和基础.是认识的动力.是检验其真理性的标准.工作一年后再回过头来看看,还是学生的时候对编程语言产生的各种疑问,突然间,好像有了那么点儿豁然开朗的感觉.但,真正的豁然开朗还是在品读了&l ...

  7. java 关注公众号没有调接口_深入理解Java继承、封装、多态的实现原理

    点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 作者:黄小斜 文章来源:微信公众号[Java技术江湖] 目录 从JVM结构开始谈多 ...

  8. Java编程思想学习(一)----对象导论中多态的理解

    1.1抽象过程 1)万物皆对象. 2)程序是对象的集合,他们通过发送消息来告知彼此所要求做的. 3)每个对象都有自己的由其他对象所构成的存储. 4)每个对象都拥有其类型. 5)某一特定类型的所有对象都 ...

  9. Java继承_深入理解Java继承、封装、多态的实现原理

    点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 作者:黄小斜 文章来源:微信公众号[Java技术江湖] 目录 从JVM结构开始谈多 ...

最新文章

  1. 科技部认定的独角兽名单来了!共164家
  2. php swiper 下拉刷新,SwipeRefreshLayout的使用(下拉刷新)
  3. ITK:建立一个Hello World程序
  4. python操作php文件,python怎么操作文件
  5. 为什么要使用反射机制
  6. LeetCode 2136. 全部开花的最早一天(贪心)
  7. 从零实现深度学习框架——常见运算的计算图
  8. 联想提取exe文件中的bios文件_3900不带X能干过99K吗?品牌机做视频渲染可以?联想刃7000P评测...
  9. 中国美女黑客攻击4G网络?详解
  10. ubuntu22.04运行qq音乐
  11. 初学SLAM二之BA当中的数学知识点
  12. 怎么压缩gif图大小,gif压缩到微信表情
  13. SQL16号统计1~15号数据,1号统计上月15~月底数据
  14. css样式 向下补白,CSS尺寸与补白属性-----margin和padding
  15. rabbitmq入门(四)Topics主题模式
  16. 最详细最简单:最大公因数求法、辗转相除法、更相减损法,入门ACM,杭电水题,算法递归,初级算法题一看就懂
  17. 读围城论方鸿渐与孙柔嘉的爱情
  18. XMD couldn't connect to remote target
  19. 电子和计算机工程密歇根大学,美国密歇根大学迪尔本校区电子与计算机工程系主任 Yi Lu Murphey教授来我校进行学术交流并作学术报告...
  20. 海信电视通过U盘安装应用

热门文章

  1. VUE+Nodejs 商城项目练习项目(前台购物)
  2. rimraf node_modules 删除报错 rimraf : 无法加载文件
  3. 前端追梦人响应式网页设计
  4. 多波段 “均值标准距”的计算
  5. 如何解决外边距重叠问题
  6. B站台湾大学郭彦甫|MATLAB 学习笔记|12 线性方程式和线性系统 Linear equations
  7. 穷人的语义处理工具箱之二:语义编辑距离
  8. 线性代数-MIT 18.06-5(b)
  9. 如何与低智商的人相处?
  10. Java工作流管理系统(activity6.0)