JAVA面向对象之继承 super入门解析
1 继承
1.1概念
继承是面向对象最显著的一个特征 继承是从已有的类中派生出新的类,新类能吸收已有类的数据属性和行为,并扩展新的能力. Java继承是会用已存在的类的定义作为基础建立新类的技术 新类的定义可以增加新的数据或者新的功能,也可以使用父类的功能,但不能选择性的继承父类(超类/基类) 这种继承使得复用以前的代码非常容易,能够大大的缩短开发的周期,降低开发费用.
1.2 特点
- 使用extends关键字来表示继承关系
- 相当于子类把父类的功能复制了一份
- Java只支持单继承
- 继承可以传递(爷爷/儿子/孙子这样的关系)
- 父类的私有成员由于私有限制访问,所以子类不能使用父类的私有资源
- 继承多用于功能的修改,子类可以在拥有父类功能的同时,进行功能拓展
- 像是is a的关系
1.3 练习:继承入门案例
创建包: cn.tedu.oop2
创建类: TestExtends.java
package cn.tedu.oop2;
public class TestExtends {
public static void main(String[] args) {
//5.分别创建3个类的对象
Animal a = new Animal();
Cat c = new Cat();
MiaoMiao m = new MiaoMiao();
//6.利用对象调用方法进行测试
a.eat();//爷爷类使用自己的方法
c.eat();//爸爸类可以使用从爷爷类中继承过来的方法
m.eat();//孙子类也可以使用从爷爷类中继承过来的方法
}
}
//1.创建小动物类--爷爷类
class Animal{
//4.添加爷爷类的普通方法
public void eat(){
System.out.println("小动物Animal吃啥都行~");
}
}
//2.创建小猫类--爸爸类
class Cat extends Animal{
//7.定义爸爸类中的属性
int a = 10;//普通属性
private int b = 100;//私有属性
}
//3.创建MiaoMiao类--孙子类
class MiaoMiao extends Cat{
//8.定义孙子类的方法
public void studyJava(){
System.out.println("正在学Java");
System.out.println(a);
//System.out.println(b);//不可以,私有资源被限制访问
}
}
2 super
我们可以把super看作是父类的对象:Father super = new Father();
1.当父类的成员变量与子类的变量同名时,使用super指定父类的成员变量
2.使用super在子类构造方法的第一行调用父类构造方法的功能
super();–调用的是父类的无参构造
super(参数);–调用的是父类对应参数的构造方法
注意:在构造方法里,出现的调用位置必须是第一行
3 继承的用法
3.1 练习:super之继承中成员变量使用
创建包: cn.tedu.oopextends
创建类: TestExtends1.java
package cn.tedu.oop2;
public class ExtendsDemo1 {
public static void main(String[] args) {
//7.创建子类的匿名对象,调用study()
new Son().study();
}
}
//1.创建父类
class Father{
//3.创建父类的成员变量
int sum = 1;
int count = 2;
}
//2.创建子类
class Son extends Father{
//4.创建子类的成员变量
int sum = 10;
//5.创建子类的普通方法
public void study(){
System.out.println("goog good study , day day up");
//6.创建子类的局部变量
int sum = 100;
//8.打印子类的局部变量sum
System.out.println(sum);//100
//9.打印子类的成员变量sum
System.out.println(this.sum);//10
//10.打印父类的成员变量sum
System.out.println(super.sum);//1
System.out.println(count);
}
}
3.2 练习:super之继承中构造方法的使用
创建包: cn.tedu.oop2
创建类: ExtendsDemo2.java
package cn.tedu.oop2;
public class ExtendsDemo2 {
public static void main(String[] args) {
//6.1通过父类的无参构造创建父类对象
//Father2 f = new Father2();
//6.2通过父类的含参构造创建父类对象
//Father2 f2 = new Father2("哈哈哈");
//7.创建子类对象
Son2 s = new Son2();
}
}
//1.创建父类
class Father2{
//3.创建父类的无参构造
// public Father2(){
// System.out.println("我是父类的无参构造");
// }
//4.创建父类的含参构造
public Father2(String s){
System.out.println("我是父类的含参构造"+s);
}
}
//2.创建子类
class Son2 extends Father2{
//5.创建子类的无参构造
public Son2(){
//super();//调用父类的无参构造
super("你好~");
System.out.println("我是子类的无参构造");
}
}
4 方法重写Override
继承以后,子类就拥有了父类的功能
在子类中,可以添加子类特有的功能,也可以修改父类的原有功能
子类中方法的签名与父类完全一样时,会发生覆盖/复写的现象
注意: 父类的私有方法不能被重写
重写的要求:两同两小一大
两同:方法名 参数列表 要完全一致
两小:
子类返回值类型小于等于父类的返回值类型(注意此处说的是继承关系,不是值大小)
子类抛出异常小于等于父类方法抛出异常
一大:子类方法的修饰符权限要大于等于父类被重写方法的修饰符权限
4.1 练习:继承中成员方法的使用
创建包: cn.tedu.oop2
创建类: ExtendsDemo3.java
package cn.tedu.oop2;
public class ExtendsDemo3 {
public static void main(String[] args) {
//4.创建对象进行测试
Father f = new Father();
Son s = new Son();
f.eat();
s.eat();
f.play();
s.play();
}
}
//1.创建父类
class Father{
//3.定义父类中的普通方法
public void eat(){
System.out.println("爸爸爱吃肉");
}
public void play(){
System.out.println("爸爸爱放风筝");
}
}
//2.创建子类
class Son extends Father{
//5.如果子类对父类的方法不满意,可以重写父类的方法
@Override //注解,用来加在方法上,表示这是一个重写的方法
public void eat(){
System.out.println("儿子爱吃蔬菜");
}
@Override
public void play(){
System.out.println("儿子爱玩游戏");
}
}
5 拓展
5.1 继承的好处与坏处
继承的好处
提高了代码的复用性(多个类相同的成员可以放在同一个类中)
提高了代码的维护性(如果方法的代码需要修改,只修改一处即可)
继承的坏处
继承让类与类建立了关系,类的耦合性增强
当父类发生变化时,子类实现也不得不跟着变化,削弱了子类的独立性
5.2 this与super的区别
this: 代表本类对象的引用
我们可以把this看作是Cat this = new Cat();
super:代表父类存储空间的标识,可以理解成父类对象的引用
可以把super看作是Father super = new Father();
this关键字指向调用该方法的对象
一般我们是在当前类中使用this关键字
所以我们常说this代表本类对象的引用
注意:super的使用前提是继承,没有父子类关系,就没有super
注意:this调用构造方法或者super调用构造方法,都必须出现在构造方法的第一行
注意:如果父类没有无参构造,需要手动在子类构造方法的第一行调用其他的含参构造
拓展:如果子类重写了父类的方法以后,可以使用super.方法名(参数列表)来调用
5.3 重载Overload与重写Override的区别
重载:在一个类中的现象:同一个类中,存在方法名相同,参数列表不同的方法
重写:是指建立了继承关系以后,子类对父类的方法不满意,可以重写,遵循两同两小一大原则
重载的意义:是为了外界调用方法时方便,不管传入什么样的参数,都可以匹配到对应的同名方法
重写的意义:在不修改源码的情况下,进行功能的修改与拓展(OCP原则:面向修改关闭,面向拓展开放)
到此这篇关于JAVA面向对象之继承 super入门解析的文章就介绍到这了,更多相关JAVA 继承 super内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341