继承

一个类 可以 继承自 另一个类;

派生的类(子类)继承父类的方法和数据成员;

关键字:子类 extends 父类。

public class 继承 {
public static void main(String[] args) {
王思聪 a = new 王思聪();
System.out.println(a.money);
a.show();
}
}
class 王健林 {
double money = 188.88;
void show() {
System.out.println("不差钱");
}
}
class 王思聪 extends 王健林 {
}

设计示例

继承主要解决的问题是:共性抽取。

继承的特点:

|--子类可以拥有父类的“内容”

|--子类可以拥有自己的“内容”

卡车和巴士都是汽车,它们共有的特征来自汽车,他们也可以有自己的特征:

public class 继承2 {
public static void main(String[] args) {
}
}
class 汽车 {
private int wheels;
public int getWheels() {
return wheels;
}
public void setWheels(int wheels) {
this.wheels = wheels;
}
// ------------------------
public void 开车() {
System.out.println("开车了");
}
public void 刹车() {
System.out.println("刹车");
}
}
class 卡车 extends 汽车 {
private int carryingCapacity;
public int getCarryingCapacity() {
return carryingCapacity;
}
public void setCarryingCapacity(int carryingCapacity) {
this.carryingCapacity = carryingCapacity;
}
// ------------------------
public void 挂箱() {
System.out.println("挂箱");
}
}
class Bus extends 汽车 {
private int seatings;
public int getSeatings() {
return seatings;
}
public void setSeatings(int seatings) {
this.seatings = seatings;
}
// ------------------------
public void 报站(String str站名) {
System.out.println(str站名 + "已到");
}
}

继承控制

protected:继承即可用,即使不在同一个包中

private:不给继承

this和super

this:自己的

super:父类的

|-|-super():父类构造方法

|-|-super.XXX:父类的成员(方法或变量)

public class This_and_Super {
public static void main(String[] args) {
S _s = new S();
_s.m();// 直接通过子类对象,调用的是子类的方法
_s.newNethod();
}
}
class F {
protected int a = 1;
protected void m() {
System.out.println("F");
}
}
class S extends F {
protected int a = 99;
protected void m() {
System.out.println("S");
}
protected void newNethod() {
System.out.println(super.a);
System.out.println(this.a);
System.out.println(a);// 直接调用,是自己的值
// ---------
super.m();
this.m();
m();// 直接调用,是自己的方法
}
}

super():再论构造方法

super必须有,不写也默认,必须第一句,只能有一个

​ (1)默认调父类的无参构造方法,直到显式调用父类的有参构造方法。

​ 详解:无论子类构造方法带不带参数,默认都是执行父类的无参构造方法。【隐藏一句代码:super()】

如果非要执行父类带参构造方法的话,使用super(参数列表)。

​ (2)super(父类构造方法)只能放在构造方法中,且必须放在第一句,因此也不能多次调用父类构造方法。

测试:

public class 构造顺序 {
public static void main(String[] args) {
new S();
new S(1);
new S(1L);
}
}
class F {
F() {
System.out.println("父类构造方法");
}
F(int a) {
System.out.println("父类构造方法(带参)");
}
}
class S extends F {
S() {
System.out.println("子类构造方法\n");
}
S(int a) {
System.out.println("子类构造方法(带参)\n");
}
S(long a) {
super(1);
System.out.println("子类构造方法2(带参),显示调用父类的带参构造方法\n");
}
}

父类构造方法

子类构造方法

父类构造方法

子类构造方法(带参)

父类构造方法(带参)

子类构造方法2(带参),显示调用父类的带参构造方法

this()

this(...)也可以调用自己的其它构造方法,也必须放在第一句,一个构造方法中只能写一句。

class S2 extends F {
S2() {
this(100);
}
S2(int a) {
this(100, 200);
}
S2(int a, int b) {
}
}

思考题:总结super和this的用法

重写·Override

Override:方法重写、方法覆盖。

子类可以重新定义继承自父类的方法。子类方法中,可通过super来调用父类的方法。

  • 两同:方法名相同,形参列表相同
  • 两不大:返回类型不比父类大(大手大脚败家子),异常不比父类大(不得扩大范围)
  • 一不小:访问权限不比父类小(不得废公为私)

public class 重写 {
public static void main(String[] args) {
Ostrich os = new Ostrich();
os.twitter();
os.fly();
}
}
class Bird {
public void twitter() {
System.out.println("wakuwaku");
}
public void fly() {
System.out.println("飞");
}
}
// 鸵鸟类
class Ostrich extends Bird {
@Override// 不写也是重写,写了会做检测,若方法在父类不存在将报错
public void fly() {
super.fly();
System.out.println("?并不会");
}
}

wakuwaku



?并不会

返回类型不比父类大(注:Object是String的父类)

访问权限不比父类小(尧→舜→禹,启结束了禅让制度。)

class Bird {
public Object twitter() {
return null;
}
public String fly() {
return null;
}
}
// 鸵鸟类
class Ostrich extends Bird {
public String twitter() {// 父类是Object,子类是String,没问题
return null;
}
@Override// 父类返回类型String,改为Object
public Object fly() {// The return type is incompatible with Bird.fly()
return null;
}
}
// 鸽子类
class Pigeon extends Bird {
@Override
private String fly() {// 父类是public,改为private
// Cannot reduce the visibility of the inherited method from Bird
return null;
}
}

重写的应用场景:

对于已经存在的类,尽量不要进行代码修改,而是派生一个新的子类,对响应的方法进行重写。

final(不准修改)

Final修饰类:该类不可被继承(比如String类)

Final修饰方法:该方法不能被重写

Final修饰变量:不能被重新赋值

Java里的“常量”:

public static final int CHANG_LIANG = 10;

继承的坏处

继承是实现类复用的重要手段,但是继承会破坏封装。

每个类都应该封装其内部信息和实现细节,仅暴露必要的方法给其他类使用。但子类可以直接访问父类的内部信息,甚至可以重写父类的方法,这增加了子类和父类的耦合度,破坏了封装。

设计父类时,应遵循以下原则:

  • 尽量将父类的成员变量设置为private。
  • 尽量缩小方法的访问权限,能私有尽量不要共有。
  • 不希望被子类重写的方法设置为final。
  • 不要在父类的构造方法中调用被子类重写的方法。

​ 下例代码中,父类A的构造方法,该方法调用了被重写的method()方法,因为是先执行父类构造方法,而其调用的method()方法是被子类重写的,此时并没有变量s,因此s为null。

class A {
public A() {
System.out.println("A的构造方法");
method();
this.method();
}
public void method() {
System.out.println("A method");
}
}
class B extends A {
public String s = "子类变量";
public void method() {
System.out.println("B method:" + s);
}
}
public class TestInstanceOf {
public static void main(String[] args) {
B b = new B();
}
}

Java基础教程——继承的更多相关文章

  1. Java基础教程(18)--继承

    一.继承的概念   继承是面向对象中一个非常重要的概念,使用继承可以从逻辑和层次上更好地组织代码,大大提高代码的复用性.在Java中,继承可以使得子类具有父类的属性和方法或者重新定义.追加属性和方法. ...

  2. Java基础教程:注解

    Java基础教程:注解 本篇文章参考的相关资料链接: 维基百科:https://zh.wikipedia.org/wiki/Java%E6%B3%A8%E8%A7%A3 注解基础与高级应用:http: ...

  3. Java基础教程:泛型基础

    Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...

  4. Java基础教程:反射基础

    Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...

  5. Java基础教程:面向对象编程[2]

    Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default ...

  6. Java基础教程:面向对象编程[1]

    Java基础教程:面向对象编程 内容大纲 Java语言概述 Java语言特点 1.Java为纯面向对象的语言,它能够直接反映现实生活中的对象.总之,Everything is object! 2.平台 ...

  7. Java基础教程:HashTable与HashMap比较

    Java基础教程:HashTable与HashMap比较 1.  关于HashMap的一些说法: a)  HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体.HashMap的底层结 ...

  8. Java基础教程:面向对象编程[3]

    Java基础教程:面向对象编程[3] 内容大纲 基础编程 获取用户输入 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入.我们可以查看Ja ...

  9. Java基础教程:内部类

    Java基础教程:内部类 内部类 内部类,是指在一个类的内部定义的类.就像下面这样: public class EnclosingClass {   . . .   public class Nest ...

随机推荐

  1. D. Kilani and the Game 解析(裸BFS、實作)

    Codeforce 1105 D. Kilani and the Game 解析(裸BFS.實作) 今天我們來看看CF1105D 題目連結 題目 給一個\(n\times m\)的地圖,地圖上有幾種格 ...

  2. 云计算管理平台之OpenStack认证服务Keystone

    一.keystone简介 keystone是openstack中的核心服务,它主要作用是实现用户认证和授权以及服务目录:所谓服务目录指所有可用服务的信息库,包含所有可用服务及其API endport路 ...

  3. Django项目-个人网站之投票模块

    Django项目之个人网站 关注公众号"轻松学编程"了解更多. Github地址:https://github.com/liangdongchang/MyWeb.git 感兴趣的可 ...

  4. 用GitHub Pages搭建博客(三)

    本篇介绍通过git工具替换网站主题,并发布 Jekyll和Hexo的简要介绍   GitHub Pages是基于Jekyll构建的,Jekyll 是一个简单的博客形态的静态站点生产工具,它有一个模版目 ...

  5. 《Clojure编程》笔记 第3章 集合类与数据结构

    目录 背景简述 第3章 集合类与数据结构 3.1 抽象优于实现 3.1.1 Collection 3.1.2 Sequence 3.1.3 Associative 3.1.4 Indexed 3.1. ...

  6. Lte Design Documentation之RRC

    RRC 特点 RRC模型在模拟器中提供以下功能 生成(在eNB中)和解释(在UE中)信息块(尤其是MIB和SIB1, SIB2) 初始化小区选择 RRC连接建立过程 RRC重新配置程序, 支持以下方式 ...

  7. ubuntu设置mentohust开机自动登录校园网

    设置环境: ubuntu14.04  64位 无法忍受校园网ubuntu锐捷客户端登录每次开机都要输一大串命令 step1 首先下载mentohust,链接http://code.google.com ...

  8. c++11-17 模板核心知识(二)—— 类模板

    类模板声明.实现与使用 Class Instantiation 使用类模板的部分成员函数 Concept 友元 方式一 方式二 类模板的全特化 类模板的偏特化 多模板参数的偏特化 默认模板参数 Typ ...

  9. 剑指offer之顺序打印数组

    算法的要求为: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打 ...

  10. 14 RPC

    14 RPC RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...