一.继承概述,使用继承的好处

什么是继承?

  • Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系。public class  子类   extends  父类 { }
  • 子类也叫派生类,父类也叫基类或者超类。
  • 作用:当子类继承父类后,就可以直接使用父类公共的属性和方法了。
  • Java中子类更强大

使用继承的好处:

  • 多个子类的相同代码可以放到父类中,可以提高代码的复用性,减少代码冗余,增强类的功能扩展性。

 把相同的属性和行为抽离出来,可以降低重复代码的书写!

package com.gch.d5_extends;/**人类:父类*/
public class People {public void run(){System.out.println("人会跑~~~");}
}
package com.gch.d5_extends;/**学生类:子类*/
public class Student extends People{}
package com.gch.d5_extends;public class Test {public static void main(String[] args) {// 目标:认识继承这种关系,搞清楚使用继承的好处Student s = new Student();s.run();}
}

二.继承的设计规范,内存运行原理

继承的设计规范:

  • 子类们相同特征(共同属性,共同方法)放在父类中定义,子类独有的属性和行为应该定义在子类自己里面。

为什么?

  • 如果子类的独有属性、行为定义在父类中,会导致其它子类也会得到这些属性和行为,这不符合面向对象逻辑。
  • 对象创建出来,里面的成员变量都是默认值。
  • 继承后,子类对象在堆内存中的内存原理:创建子类对象它对外是一个对象,创建子类对象在堆内存中,对内是两个空间:父类空间(super)和子类空间(this)。

package com.gch.d6_extends_test;/**父类*/
public class People {private String name;private int age;/**查看课表*/public void queryCourse(){System.out.println(name + "在查看课表~~~");}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
package com.gch.d6_extends_test;/**子类*/
public class Student extends People{/**独有的行为:填写反馈信息*/public void writeInfo(){System.out.println(getName() + "在填写反馈信息!");}}
package com.gch.d6_extends_test;public class Test {public static void main(String[] args) {// 目标:理解继承的设计思想Student s = new Student();s.setName("小明"); // 使用父类的s.setAge(20); // 使用父类的System.out.println(s.getName()); // 使用父类的System.out.println(s.getAge()); // 使用父类的s.queryCourse(); // 使用父类的s.writeInfo();}
}

三.继承的特点

  1. 子类可以继承父类的属性和方法,但是子类不能继承父类的构造器。
  2. Java是单继承模式:一个类只能继承一个直接父类。
  3. Java不支持多继承(子类不能同时继承多个父类),但是支持多层次继承。
  4. Java中所有的类都是Object类的子类。
  5. Object特点:Java中所有类,要么直接继承了Object,要么默认继承了Object,要么间接继承了Object,Object是祖宗类。Object对象,所有的类都继承了对象,万物皆对象。
  1. 子类是否可以继承父类的构造器?
  • 子类不可以继承父类的构造器,子类有自己的构造器,父类构造器用于初始化父类对象。
  1. 子类是否可以继承父类的私有成员?
  • 子类可以继承父类的私有成员,只是不能直接访问。
  1. 子类是否可以继承父类的静态成员?
  • 子类不能继承父类的静态成员,只是共享,共享并非继承,因为静态成员在内存中只存储一份,归属于当前类,只有一份谈什么继承,父类的静态成员依然是属于父类本身,它并没有过继到子类对象,继承是真正要在自己的对象中得到这个东西,它只是给子类共享去访问的,子类可以直接使用父类的静态成员。
  • 子类可以直接用子类名访问父类的静态成员。

package com.gch.d7_extends_feature;public class Test {public static void main(String[] args) {// 目标:理解继承的特点// 1.子类不能继承父类的构造器// 2.子类是否可以继承父类的私有成员?  子类是可以继承父类私有成员的,只是不能直接访问Tiger t = new Tiger();
//        t.eat(); 直接报错,子类不能访问使父类的私有成员// 3.子类是否可以继承父类的静态成员? 我认为不算继承,只是共享的System.out.println(Tiger.location); // 子类可以直接使用父类的静态成员(父类给子类共享使用)}
}class Animal{private void eat(){System.out.println("动物要吃东西~~~");}public static String location = "动物园";
}class Tiger extends Animal{}

四.继承后:成员变量,成员方法的访问特点

package com.gch.d8_extends_field_method;public class Test {public static void main(String[] args) {// 目标:理解继承后成员的访问特点:就近原则Dog d = new Dog();d.run(); // 子类的d.lookDoor(); // 子类的d.showName(); // 子类的}
}class Animal{public String name = "动物名";public void run(){System.out.println("动物可以跑~~~");}
}class Dog extends Animal{public String name = "狗名";public void lookDoor(){System.out.println("狗可以看门~~~");}public void showName(){String name = "局部名";System.out.println(name); // 局部名System.out.println(this.name); // 当前子类对象的name:狗名System.out.println(super.name); // 当前类的父类对象的name:动物名run(); // 子类的runsuper.run(); // 找父类的方法}public void run(){System.out.println("狗跑的贼快~~~");}
}

五.继承后:方法重写

什么是方法重写?

  • 在继承体系中,子类出现了和父类中一摸一样的方法声明,我们就称子类这个方法是重写的方法。

方法重写的应用场景

  • 当子类需要父类功能,但父类的该功能不完全满足自己的需求时,子类就可以重写父类中的方法。

@Override重写校验注解

  • @Override是放在重写后的方法上,作为重写是否正确的校验注解。
  • @Override注解可以校验重写是否正确,同时可读性好。
  • 加上该注解后如果重写错误,编译阶段会出现错误提示。
  • 建议重写方法都加@Override注解,代码安全,优雅!

方法重写注意事项和要求

  • 重写方法名称、形参列表必须与被重写方法的名称和参数列表一致。
  • 私有方法不能被重写。
  • 子类重写父类方法时,访问权限必须大于等于父类( private < friendly/default(缺省) < protected < public )。
  • 子类不能重写父类的静态方法,如果重写会报错的。

package com.gch.d9_extends_override;public class Test {public static void main(String[] args) {// 目标:认识方法重写NewPhone hw = new NewPhone();hw.call();hw.sendMessage();}
}/**新手机:子类*/
class NewPhone extends Phone{// 重写的方法  加上@就是一个注解@Override // 重写校验注解,加上之后,这个方法必须是正确重写的,这样更安全  2.提高程序的可读性,代码优雅// 注意:重写方法的名称和形参列表必须与被重写的方法一摸一样。// 私有方法不能被重写// 子类重写父类方法时,访问权限必须大于等于父类(private < friendly(缺省) < protected < public)// 子类不能重写父类的静态方法,如果重写会报错的public void call(){ // 申明不变,重新实现super.call(); // 保留父类原有的功能:调用父类的功能System.out.println("开始视频通话~");}// 重写的方法@Overridepublic void sendMessage(){super.sendMessage();System.out.println("发送有趣的图片~");}// 注意:静态方法不能被子类重写
//    @Override // 直接报错,父类的静态方法不能被重写
//    public static void test(){
//    }
}/**旧手机:父类*/
class Phone{public void call(){System.out.println("打电话~");}public void sendMessage(){System.out.println("发短信~");}// 父类的静态方法,属于父类本身,是不能过继到子类对象的public static void test(){}
}

六.继承后,子类构造器的特点

子类继承父类后构造器的特点:

  • 子类中所有的构造器默认都会先访问父类中的无参构造器,再执行自己的构造器(先有爸爸,才有儿子,实质上先创建的是父类对象,然后再创建子类对象)。

为什么?

  • 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
  • 子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。

如何调用父类构造器?

  • 子类构造器的第一行语句默认都是:super(),访问父类的无参构造器,不写也存在。
package com.gch.d10_extends_constructor;public class Test {public static void main(String[] args) {// 目标:认识继承后子类构造器的特点// 子类中所有的构造器默认都会先访问父类中无参的构造器,再执行自己Dog d1 = new Dog(); // 调子类的无参构造器System.out.println(d1);System.out.println("--------");Dog d2 = new Dog("旺财"); // 调子类的有参构造器System.out.println(d2);}
}/**Animal:父类*/
class Animal{// 无参构造器public Animal(){System.out.println("父类Animal无参构造器被执行~~~");}
}/**Dog:子类*/
class Dog extends Animal{public Dog(){super(); // 写不写都有,默认调用父类的无参构造器System.out.println("子类Dog无参构造器被执行~");}public Dog(String name){super(); // 写不写都有,默认调用父类的无参构造器System.out.println("子类Dog有参数构造器被执行~");}
}

七.继承后:子类构造器访问父类有参构造器

super(参数1,参数2...)调用父类有参构造器的作用:

  • 初始化继承自父类的数据。

如果父类中没有无参构造器,只有有参构造器,会出现什么现象?

  • 会报错,因为子类会默认调用父类的无参构造器。

如何解决?

  • 在子类的构造器中通过书写super(参数1,参数2..),手动调用父类的有参构造器。
  • 或者在父类中重新定义一个无参构造器。
package com.gch.d11_extends_constructor;public class People {private String name;private int age;// 无参构造器public People() {}// 有参构造器public People(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
package com.gch.d11_extends_constructor;public class Teacher extends People{public Teacher(){}public Teacher(String name,int age){// 调用父类的有参数构造器:初始化继承自父类的数据super(name,age);}
}
package com.gch.d11_extends_constructor;public class Test {public static void main(String[] args) {// 目标:学习子类构造器如何去访问父类有参数构造器,还要清楚其作用Teacher t = new Teacher("小明",20);
//        t.setName("小明");
//        t.setAge(20);System.out.println(t.getName()); // 小明System.out.println(t.getAge()); // 20}
}

八.this、super使用总结

this(....)和super(....)使用注意点:

  • 子类通过this(....)去调用本类的其他构造器,本类的其他构造器会通过super去手动调用父类的构造器,最终还是会调用父类构造器的(因为子类构造器会默认调用父类的无参构造器)。
  • 注意:this(....)和super(....)都只能放在构造器的第一行,所以二者不能共存在同一个构造器中。

package com.gch.d12_this;public class Student {private String name;private String schoolName;// 无参构造器public Student() {}/**如果学生不填写学校,默认这个对象的学校是黑马*/public Student(String name){
//        System.out.println(); 报错,this()和super()都只能放在构造器的第一行// 借用本类兄弟构造器this(name,"黑马");}// 有参构造器public Student(String name, String schoolName) {//   super(); // 必须先初始化父类,再初始化自己this.name = name;this.schoolName = schoolName;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSchoolName() {return schoolName;}public void setSchoolName(String schoolName) {this.schoolName = schoolName;}
}
package com.gch.d12_this;public class Test {public static void main(String[] args) {// 目标:理解this(...)的作用,子类通过this(...)去调用本类的其他构造器Student s1 = new Student("张三","尚硅谷");System.out.println(s1.getName()); // 张三System.out.println(s1.getSchoolName()); // 尚硅谷/**如果学生不填写学校,默认这个学生的学校是黑马*/Student s2 = new Student("李四");System.out.println(s2.getName()); // 李四System.out.println(s2.getSchoolName()); //黑马}
}

面向对象三大特征之二:继承相关推荐

  1. 【JavaSe】面向对象篇(五) 三大特征之二继承

    JavaSe·面向对象篇(五) 三大特征之二继承 1. 面向对象三大特质之继承 1.1 由来 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那 ...

  2. 【职坐标】java面向对象三大特性(二)——继承详解

    [职坐标]java面向对象三大特性(二)--继承详解 a) 什么是继承? i. 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可 b) ...

  3. C#面向对象三大特性之二:继承

    面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低了耦合. 但在实际应用中,有好多对象具有相同或者相似的属性,比如有一个对象 果树 ...

  4. c++面向对象三大特征封装、继承和多态知识总结

    面向对象三大特征:封装,继承,多态: 一.封装:该公开的就公开话,该私有的就隐藏掉,主要是由public,private实现:作用是便于分工和分模块,防止不必要的扩展: 二.继承:就是一种传承,可以把 ...

  5. Python OOP:面向对象三大特性(封装、继承、多态)、类属性和实例属性、类方法@classmethod、静态方法@staticmethod、函数和类callable、__call__

    一.面向对象三大特性 二.多态 定义:多态是⼀种使⽤对象的⽅式,⼦类重写⽗类⽅法,调⽤不同⼦类对象的相同⽗类⽅法,可以产⽣不同的执⾏结果. 一个父类,可以继承给多个子类,每个不同的子类可以创建多个对象 ...

  6. 面向对象第七章,内存的管理,面向对象三大特征封装、继承、多态

    ###1.内存管理:由JVM来管理的------了解 1)堆: 1.1)存储new出来的对象(包括实例变量) 1.2)垃圾:没有任何引用指向的对象 垃圾回收器(GC)不定时到内存中清扫垃圾, 回收过程 ...

  7. 面向对象三大特性之一:继承(C++)

    目录 继承的定义 基类对象和派生类对象的赋值转换 继承中的作用域 派生类与基类中成员的关系 派生类与默认成员函数的关系 继承与友元的关系 继承与静态成员的关系 面向对象的三大特性:封装,继承,多态. ...

  8. 2021-08-14c++面向对象的三大特性之二——继承

    继承 同种动物有自己的共性,又有自己的个性 有一些类具有同样的共性,但同时又有自己的个性,这时候就需要继承一些类的特性来减少重复的代码量. 继承可以减少重复的代码 class A :pubilc B; ...

  9. Java面向对象三大特性(封装、继承、多态)

    文章目录 前言 一.封装 1. 封装的概念 2. private实现封装 3. getter和setter方法 4.封装的好处 二.继承 1. 继承的概念 2. extends实现继承 3. supe ...

最新文章

  1. LeetCode简单题之检查是否所有字符出现次数相同
  2. 汇编语言学习-寄存器(内存访问)
  3. 【控制】《自动控制原理》胡寿松老师-第9章-线性系统的状态空间分析与综合
  4. 【数学建模】MATLAB从入门到精通:Logistic模型原理及应用案例(附MATLAB代码)
  5. 百度内部培训PPT流出:数据分析的道与术
  6. AT3968-[AGC025E] Walking on a Tree【构造】
  7. C++实现字符串的拼接
  8. testmeshpro合批_TextMesh Pro Emoji Align With Text(表情和文字对齐)
  9. C# Weifenluo教程
  10. 数据结构与算法(转)
  11. Redis 集群(学习笔记十)
  12. 微型计算机系统评课,微机课评课稿.doc
  13. Vue项目设置局域网链接访问
  14. 【2021自我知识蒸馏】Extracting knowledge from features with multilevel abstraction
  15. 制作rime配色的fcitx皮肤
  16. 鸿蒙系统2.0的编译
  17. 【unity】遇到Multiple precompiled assemblies with the same name的解决方案
  18. 【报告分享】2021B站创作者生态报告-哔哩哔哩(附下载)
  19. 计算机控制面板中无法删除程序,电脑在控制面板中无法打开添加或删除程序
  20. rtthread开发笔记心得

热门文章

  1. 在Jackson中使用树模型节点(JsonNode)详解
  2. 雷柏鼠标滚动键无法滚动网页
  3. 如何申请免费证书(HTTPS)
  4. material studio菜单栏及工具介绍
  5. MySQL讲义第17讲——索引(INDEX)的删除
  6. 提升用户留存率的四大策略
  7. Fashion-Gen: The Generative Fashion Dataset and Challenge 论文解读数据集介绍
  8. ftp服务器搭建需要什么硬件,FTP 服务器搭建与配置
  9. BZOJ2725 [Violet 6]故乡的梦
  10. 弘辽科技:如何矫正人群标签,提高访客精准度?