学习要点

  • 继承的优点和实现
  • 子类重写父类方法
  • 继承下构造方法的执行过程
  • 抽象类和抽象方法的使用
  • 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修饰符

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

JavaSE-09 继承的更多相关文章

  1. JavaSE 类继承中函数重写

    (1) /** * 继承时重写方法的返回类型可以不一样 * 这时的返回值类型必须是与父类相同或者为子类. */ class A { public Object func(){ return null; ...

  2. JavaSE习题 继承接口和泛型

    问答题: 1.子类在什么情况下可以继承父类友好成员? 答:在同一个包内 2.子类通过怎样的方法可以隐藏继承的成员变量? 答:声明一个与父类相同变量名的成员变量 3.子类重写继承的方法原则是什么? 答: ...

  3. Java 基础入门随笔(11) JavaSE版——继承、覆盖、抽象类

    1.面向对象的特征二:继承 定义: 指一个对象直接使用另一对象的属性和方法. 继承好处: 1.提供代码的复用性. 2.让类与类直接产生了关系,给第三个特征多态提供了前提. java中支持单继承.不直接 ...

  4. 关于properties文件在项目中的使用

    这个是当时在学习JDBC的时候老师给讲的.web项目中把一些常用的用户名和密码都填写到一个对应的配置文件中,这样每次修改密码或者用户名的时候就可以直接修改这个配置文件了,不用动源码. 老师讲了两种读取 ...

  5. 《Thinking In Java第四版》拾遗

    <Thinking In Java第四版>拾遗 转自我的github(http://katsurakkkk.github.io/2016/05/Thinking-In-Java%E7%AC ...

  6. 使用Properties类和ResourceBundle类读取properties文件

    一.介绍: 项目中经常把一些常用的用户名和密码都填写到一个对应的配置文件中,这样每次修改密码或者用户名的时候就可以直接修改这个配置文件了,不用动源码. 这里讲两种方式读取properties文件的方法 ...

  7. Spark RDD API扩展开发

    原文链接: Spark RDD API扩展开发(1) Spark RDD API扩展开发(2):自定义RDD 我们都知道,Apache Spark内置了很多操作数据的API.但是很多时候,当我们在现实 ...

  8. 04C++核心编程

    Day01 笔记 1 C++概述 1.1 C++两大编程思想 1.1.1 面向对象 1.1.2 泛型编程 1.2 移植性和标准 1.2.1 ANSI 在1998制定出C++第一套标准 2 c++初识 ...

  9. Windows7WithSP1/TeamFoundationServer2012update4/SQLServer2012

    [Info   @09:03:33.737] ====================================================================[Info   @ ...

  10. JavaSE学习总结第09天_面向对象4

      09.01 final关键字引入 例: class Fu { public final void show() { System.out.println("访问底层资源"); ...

随机推荐

  1. I.MX6 RGB clock 和 data 重合

    /*********************************************************************** * I.MX6 RGB clock 和 data 重合 ...

  2. JS处理Cookie

    <script>function GetCookieVal(offset)//获得Cookie解码后的值{var endstr = document.cookie.indexOf (&qu ...

  3. Mysql数据库基础操作

    Mysql数据库基础操作 在mysql数据库中开启使用tab键补全功能 1)修改主配置文件/etc/mysql/my.cnf(mysql和mariadb目录有些不同) vim /etc/mysql/m ...

  4. (转)IE内存泄露,iframe内存泄露造成的原因和解决方案

    http://my.oschina.net/jsan/blog/11169 http://blog.csdn.net/tianma630/article/details/8502395 jQuery ...

  5. 设计模式-COMMOND PATTERN (ACTIVE OBJECT PATTERN是一种特殊的COMMOND PATTERN)

    复用控制逻辑. 理解方式:Controller 获取到Light TeleVision Computer中的一个的对像,通过Icommond接口作用于它. ACTIVE OBJECT模式: class ...

  6. Ruby Time类和Date类

    Time类 更新: 2017/06/23 更新了Data/Time在model模式下的便利方法 更新: 2018/10/12 修改了%Y相关描述防止误解  年月日时分秒,时区    生成  获取当前时 ...

  7. bzoj 1070: [SCOI2007]修车【最小费用最大流】

    一开始从客人角度想的,怎么建都不对 从一个修车工所接待的所有顾客花费的总时间来看,设一共有x个人,那么第一个修的对总时间的贡献是x*w1,第二个是(x-1)*w2-以此类推.所以把第i个修车工拆成n组 ...

  8. 第四章 朴素贝叶斯法(naive_Bayes)

    总结 朴素贝叶斯法实质上是概率估计. 由于加上了输入变量的各个参量条件独立性的强假设,使得条件分布中的参数大大减少.同时准确率也降低. 概率论上比较反直觉的一个问题:三门问题:由于主持人已经限定了他打 ...

  9. Hibernate3中重复引用hbm文件错误信息记录

    Hibernate3中重复引用hbm文件错误信息记录. 八月 ::, ERROR - Context initialization failed org.springframework.beans.f ...

  10. 转 ORA-12638: 身份证明检索失败

    ORA-12638: 身份证明检索失败 的解决办法 2008年06月25日 星期三 11:42 the NTS option makes the Oracle client attempt to us ...