• JavaSE-09 继承


    学习要点

    • 继承的优点和实现
    • 子类重写父类方法
    • 继承下构造方法的执行过程
    • 抽象类和抽象方法的使用
    • final修饰属性、方法和类

      

    继承的优点和实现

    宠物管理系统优化设计

    宠物管理系统中的类有什么问题?

     

    使用继承优化后的类图:

     

    子类和父类是is-a的关系。即子类是父类的一个特例,一个具体实现。例如苹果是水果,小学生是学生,大学生是学生……

    继承的实现

    第一步:编写父类

    class Pet {
    
            //公共的属性和方法
    
    }

    第二步:编写子类

    class Dog extends Pet {  //注意:只能继承一个父类
    
            //子类特有的属性和方法
    
    }
    

      

    子类访问父类成员

    访问父类的构造方法

    super();   
    
    super(name);  // super调用构造方法时,只能是第一句
    

      

    访问父类的成员变量

    super.name;
    

      

    访问父类的方法

    super.print();
    

      

     

    父类不能被继承的资源

    • private成员
    • 子类与父类不在同包,使用默认访问权限的成员
    • 构造方法

    访问控制符总结

     

    private

    (默认)friendly

    protected

    public

    同一个类中

    同一个包中

     

    子类中

     

     

    全局范围内

     

     

     

     

     

     

     

     

     

     

     

    多重继承关系的初始化顺序

     

    何时使用继承

    • 继承和真实世界的描述一致:符合is-a的关系
    • 继承实现代码的重用:将子类共有的属性和行为放到父类中

    上机练习

    练习1:阅读代码,说出控制台输出结果

    class Car {
    
        private int site = 4;  //座位数
    
        Car(){
    
            System.out.println ("载客量是"+site+"人);
    
        }
    
        public void setSite(int site){
    
            this.site = site;
    
        }
    
        void print(){
    
            System.out.print("载客量是"+site+"人");
    
        }
    
    }
    
     
    
    class Bus extends Car {
    
        Bus(int site){
    
            setSite(site);
    
        }
    
    }
    
     
    
    public static void main(String[] args) {
    
        Bus bus = new Bus(20);
    
        bus.print();
    
    }
    

      

    练习2:使用继承完成宠物管理系统的优化

    子类重写父类方法

    父类的方法的局限性

    在宠物管理系统中,父类的print()方法如下:

     

    问题:他能输出子类特有的属性信息吗?如何修改?

     

    方法重写的相关注意事项

    构造方法因为无法被继承,所以不能重写。

    方法重写的规则:

    1. 发生在父类和子类之间
    2. 方法名相同
    3. 参数列表相同
    4. 返回值类型相同或者是其子类;
    5. 访问权限不能严于父类

    方法重写和重载的区别

     

    位置

    方法名

    参数表

    返回值

    访问修饰符

    方法重写

    子类

    相同

    相同

    相同或是其子类

    不能比父类更严格

    方法重载

    同类

    相同

    不相同

    无关

    无关

     

     

     

     

     

    上机练习

    优化电子宠物系统,重写父类方法,输出子类特有属性。

    提示:尝试使用super调用父类已存在方法重写或者完全重写。

     

    抽象类和抽象方法的使用

    抽象类

    问题:在宠物管理系统中,去实例化一个宠物有意义吗?

    Pet pet = new Pet ("小土狗",20,40);
    
    pet.print();
    

      

    pet是没有实际意义。所以使用abstract关键字去限制Pet类的实例化。

    public abstract class Pet {         //abstract修饰的类称为抽象类
    
    }
    

      

     

    抽象方法

    在宠物管理系统中,父类Pet类中的print()方法是否存在问题?

    public abstract class Pet {
    
           public void print() {
    
                   //…
    
           }
    
    }
    

      

    实际上每个子类的print()方法实现都不同。如何解决这个问题?父类不要实现这个方法,让子类去实现。

    abstract也可用于方法——抽象方法

    1. 抽象方法没有方法体
    2. 抽象方法必须在抽象类里
    3. 抽象方法必须在子类中被实现,除非子类是抽象类
    public abstract void print();  //没有方法体的抽象方法
    

      

    上机练习

    修改Pet类为抽象类

    修改Pet类的print()方法为抽象方法

    输出Dog和Penguin信息。

     

     

    final修饰属性、方法和类

     final类

    Dog类不希望再被其他类继承?

    public final class Dog extends Pet {   //定义了一个终结版的类
    
          //…
    
    }
    

      

     final方法

    方法不希望被重写?

    public final void print () {   //定义了一个终结版的方法
    
          //…
    
    }
    

      

    final成员变量

    属性值不希望被修改?使用常量。

    public class Penguin {
    
           final  String  home ="南极";// 居住地
    
           public void setHome(String name){
    
           this.home=home; //错误,不可再赋值
    
        }
    
    }
    

      

    使用final修饰引用型变量,变量的值是固定不变的,而变量所指向的对象的属性值是可变的。

    class Dog {
    
        String name;
    
        public Dog(String name) {
    
            this.name = name;
    
        }
    
    }
    
    class Test {
    
        public static void main(String[] args) {
    
            final Dog dog = new Dog("旺旺");
    
            dog.name = "小宝";
    
            dog = new Dog("小土狗");  //错误:使用final修饰引用型变量,变量不可以再指向另外的对象。
    
        }
    
    }
    

      

    综合案例

    需求描述

    某汽车租赁公司出租多种车辆,车型及租金情况如下

     

    轿车

    客车(金杯、金龙)

    车型

    别克商务舱GL8

    宝马550i

    别克林荫大道

    <=16座

    >16座

    日租费 元/天

    600

    500

    300

    800

    1500

     编写程序实现计算租赁价。

    分析

    发现类

    发现类的属性

    发现类的方法

    优化设计

    编写程序入口

    程序界面

    根据分析,完成系统设计和编码实现

    总结

    继承

    • 符合is-a关系
    • 使用extends关键字
    • 代码复用

    方法重写的规则

    • 方法名相同
    • 参数列表相同
    • 返回值类型相同或者是其子类
    • 访问权限不能严于父类

    super关键字来访问父类的成员

    • super只能出现在子类的方法和构造方法中
    • super调用构造方法时,只能是第一句
    • super不能访问父类的private成员

    抽象类和抽象方法

    • 抽象类不能被实例化
    • 可以有0~多个抽象方法
    • 非抽象类必须重写父类的所有抽象方法

     

    final修饰符

    • 修饰的类,不能再被继承
    • 修饰的方法,不能被子类重写
    • 修饰的变量将变成常量,只能在初始化时进行赋值


    本博客文章未经许可,禁止转载和商业用途!

    如有疑问,请联系: 2083967667@qq.com


  • 相关阅读:
    Scrum框架及其背后的原则(上)——Scrum 框架的伪代码描述[转载自InfoQ]
    用程序给闺女出算数题——我的头脑体操
    敏捷实践调查结果[翻译转载]
    一.初识Selenium
    二.Selenium安装相关文件
    Review of American Beauty(unoriginal)
    三.Selenium IDE学习
    将Java Project转变为Dynamic Web Project
    功能自动化工具watiJ(转载)
    Selenium前奏
  • 原文地址:https://www.cnblogs.com/rask/p/8253628.html
Copyright © 2020-2023  润新知