网站首页 > java教程 正文
继承是Java面向对象的一个最为显著的特性。继承是从已有的类中派生出新的类,新的类能够吸收已有类的数据属性和方法,并且能够具有自己的能力。Java中的继承是使用已有类定义新类的一种技术,新类的定义能够增加新的数据以及新的功能。但是Java只能实现单继承。但是,一个类可以实现过个接口。
在Java实现继承的时候,我们使用的是extends关键字,继承一个已有的类,这也被叫做泛化。Java中被继承的类叫做父类,新的类叫做子类。就像父亲与儿子一样,你DNA中继承了来自父亲的染色体,但是你也拥有你自己多于父亲的染色体。
继承的语法:
继承语法
上面就是大概继承的相关概念。
下面,我们来说一说继承的实例化规则:子类的实例化是先实例化父类,就如没有你的父亲也就没有你一样(所以要学会感恩),然后再实例化子类。再实例化父类的时候,会主动调用父类的构造器,等父类的构造器运行完毕之后才进行子类构造器的调用。因为这样的实例化过程,对于初学者来说,可能会出现一点小的错误。下面,我举一个简单的例子来说明一下:
首先定义一个父类Father:
父类Father
可以看到,Father存在一个私有属性name,然后有一个普通的方法,打印的是这个属性;然后构造器中调用了这个方法。
然后,我们再定义一个Son类:
子类Son
Son继承自Father,然后也有一个相同的打印方法,同时构造器也是调用了这个方法。
然后,我们来进行一段小的测试代码:
实例化对象
大家可以猜测一下,最后的结果是什么。或许很多初学者会给出123,998都输出的答案,哈哈,恭喜你,答错了。真实运行出来的答案是这样的:
结果
是不是很奇怪,我当时也是很懵逼的,但是理解了之后就觉得自己好蠢了。下面让我来说一说自己的拙见:
正如我前面所说的,实例化子类对象的时候会首先调用父类的构造器,当父类的构造器执行完毕之后再来执行子类的构造器。
说一下实例化的过程:
1.如果一个类存在父类,那么将先初始化父类的静态代码块,当然包括静态对象,然后初始化子类的静态变量。
2.初始化父类的非静态代码,包括非静态的变量等(父类的属性其实已经被初始化了,我认为)
3.执行父类的构造函数
4.初始化子类的非静态代码
5.执行子类的构造函数
对于这段代码,很多掌握不牢固的初学者会认为看起来是将Son向上追溯变成了Father类对象,然后就应该进行Father类里面的操作(我当时也是这么想的)。其实不是这样的,表面上看起来是追溯成了父类对象,其实new内存中存放的还是一个子类的对象,所以调用的还应该是子类的方法。与此同时,子类重写了父类的方法,也即是父类的方法是在子类中来实现的,那么,调用的时候还是应该调用子类中的方法。如果没有重写父类的方法,那么还是将从父类中进行调用。等一下我将会附上没有重写时的代码。
没有重写的代码:
没有重写,新的方法
没有重写的结果
如果你实在是想调用到父类对的函数,那么只能使用super关键字进行调用。
使用super关键字:
super调用
super结果
然后就能打印出父类的属性了。也就验证了我上面的猜想,实例化时就已经被初始化了(我也不知道说的对不对,不对的地方请指正!)
好了,今天就到这里,以后想到了接着来补充。
猜你喜欢
- 2024-10-03 Java中的继承关系(java中的继承关系是)
- 2024-10-03 Java面向对象之继承(java面向对象继承例题)
- 2024-10-03 「Java入门」十八 面向对象的三大特征之一-继承
- 2024-10-03 [Java基础]09.继承(java基础案例教程第二版)
- 2024-10-03 Java中的继承、封装、多态 #Java开发
- 2024-10-03 Java中的继承与组合(java中继承的概念以及使用继承的好处)
- 2024-10-03 《极简Java新手编程之道》8.1.1 Java语言中实现继承
- 2024-10-03 Java:类与继承(java类与继承抽象类)
- 2024-10-03 Java基础——面对对象-继承(面对对象的特征有哪些方面java基本数据类型有哪些)
- 2024-10-03 你真的熟悉Java中的继承与多态?给你几分钟能回答上来?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)