作者:季沐测试笔记

原文地址https://www.cnblogs.com/testero/p/15201615.html

博客主页https://www.cnblogs.com/testero

1. 继承

1.1 继承的实现

  • 继承的概念

    • 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法
  • 实现继承的格式

    • 继承通过extends实现
    • 格式:class 子类 extends 父类 { }
      • 举例:class Dog extends Animal { }
  • 继承带来的好处

    • 继承可以让类与类之间产生关系,子父类关系,产生子父类后,子类则可以使用父类中非私有的成员。
  • 示例代码

    public class Fu {
    public void show() {
    System.out.println("show方法被调用");
    }
    }
    public class Zi extends Fu {
    public void method() {
    System.out.println("method方法被调用");
    }
    }
    public class Demo {
    public static void main(String[] args) {
    //创建对象,调用方法
    Fu f = new Fu();
    f.show(); Zi z = new Zi();
    z.method();
    z.show();
    }
    }

1.2 继承的好处和弊端

  • 继承好处

    • 提高了代码的复用性(多个类相同的成员可以放到同一个类中)
    • 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
  • 继承弊端
    • 继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
  • 继承的应用场景:
    • 使用继承,需要考虑类与类之间是否存在is..a的关系,不能盲目使用继承

      • is..a的关系:谁是谁的一种,例如:老师和学生是人的一种,那人就是父类,学生和老师就是子类

2. 继承中的成员访问特点

2.1 继承中变量的访问特点

在子类方法中访问一个变量,采用的是就近原则。

  1. 子类局部范围找
  2. 子类成员范围找
  3. 父类成员范围找
  4. 如果都没有就报错(不考虑父亲的父亲…)
  • 示例代码

    class Fu {
    int num = 10;
    }
    class Zi {
    int num = 20;
    public void show(){
    int num = 30;
    System.out.println(num);
    }
    }
    public class Demo1 {
    public static void main(String[] args) {
    Zi z = new Zi();
    z.show(); // 输出show方法中的局部变量30
    }
    }

2.2 super

  • this&super关键字:

    • this:代表本类对象的引用
    • super:代表父类存储空间的标识(可以理解为父类对象引用)
  • this和super的使用分别
    • 成员变量:

      • this.成员变量 - 访问本类成员变量
      • super.成员变量 - 访问父类成员变量
    • 成员方法:
      • this.成员方法 - 访问本类成员方法
      • super.成员方法 - 访问父类成员方法
    • 构造方法:
      • this(…) - 访问本类构造方法
      • super(…) - 访问父类构造方法

2.3 继承中构造方法的访问特点

注意:子类中所有的构造方法默认都会访问父类中无参的构造方法

​ 子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认都是:super()

问题:如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?

1. 通过使用super关键字去显示的调用父类的带参构造方法
2. 在父类中自己提供一个无参构造方法

推荐方案:

​ 自己给出无参构造方法

2.4 继承中成员方法的访问特点

通过子类对象访问一个方法

  1. 子类成员范围找
  2. 父类成员范围找
  3. 如果都没有就报错(不考虑父亲的父亲…)

2.5 super内存图

  • 对象在堆内存中,会单独存在一块super区域,用来存放父类的数据

2.6 方法重写

  • 1、方法重写概念

    • 子类出现了和父类中一模一样的方法声明(方法名一样,参数列表也必须一样)
  • 2、方法重写的应用场景
    • 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
  • 3、Override注解
    • 用来检测当前的方法,是否是重写的方法,起到【校验】的作用

2.7 方法重写的注意事项

  • 方法重写的注意事项
  1. 私有方法不能被重写(父类私有成员子类是不能继承的)
  2. 子类方法访问权限不能更低(public > 默认 > 私有)
  • 示例代码
public class Fu {
private void show() {
System.out.println("Fu中show()方法被调用");
} void method() {
System.out.println("Fu中method()方法被调用");
}
} public class Zi extends Fu { /* 编译【出错】,子类不能重写父类私有的方法*/
@Override
private void show() {
System.out.println("Zi中show()方法被调用");
} /* 编译【出错】,子类重写父类方法的时候,访问权限需要大于等于父类 */
@Override
private void method() {
System.out.println("Zi中method()方法被调用");
} /* 编译【通过】,子类重写父类方法的时候,访问权限需要大于等于父类 */
@Override
public void method() {
System.out.println("Zi中method()方法被调用");
}
}

2.8. Java中继承的注意事项

  • Java中继承的注意事项

    1. Java中类只支持单继承,不支持多继承

      • 错误范例:class A extends B, C { }
    2. Java中类支持多层继承
  • 多层继承示例代码:

    public class Granddad {
    
        public void drink() {
    System.out.println("爷爷爱喝酒");
    } } public class Father extends Granddad { public void smoke() {
    System.out.println("爸爸爱抽烟");
    } } public class Mother { public void dance() {
    System.out.println("妈妈爱跳舞");
    } }
    public class Son extends Father {
    // 此时,Son类中就同时拥有drink方法以及smoke方法
    }

3. 继承练习

3.1 老师和学生

  • 需求:定义老师类和学生类,然后写代码测试;最后找到老师类和学生类当中的共性内容,抽取出一个父类,用继承的方式改写代码,并进行测试

  • 步骤:

    ①定义老师类(姓名,年龄,教书())

    ②定义学生类(姓名,年龄,学习())

    ③定义测试类,写代码测试

    ④共性抽取父类,定义人类(姓名,年龄)

    ⑤定义老师类,继承人类,并给出自己特有方法:教书()

    ⑥定义学生类,继承人类,并给出自己特有方法:学习()

    ⑦定义测试类,写代码测试

  • 示例代码:

    class Person {
    private String name;
    private int age; public Person() {
    } public Person(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;
    }
    } class Teacher extends Person { public Teacher() {} public Teacher(String name,int age) {
    super(name,age);
    } public void teach() {
    System.out.println("用爱成就每一位学员");
    } } class Student extends Person{
    public Student() {} public Student(String name, int age) {
    super(name,age);
    } public void study(){
    System.out.println("学生学习");
    } } class PersonDemo {
    public static void main(String[] args){
    //创建老师类对象并进行测试
    Teacher t1 = new Teacher();
    t1.setName("林青霞");
    t1.setAge(30);
    System.out.println(t1.getName() + "," + t1.getAge());
    t1.teach(); Teacher t2 = new Teacher("风清扬", 33);
    System.out.println(t2.getName() + "," + t2.getAge());
    t2.teach(); // 创建学生类对象测试
    Student s = new Student("张三",23);
    System.out.println(s.getName() + "," + s.getAge());
    s.study();
    }
    }

3.2 猫和狗

  • 需求:请采用继承的思想实现猫和狗的案例,并在测试类中进行测试

  • 分析:

    ①猫:

    ​ 成员变量:姓名,年龄

    ​ 构造方法:无参,带参

    ​ 成员方法:get/set方法,抓老鼠()

    ②狗:

    ​ 成员变量:姓名,年龄

    ​ 构造方法:无参,带参

    ​ 成员方法:get/set方法,看门()

    ③共性:

    ​ 成员变量:姓名,年龄;构造方法:无参,带参;成员方法:get/set方法

  • 步骤:

    1、定义动物类(Animal)

    ​ 【成员变量:姓名,年龄】【 构造方法:无参,带参】【成员方法:get/set方法】

    2、定义猫类(Cat),继承动物类

    ​ 【构造方法:无参,带参】【成员方法:抓老鼠() 】

    3、定义狗类(Dog),继承动物类

    ​ 【构造方法:无参,带参】【成员方法:看门() 】

    4、定义测试类(AnimalDemo),写代码测试

  • 示例代码:

    class Animal {
    private String name;
    private int age; public Animal() {
    } public Animal(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;
    }
    }
    class Cat extends Animal { public Cat() {
    } public Cat(String name, int age) {
    super(name, age);
    } public void catchMouse() {
    System.out.println("猫抓老鼠");
    }
    }
    class Dog extends Animal { public Dog() {
    } public Dog(String name, int age) {
    super(name, age);
    } public void lookDoor() {
    System.out.println("狗看门");
    }
    }
    /*
    测试类
    */
    public class AnimalDemo {
    public static void main(String[] args) {
    //创建猫类对象并进行测试
    Cat c1 = new Cat();
    c1.setName("加菲猫");
    c1.setAge(5);
    System.out.println(c1.getName() + "," + c1.getAge());
    c1.catchMouse(); Cat c2 = new Cat("加菲猫", 5);
    System.out.println(c2.getName() + "," + c2.getAge());
    c2.catchMouse();
    }
    }

Java(15)面向对象之继承的更多相关文章

  1. Java入门 - 面向对象 - 01.继承

    原文地址:http://www.work100.net/training/java-inheritance.html 更多教程:光束云 - 免费课程 继承 序号 文内章节 视频 1 概述 2 继承的特 ...

  2. 【Java】面向对象之继承

    多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可.其中如图中所示,食草动物.食肉动物.兔子.羊.狮子.豹都可以称为子类,动物类称为父 ...

  3. Java:面向对象(继承,方法的重写(overide),super,object类及object类中方法的重写,父子类代码块执行顺序)

    继承: 1.继承是对某一匹类的抽象,从而实现对现实世界更好的建模. 2.提高代码的复用性. 3.extends(扩展),子类是父类的扩展. 4.子类继承父类可以得到父类的全部属性和方法.(除了父类的构 ...

  4. java学习面向对象之继承

    在我们编写程序的过程当中,会遇到这种情况: 比如现在有一个狗,他的功能有跑,有跳,有吃,有叫,属性有雌雄,大小,颜色等等,同时现在我们也有一个猫,上述功能她也有.这个时候我们写代码的时候,就得分别把上 ...

  5. Java ,python面向对象的继承及其区别

    JAVA JAVA继承基本样式 class Demo extends Object{ Demo(int a){ this(); } Demo(){ super(); } } java默认继承Objec ...

  6. Java基础——面向对象(封装——继承——多态 )

    对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...

  7. python基础语法15 面向对象2 继承,多态,继承json模块中JSONEncoder,并派生出新的功能

    继承 1.什么是继承? 继承是一种新建类的方式,新建的类称之为子类或派生类,继承的父类称之为基类或超类. - 在Python中,一个子类可以继承多个父类.(面试可能会问) - 在其它语言中,一个子类只 ...

  8. 【Java基础】【08面向对象_继承&方法&final】

    08.01_面向对象(代码块的概述和分类)(了解)(面试的时候会问,开发不用或者很少用) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以 ...

  9. 第二十七节:Java基础面向对象-静态,单例模式,继承详情知识点

    前言 Java基础面向对象-静态,单例模式,继承详情知识点.静态-static关键字,static变量,静态代码块,代码块(不加静态),对象创建过程,单例模式,继承. 静态-static关键字 // ...

随机推荐

  1. 面试官:如何实现LRU?你学会了吗?

    面试官:来了,老弟,LRU缓存实现一下? 我:直接LinkedHashMap就好了. 面试官:不要用现有的实现,自己实现一个. 我:..... 面试官:回去等消息吧.... 大家好,我是程序员学长,今 ...

  2. 从源码角度分析 MyBatis 工作原理

    一.MyBatis 完整示例 这里,我将以一个入门级的示例来演示 MyBatis 是如何工作的. 注:本文后面章节中的原理.源码部分也将基于这个示例来进行讲解.完整示例源码地址 1.1. 数据库准备 ...

  3. MySQL——备份与恢复

    MySQL数据库备份和恢复 --备份类型: 1.热备份(只有InnoDB支持)(不影响业务,最好的方式) 2.冷备份( 阻止用户访问) 3.温备份 --备份方式: 1.逻辑备份(文本表示:SQL语句) ...

  4. Onenote实现OCR识别图片

    OCR识别推荐两个软件: 1.       Tesseract:一个开源的,由谷歌维护的OCR软件. 2.       Onenote:微软Office附带或者可以自己独立安装. 3.       O ...

  5. LCT 小记

    全程 Link-Cut Tree,是解决动态树问题的有力科技 --题记 简单实现 LCT 的形态直观上是一堆 Splay 的合体,每个 Splay 以时间戳为关键字,各个 Splay 通过虚边相连,可 ...

  6. HCNP Routing&Switching之IS-IS报文结构和类型

    前文我们了解了IS-IS动态路由协议基础相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15249328.html:今天我们来聊一聊IS-IS动态路由协 ...

  7. struts2执行流程和架构图

    一.struts2执行流程 二.架构图 只需要编写黄色部分的代码:

  8. JDBC管理事务

    一.事务概念:打包一起的多个步骤的业务操作,要么同事成功,要么同时失败,则需要用事务管理: 二.代码实现

  9. 完美数java

    完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数.它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身.如果一个数恰好等于它的因子之和,则称该数为&q ...

  10. oracle table()函数

    PL/SQL表---table()函数用法/* PL/SQL表---table()函数用法:利用table()函数,我们可以将PL/SQL返回的结果集代替table. oracle内存表在查询和报表的 ...