Java面向对象-继承、super关键字、方法重写

继承概述

什么是继承? 

  • Java中提供了一个关键字extends,用这个关键字,我们可以让两个类建立起父子关系
  • 格式:子类extends父类

  • Student称为子类(派生类)People称为父类(超类)
  • 作用:当子类继承父类之后,就可以直接使用父类的公共的属性和方法了

使用继承的好处

  • 提高代码的复用性,减少代码冗余,增强类的功能扩展性

设计规范

子类们的相同属性放在父类中定义,子类独有的属性和方法应该定义在子类自己里面

如果子类的独有属性和方法定义在父类的话,那么会导致其他的子类也会得到这些属性和方法,不符合面向对象逻辑。

代码参考

继承的特点

  • 子类可以继承父类的属性和行为,但是子类不能继承父类的构造器
  • Java是单继承模式:一个类只能继承一个父类
  • Java不支持多继承,也就是不能同时有多个父类,但是支持多层继承
  • Java中所有类都是Object类的子类,Object类是祖宗类

疑问

  1. 子类是否可以继承父类的构造器?不可以,子类有自己的构造器,父类构造器用于初始化父类对象
  2. 子类是否可以继承父类的私有成员?可以的,只是不能直接访问而已
  3. 子类是否可以继承父类的静态成员?只是可以共享,但不能算是继承,就好像你开你爸爸的车,这个车只是共享给你开,但不算继承给你的

继承后:成员变量和成员方法的访问特点

在子类方法中访问访问成员(成员变量、成员方法)满足:就近原则

  • 先子类局部范围找
  • 然后子类成员范围找
  • 然后父类成员范围找,如果父类范围还没有找到则报错

如果子父类中出现了重名的成员,会优先使用子类的,此时如果一定要在子类中使用父类的怎么办?

  • 可以通过super关键字,指定访问父类的成员

代码理解

public class Test {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.run();//就近原则,狗跑
        System.out.println(d.name);//狗名
    }
}

class Animal{
    public String name ="动物名";
    public void run(){
        System.out.println("动物跑!");
    }

}

class Dog extends Animal{
    public String name = "狗名";

    public void run(){
        System.out.println("狗跑!");
    }

    public void test(){
        String name = "局部名";
        System.out.println(name);
        System.out.println(this.name);//当前子类对象的name
        System.out.println(super.name);//访问父类的name
        super.run();//找父类的方法
    }
}

继承后:方法重写(override)

什么是方法重写?

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

应用场景

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

也就是说在父类的基本功能基础上拓展新的功能

用案例来理解⬇

/**
 * @Author: ttong
 * @Description:方法重写
 * 旧手机:可以打电话、发信息
 * 新手机:旧手机的基本功能下拓展视频通话、发送语音和图片
 */
public class Test {
    public static void main(String[] args) {
        //理解方法重写
        newPhone np = new newPhone();
        np.call();
    }
}
//旧手机
class Phone{
    public void call(){
        System.out.println("打电话");
    }

    public void sendMsg(){
        System.out.println("发信息");
    }
}

//新手机
class newPhone extends Phone{
    //重写的方法
    public void call(){
        super.call();//先用父类基本功能
        System.out.println("开始视频通话");
    }
    //重写的方法
    public void sendMsg(){
        super.sendMsg();//先用父类基本功能
        System.out.println("开始发语音和图片信息");
    }
}

@Override重写注解

可以放在重写方法上作为重写是否正确的校验注解

  • 当重写的方法写错了会有报错提示,更安全

  • 提高代码可读性,更优雅~

注意事项和要求

  • 重写的方法的名称、形参列表必须与被重写的方法的一致
  • 私有方法不能被重写
  • 子类重写方法时,访问权限必须大于等于父类的
  • 子类不能重写父类的静态方法,会报错的

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

  • 子类中的所有构造器默认都会先访问父类中的无参构造器,再执行自己

为什么呢?

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

怎么调用父类构造器的?

  • 子类构造器的第一行语句默认都是:super(),不写也存在

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

使用super(...)调用父类的有参构造器

作用:

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

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

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

如何解决?

  • 子类构造器中可以通过书写super(...),手动调用父类的有参构造器

子类一定会访问父类的构造器,无论是有参还是无参!!!

this和super使用总结

this:代表本类对象的引用

super:代表父类存储空间的标识 

关键字访问成员变量访问成员方法访问构造方法
this

this.成员变量

访问本类成员变量

this.成员方法(..)

访问本类成员方法

this(...)

访问本类(其他)构造器

super

super.成员变量

访问父类成员变量

super.成员方法(...)

访问父类成员方法

super(...)

访问父类构造器

疑问?this(...)⬇

this如何访问本类其他构造器

用案例去理解⬇

如果要开发一个学生信息管理系统,要填写姓名和学校,如果学生不填写学校,假设默认学校是苏州科技大学

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("gst","苏州科技大学");
        System.out.println(s1.getName());
        System.out.println(s1.getSchoolName());

        //如果要开发一个学生信息管理系统,要填写姓名和学校
        //如果学生不填写学校,默认学校是苏州科技大学
        Student s2 = new Student("zcy");
        System.out.println(s2.getName());
        System.out.println(s2.getSchoolName());

    }


public class Student {
    private String name;
    private String schoolName;

    //无参构造器
    public Student() {
    }

    //如果要开发一个学生信息管理系统,要填写姓名和学校
    //如果学生不填写学校,默认学校是苏州科技大学
    public Student(String name){
        //借用本类的兄弟构造器
        this(name,"苏州科技大学");
    }
    //有参构造器
    public Student(String name, String schoolName) {
        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;
    }
}

this和super使用注意点

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

super(...)放在第一行:必须先初始化父类,再初始化自己

this(...)放在第一行:借用本类兄弟构造器时,那么这个构造器里面的super()就没有了【如果有的话会执行两次初始化父类,super()本身先初始化父类,然后this(...)调用兄弟构造器时,兄弟构造器里还有一次super()初始化父类,这样不合规】,然后借用兄弟构造器的时候也必须放在第一行因为无论如何要保证优先初始化父类,只有this(...)在第一行时才能马上去借兄弟的super()初始化父类

所以流程就是先执行this(...)然后借用兄弟构造器里执行super()初始化父类

this基本用法不懂→http://t.csdnimg.cn/YyWGu

  • 37
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java面向对象 1 1 学习方法与要求 1 2 面向对象语言与面向过程语言的区别 7 3 面向对象?什么对象? 8 4 什么是类? 9 5 如何创建一个类Class? 10 6 如何使用类创建对象 10 7 引用与实例 11 8 实例属性与实例方法 11 9 实例属性与实例方法的使用 12 10 实例属性属于实例本身,与其他实例没有关系 13 11 javaBean编码规范 14 12 练习: 15 13 什么构造方法 16 14 构造方法的作用? 17 15 this关键字 17 16 方法调用时的引用传递还是值传递 19 17 面向对象语言的三大特性:封装,继承,多态 20 18 什么是封装?封装在哪? 20 18.1 封装的好处? 20 19 访问修饰符 20 20 面向对象的特性-继承 21 20.1 继承关键字:extends 21 20.2 继承的语法格式: 21 20.3 继承的好处 21 20.4 Object类 21 20.5 继承是以什么方法实现的? 22 20.6 两个子类的实例,super会指向同一个父类实例吗? 23 20.7 在创建子类实例时,会创建父类实例,先创建哪个? 23 20.8 在子类构造方法中如何调用父类构造方法? 23 20.9 super关键字 24 20.10 父类中私有属性和私有方法可以继承吗? 24 20.11 在代码开发时先开发父类还是先开发子类? 24 20.12 父类是怎么来的? 25 20.13 父类中放的所有子类的共性。子类可以有自己的特性。 26 20.14 方法重写(核心@Override) 28 20.15 练习: 29 20.16 作业题: 31 21 类与类之间的关系 32 22 GC:垃圾回收机制 33 23 Object类 33 23.1 常用方法:boolean equals(Object) 33 23.2 常用方法:String toString() 34 24 继承整理 34 25 面向对象三大特性:多态(核心) 34 25.1 多态的前提? 35 25.2 什么是多态? 35 25.3 父类的引用指向子类实例时,父类引用可以调用哪些方法? 35 26 引用类型的自动类型与强制类型转换 36 27 多态的应用 37 27.1 在使用多态时的一般格式: 37 27.2 练习:创建一个薪资专员(Persionnel),能计算员工工资,负责汇总当月所有员工的总工资数 38 27.3 练习:NewBasePlusSalesEmployee:针对BasePlusSalesEmployee有固定底薪的销售人员,有任务额度10K,满足任务额度正常发放,不满足任务额度发放底薪的80%,提成正常发放。 38 27.4 练习:设计一个形状类Shape 39 28 abstract关键字 41 28.1 abstract可以修饰的对象 41 28.2 抽象方法 41 28.3 抽象类 41 28.4 抽象方法与抽象类的关系 42 28.5 抽象方法与抽象类的使用 42 28.6 abstract的使用场合 42 29 练习:写一个“愤怒的小鸟”: 43 30 final关键字 43 30.1 final可以修饰到3个地方 43 30.2 引用类型加final修饰表示引用不可变 44 31 static关键字 44 31.1 static关键字可以修饰4个地方 44 31.2 静态属性 44 31.3 静态的与实例的 45 31.4 静态代码块 45 31.5 静态方法 45 31.6 静态方法是不能被继承 46 31.7 如何区分静态方法和实例方法的应用 46 31.8 静态导入(1.5新特性) 46 32 单例模式 47 32.1 饿汉模式 47 32.2 懒汉模式 47 33 接口(interface) 48 33.1 如何创建一个接口。 48 33.2 如何使用接口 48 33.3 如何使用类实现一个接口 49 33.4 接口的细节 49 34 接口的应用(面向对象分析) 49 34.1 案例(第一版,使用接口) 50 34.2 案例(第二版) 52 35面向对象设计原则 54 1、找出应用中可能需求变化的代码,把它们独立出来,不要和那些需求不变化的的代码混在一起 54 2、针对接口编程,而不要针对实现类编程 54 3、多用组合,少用继承(包含实现) 54 4、为了交互对象之间的松耦合设计而努力 54 5、类应该对扩展开放,对修改关闭 54 6、依赖倒置,要依赖抽象,不要依赖具体类 54 36 练习:超市收银 54 37 练习:接口表示一种能力,也可以是一种规范 56 38 策略模式 57 38.1 动作冒险游戏 57 38.2 类图 57 38.3 编写使用武器行为接口和实现类 58 38.4 编写角色类和子类 58 38.5 测试类 58 38.6 动作冒险游戏补丁:增加新的角色和新的技能 59 38.7 编写新的打斗行为 59 38.8 编写新的治疗行为和实现类 59 38.9 修改角色父类 60 38.10 修改King类 60 39 披萨工厂 61 39.1 编写披萨父类 61 39.2 编写各种披萨 61 39.3 编写披萨商品类 62 39.4 简单工厂 63 39.5 使用简单工厂修改商店类 63 39.6 使用简单工厂将创建对象代码单独的封装的好处? 64 39.7 使用常量优化工厂类 64 39.8 测试类 65 40 枚举(enum) 65 40.1 创建一个枚举 66 40.2 为枚举创建实例 66 40.3 如何使用枚举的实例 66 40.4 使用枚举优化披萨工厂 67 40.5 枚举类型也可以有构造方法 68 40.6 枚举类型也可以有属性 68 40.7 枚举类型也支持带参数的构造方法。 68 40.8 枚举类型也可以有实例方法 68 40.9 枚举类型也可以支持抽象方法 69 41 内部类 70 41.1 内部类的分类 70 41.2 匿名内部类 70 41.3 成员内部类 71 41.4 静态内部类 72 41.5 局部内部类 73 42 作业 :商超案例,以OOP重构 73
第四章 面向对象的概念和 Java 实现-2 回顾 类是具有相同属性和行为的一组对象的 集合 , 对象是类的实例 封装是隐藏对象实现细节的过程,以便不让用户看到实现的细节 类可用Class 来定义,类的变量和方法可被该类的实例访问, 圆点符号用于访问对象的成员,构造函数在创建对象时初始化对象 包可用package 来申明 ,可用import 来导入包 目标 理解继承及其特点 运用JAVA程序实现继承 理解多态及其特点设计 运用JAVA程序实现多态 掌握访问修饰符和方法修饰符 继承 继承的特点 继承的优点 继承JAVA实现 子类构造方法 2-1 子类构造方法 2-2 调用父类构造方法的语法为: super() 或 super(参数列表) ; super () 方法始终指向调用类的父类 调用父类构造方法 演示:示例 3 多态性 2-1 多态性是指¡°多种形式¡± 它使用不同的实例而执行不同操作 多态包括方法重写和方法重载 多态性 2-2 方法重载 2-1 方法重载 2-2 演示:示例 4 方法重写 2-1 方法重写 2-2 访问修饰符 3-1 信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因 信息隐藏的原因包括: 对任何实现细节所作的更改不会影响使用该类的代码 防止用户意外删除数据 此类易于使用 访问修饰符 3-2 访问修饰符 3-3 访问修饰符可访问性 方法修饰符 static 修饰符 3-1 static修饰符修饰的方法叫静态方法 目的 使该方法独立于类的实例,使用类去访问,而不是类实例,所以也叫类方法 static 修饰符 3-2 调用静态方法的语法为: classname.methodname( ); static 修饰符 3-3 演示:示例 6 final 修饰符 abstract 修饰符 3-1 由abstract修饰的方法叫抽象方法;由abstract修饰的类叫抽象类 抽象方法必须声明在抽象类中 抽象方法语法: abstract type method_name(parameter_list); 声明抽象类语法: abstract class{…… } 使用:父类中的某些抽象不包含任何逻辑,并需要在子类中重写,子类提供这种抽象方 法的实现细节 abstract 修饰符 3-2 抽象类可以具有指向子类对象的对象引用 abstract 修饰符 3-3 演示:示例 7 接口 接口就是某个事物对外提供的一些功能的申明 可以利用接口实现多态,同时接口也弥补了Java单一继承的弱点 使用interface关键字定义接口 一般使用接口声明方法或常量,接口中的方法只能是声明,不能是具体的实现 创建接口的步骤 2-1 // 定义方法的接口 public interface myinterface { public void add(int x, int y); public void volume(int x,int y, int z); } // 定义程序使用的常量的接口 public interface myconstants { public static final double price = 1450.00; public static final int counter = 5; } 创建接口的步骤 2-2 接口使用示例 总结 封装、继承和多态是面向对象的主要特征 继承可提高代码的重用性,使用extends关键字来实现。除了构造方法之外,父类的所有 方法和属性都被子类的对象继承 多态性是不同的实例对象以不同的方式对相同的信息作出不同的表现 访问修饰符用于确定访问类成员的方式 Java 常用修饰符有 static、final、abstract 接口是Java编程一项重要的技术,同过它可以实现多态,同时它也弥补了Java单一继承 的不足 . . ----------------------- 《java面向对象程序设计-继承和多态》教案全文共5页,当前为第1页。 《java面向对象程序设计-继承和多态》教案全文共5页,当前为第2页。 《java面向对象程序设计-继承和多态》教案全文共5页,当前为第3页。 《java面向对象程序设计-继承和多态》教案全文共5页,当前为第4页。 《java面向对象程序设计-继承和多态》教案全文共5页,当前为第5页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值