Java基础教程——继承
继承
一个类 可以 继承自 另一个类;
派生的类(子类)继承父类的方法和数据成员;
关键字:子类 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基础教程——继承的更多相关文章
- Java基础教程(18)--继承
一.继承的概念 继承是面向对象中一个非常重要的概念,使用继承可以从逻辑和层次上更好地组织代码,大大提高代码的复用性.在Java中,继承可以使得子类具有父类的属性和方法或者重新定义.追加属性和方法. ...
- Java基础教程:注解
Java基础教程:注解 本篇文章参考的相关资料链接: 维基百科:https://zh.wikipedia.org/wiki/Java%E6%B3%A8%E8%A7%A3 注解基础与高级应用:http: ...
- Java基础教程:泛型基础
Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...
- Java基础教程:反射基础
Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...
- Java基础教程:面向对象编程[2]
Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default ...
- Java基础教程:面向对象编程[1]
Java基础教程:面向对象编程 内容大纲 Java语言概述 Java语言特点 1.Java为纯面向对象的语言,它能够直接反映现实生活中的对象.总之,Everything is object! 2.平台 ...
- Java基础教程:HashTable与HashMap比较
Java基础教程:HashTable与HashMap比较 1. 关于HashMap的一些说法: a) HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体.HashMap的底层结 ...
- Java基础教程:面向对象编程[3]
Java基础教程:面向对象编程[3] 内容大纲 基础编程 获取用户输入 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入.我们可以查看Ja ...
- Java基础教程:内部类
Java基础教程:内部类 内部类 内部类,是指在一个类的内部定义的类.就像下面这样: public class EnclosingClass { . . . public class Nest ...
随机推荐
- D. Kilani and the Game 解析(裸BFS、實作)
Codeforce 1105 D. Kilani and the Game 解析(裸BFS.實作) 今天我們來看看CF1105D 題目連結 題目 給一個\(n\times m\)的地圖,地圖上有幾種格 ...
- 云计算管理平台之OpenStack认证服务Keystone
一.keystone简介 keystone是openstack中的核心服务,它主要作用是实现用户认证和授权以及服务目录:所谓服务目录指所有可用服务的信息库,包含所有可用服务及其API endport路 ...
- Django项目-个人网站之投票模块
Django项目之个人网站 关注公众号"轻松学编程"了解更多. Github地址:https://github.com/liangdongchang/MyWeb.git 感兴趣的可 ...
- 用GitHub Pages搭建博客(三)
本篇介绍通过git工具替换网站主题,并发布 Jekyll和Hexo的简要介绍 GitHub Pages是基于Jekyll构建的,Jekyll 是一个简单的博客形态的静态站点生产工具,它有一个模版目 ...
- 《Clojure编程》笔记 第3章 集合类与数据结构
目录 背景简述 第3章 集合类与数据结构 3.1 抽象优于实现 3.1.1 Collection 3.1.2 Sequence 3.1.3 Associative 3.1.4 Indexed 3.1. ...
- Lte Design Documentation之RRC
RRC 特点 RRC模型在模拟器中提供以下功能 生成(在eNB中)和解释(在UE中)信息块(尤其是MIB和SIB1, SIB2) 初始化小区选择 RRC连接建立过程 RRC重新配置程序, 支持以下方式 ...
- ubuntu设置mentohust开机自动登录校园网
设置环境: ubuntu14.04 64位 无法忍受校园网ubuntu锐捷客户端登录每次开机都要输一大串命令 step1 首先下载mentohust,链接http://code.google.com ...
- c++11-17 模板核心知识(二)—— 类模板
类模板声明.实现与使用 Class Instantiation 使用类模板的部分成员函数 Concept 友元 方式一 方式二 类模板的全特化 类模板的偏特化 多模板参数的偏特化 默认模板参数 Typ ...
- 剑指offer之顺序打印数组
算法的要求为: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打 ...
- 14 RPC
14 RPC RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...