学习要点

  • 继承的优点和实现
  • 子类重写父类方法
  • 继承下构造方法的执行过程
  • 抽象类和抽象方法的使用
  • 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. JS获得本月的第一天和最后一天

    <script> //本月第一天  function showFirstDay()  {      var Nowdate=new Date();      var MonthFirstD ...

  2. Uncaught ReferenceError: is not defined

    今天,遍历一个HashSet集合对象,想用链接绑定集合对象的值,通过POST方式提交到控制器.结果程序无反应,按F12键进入调试模式,谷歌总是提示Uncaught ReferenceError:   ...

  3. poj1419 求最大独立集

    题目链接:http://poj.org/problem?id=1419 题意:求最大独立集 思路: 这里有一个定理: 最大独立集=补图的最大团最大团=补图的最大独立集 所以这里我们只要求给出的图的最大 ...

  4. Linux 系统管理命令 - vmstat - 虚拟内存统计

    命令详解 重要星级: ★★★★☆ 功能说明: vmstat 是 Virtual Memory Statistics ( 虚拟内存统计 ) 的缩写,利用 vmstat 命令可以对操作系统的内存信息.进程 ...

  5. E20180318-hm

    Scalability 可扩展性 scale  n. 规模; 比例(尺); 鱼鳞; 级别; vt. 测量; 攀登; 刮去…的鳞片; vi. 衡量; 攀登; (鳞屑) 脱落; 生水垢; collabor ...

  6. E20180228-hm-xa

    bounds n. 界限; 界限; 出界; 在(某人允许进入的)界限以外; 出格的; 跳跃( bound的名词复数 ); (球等的) 反跳; indice  n. 指数(指指标, 如健康指数的指数); ...

  7. [POI2010]Antisymmetry

    Description 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作"反对称"字符串.比如00001111和010101就是反对称的,100 ...

  8. Poj 3436 ACM Computer Factory (最大流)

    题目链接: Poj 3436 ACM Computer Factory 题目描述: n个工厂,每个工厂能把电脑s态转化为d态,每个电脑有p个部件,问整个工厂系统在每个小时内最多能加工多少台电脑? 解题 ...

  9. overlaps the location of another project Zendstudio导入已经存在的目录

    转 http://blog.csdn.net/kdchxue/article/details/50633745 最近弄zendstuido导入已经存在的项目,找了很多地方终于找到了导入的方法,特别记录 ...

  10. Windows 7操作系统下PHP 7的安装与配置(图文详解)

    前提博客 Windows 7操作系统下Apache的安装与配置(图文详解) 从官网下载           PHP的官网 http://www.php.net/         特意,新建这么一个目录 ...