从屌丝到架构师的飞越(面向对象篇)-继承

一、介绍

继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。

在面向对象程序设计中运用继承原则,就是在每个由一般类和特殊类形成的一般——特殊结构中,把一般类的对象实例和所有特殊类的对象实例都共同具有的属性和操作一次性地在一般类中进行显式的定义,在特殊类中不再重复地定义一般类中已经定义的东西,但是在语义上,特殊类却自动地、隐含地拥有它的一般类(以及所有更上层的一般类)中定义的属性和操作。特殊类的对象拥有其一般类的全部或部分属性与方法,称作特殊类对一般类的继承。

比如可以先定义一个类叫车,车有以下属性:车体大小,颜色,方向盘,轮胎,而又由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。

二、知识点介绍

1、继承概念

2、继承的定义及使用格式

3、继承注意事项

4、方法重写

三、上课对应视频的说明文档

1、继承概念

1.1、继承概述

继承是面向对象的核心特性,是面向对象的学习重点。同时继承是代码复用的重要方式,可以表示类与类之间的关系,是所有面向对象语言不可缺少的组成部分。

1.2、继承概念

当一个类的属性与行为均与现有类相似,属于现有类的一种时,这一个类可以定义为现有类的子类。

或者换成相反的角度来看,如果多个类具有相同的属性和行为,我们可以抽取出共性的内容定义父类,这时再创建相似的类时只要继承父类即可。

子类拥有父类的所有属性与方法,无需重新定义。并且可以直接使用非私有的父类成员。

从类与类之间的设计关系来看,子类必须属于父类的一种时,才会继承。

我们在完成一个庞大项目体系的时候,都是将共性的内容抽取出,后续构建过程是从各种父类“向外”扩散的。

下例展示了一个继承关系

图1-1 动物继承关系图

动物类可以有姓名、年龄的成员变量,可以有吃饭、睡觉的方法。

所有猫科与犬科均有动物的成员变量与成员方法,且猫科与犬科均属于动物,所以猫科与全科均可以继承动物类。

猫科可以在动物的基础上再添加抓老鼠的方法

犬科可以在动物的基础上再添加看门的方法

犬科与猫科仍可以继续出现子类,如波斯猫、巴厘猫、沙皮狗、斑点狗等,而其子类仍可以再出现该品种的特性。

2、继承定义及使用格式

2.1、继承定义

class 子类 extends 父类{

//父类的非私有方法与属性均继承过来

}

如:

父类的定义:

class Person{

private String name;

public void eat(){

System.out.println(“吃饭”);

}

get/set方法

}

子类继承父类的定义:

class Chinese extends Person{}

2.2、继承使用

继承关系的产生通常是为了定义出功能更为具体、更为强大的子类。所以,定义子类后,一般创建子类对象使用。子类可以直接使用父类非私有的成员变量与成员方法

(注:如果成员变量没有使用private修饰,则子类也可直接访问。)

子类的使用:

class Test{

public static void main(String[] args) {

Chinese  c = new Chinese();

c.setName(“张大力”);

String name = c.getName();

System.out.println(name);//打印结果为张大力

c.eat();  //打印结果吃饭

}

3、继承注意事项

Java只支持单继承,不支持多继承。即只能有一个父类。

父类可以继续有父类。

所有类均有父类,只有Object类没有父类。

在所有使用父类类型的地方均可以传入其子类对象。

/*

* Animal的类

* 属性

*        name

*        age

* 行为

*        吃

*        睡

*/

public class Animal {

//成员变量

private String name;

private int age;

// //吃

// public abstract void eat(){

//    System.out.println(“吃”);

//    }

//睡

public void sleep(){

System.out.println("睡");

}

//-----------get/set-------------------

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

/*

*定义一个猫类

* 属性

*  name 

*  age

*  kind

* 行为

*  吃

*  睡

*  抓老鼠

*/

public class Cat extends Animal{

private String kind;

// @Override

// public void eat(){

//  System.out.println("猫吃鱼");

// }

//猫特有的功能  抓老鼠

public void catchMouse(){

System.out.println("抓耗子");

}

public String getKind() {

return kind;

}

public void setKind(String kind) {

this.kind = kind;

}

}

/*

*定义一个狗类

* 属性

*  name 

*  age

*  kind

* 行为

*  吃

*  睡

*  看门

*/

public class Dog extends Animal{

private String kind;

// @Override

// public void eat(){

//  System.out.println("狗吃肉");

// }

//狗特有功能  看门

public void lookDoor(){

System.out.println("看门");

}

public String getKind() {

return kind;

}

public void setKind(String kind) {

this.kind = kind;

}

}

/*

* 自定义类型 家

*

*  地址

*

* 行为

*  在家吃饭

*/

public class Home {

private String address;

//动物在家吃饭

//在所有使用父类类型的地方均可以传入其子类对象。

public void eatAtHome(Animal a){

//调用Animal的eat方法

//a.eat(); 

}

//狗在在家吃饭

// public void eatAtHome(Dog dog){

//  System.out.println("狗在家吃了");

//  //调用狗的eat方法

//  dog.eat();

// }

//猫在家吃饭

// public void eatAtHome(Cat cat){

//  System.out.println("猫在假吃了");

//  //调用猫的eat方法

//  cat.eat();

// }

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

}

/**

* 测试家类

*/

public class Test {

public static void main(String[] args) {

//  创建Home对象

Home home = new  Home();

//  Animal a = new Animal(); 

//  home.eatAtHome(a); 

//在所有使用父类类型的地方均可以传入其子类对象。

Dog d = new Dog();

home.eatAtHome(d);

Cat c = new Cat();

home.eatAtHome(c); 

}

}

4、方法重写

4.1、方法重写概念

当子类继承父类后,拥有了父类的成员并可以直接调用父类非私有方法。如果子类认为父类提供的方法不够强大,子类可以按照子类自身的逻辑重新定义继承过来的父类方法,这个重新定义一个方法的过程叫做方法重写。

(注:在学习完多态和抽象类后我们会对方法重写有更深的理解)

4.2、方法重写格式

子类中定义与父类一样的方法便将父类的方法重写了。此时,当创建子类对象,调用方法时,会调用子类重写后的方法。如:

子类中定义与父类一样的方法声明即是方法重写。

如:

父类定义:

public class Person{

private String name;

public void eat(){

System.out.println(“吃饭”);

}

get/set

}

子类定义:

public class Chinese extends Person{

@override //@override是用于强制规定当前定义的方法一定为重写的方法

public void eat() {

System.out.println(“按照中国的习惯,使用筷子吃”);

}

}

子类的使用:

public class Test{

public static void main(String[] args) {

Chinese  c = new Chinese();

c.setName(“张大力”);  //父类继承方法直接调用

String name = c.getName(); //父类继承方法直接调用

System.out.println(name); //打印结果为张大力

c.eat();  //方法重写后调用的为重写后的方法

//打印结果:按照中国的习惯,使用筷子吃

}

}

/**

* 自定义类型  人类

*

*    姓名  年龄

*/

public class Person {

String address;

private String name;

private int age;

public void eat(){

System.out.println("吃");   

}

public void sleep(){

System.out.println("睡");

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

/*

* 定义类型  学生类

*

* 姓名  年龄

*

* 继承

*  概念1  当定义一个类时,发现现有类与要定义的类类似,并且要定义的类属于现有类的一种时,

*  就可以将这个类定义为现有类的子类

*  子类拥有父类的所有属性与方法,无需重新定义。并且可以直接使用非私有的父类成员。

*  父类私用的成员变量  可以使用get/set方法 访问

*  父类私有的方法  没有办法直接方法  虽然继承了 但是相当于没有

*   

*  子类可以有自己特有的属性和方法

*  方法重写

*    子类继承父类后,可以直接使用父类的非私有成员,但是如果觉得父类的成员方法不够强大,子类可以按照自身的逻辑

*    将继承过来的父类方法,进行重写(方法重写,方法复写,方法覆盖)

*  可以使用@Override来验证你的方法是不是重写方法。

*/

public class Student extends Person{

private String number;

public void method(){

System.out.println(address);

System.out.println(getName());

}

//重写父类eat方法

@Override

public void eat(){

System.out.println("学生吃学生套餐");

}

public String getNumber() {

return number;

}

public void setNumber(String number) {

this.number = number;

}

}

/*

* 测试继承后的Studnet

*/

public class Test {

public static void main(String[] args) {

//创建Studnet对象

Student s = new Student();

s.setName("柳柳");

s.setNumber("0900112");

s.eat();

//  s.sleep();

String name = s.getName();

System.out.println(name);

System.out.println(s.getNumber());

System.out.println("-----------------");

//子类调用自己特有的方法

s.method(); 

}

}

4.3、Java中方法重写规则

子类重写方法时,在声明前加@Override可检测该方法是否为重写的方法

访问权限相同或子类方法访问权限更大(访问权限顺序public>默认)

class Fu{

void show(){}

public void method(){}

}

class Zi extends Fu{

public void show(){}  //编译运行没问题

void method(){}      //编译错误

}

方法名称必须相同

参数列表必须相同

返回值为基本类型时必须相同

返回值为引用类型时相同或子类小(了解)

/*

* 方法重写的注意事项

*  子类重写方法时,在声明前加@Override可检测该方法是否为重写的方法

*  访问权限相同或子类方法访问权限更大(访问权限顺序public>默认)

*  方法名称必须相同

*  参数列表必须相同

*  返回值为基本类型时必须相同

*  返回值为引用类型时相同或子类小(了解)

*/

public class Fu {

public void method(){

System.out.println(" 父类方法");

}

public int sum(){

return 0;

}

public Person get(){

return null;

}

}

public class Zi extends Fu{

//访问权限相同或子类方法访问权限更大(访问权限顺序public>默认)

@Override

public void method(){

System.out.println("子类方法");

}

//返回值为基本类型时必须相同

@Override

public int sum(){

return 100;

}

//返回值为引用类型时相同或子类小(了解)

@Override

public Student get(){

return null;

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容

  • DAY 05 1、 public classArrayDemo { public static void mai...
    周书达阅读 657评论 0 0
  • Java OOP 什么是面向对象思想? 把一组数据和处理他们的方法组成对象(object),把相同行为的对象归纳为...
    chonglingliu阅读 777评论 0 1
  • 今天的主要内容是构造方法,static用法,继承,多态,抽象类,接口。由于从今天开始JAVA的学习基本上都是面向对...
    没说再见阅读 448评论 0 0
  • 管理的本质是激发善意。
    大娟子阅读 159评论 0 0
  • 夜的钢琴曲六 - 石进 点击欣赏 宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒。 远遁 朦胧的夜空下 ...
    苏城之歌阅读 1,818评论 21 41