Java基础——继承

一、继承概述

面向对象的三大特性:封装、继承、多态。继承是多态的前提,如果没有继承,就没有多态。

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

继承关系中的特点:

1.子类可以拥有父类的“内容”;

2.子类还可以拥有自己专有的内容。

二、继承的格式

/*

在继承的关系中,“子类就是一个父类”。也就是说,子类可以被当做父类看待。

例如父类是员工,子类是讲师,那么“讲师就是一个员工”。关系:is-a。

定义父类的格式:(一个普通的类定义)public class 父类名称{

// ...

}

定义子类的格式:public class 子类名称 extends 父类名称{

// ...

}

*/

public class Demo01Extends {

public static void main(String[] args) {

// 创建了一个子类对象

        Teacher teacher =new Teacher();

        // Teacher类当中虽然什么都没写,但是会继承来自父类的method方法。

        teacher.method();

        // 创建另一个子类助教的对象

        Assistant assistant =new Assistant();

        assistant.method();

    }

}

父类:

// 定义一个父类:员工

public class Employee {

public void method() {

System.out.println("方法执行!");

    }

}

子类:

// 定义了员工的另一个子类:助教

public class Assistantextends Employee {

}

// 定义了一个员工的子类:讲师

public class Teacherextends Employee {

}

三、继承中成员变量的访问特点

父类:

public class Fu {

int numFu =10;

    int num =100;

    public void methodFu() {

// 使用的是本类当中的,不会向下找子类的

        System.out.println(num);

    }

}

子类:

public class Ziextends Fu {

int numZi =20;

    int num =200;

    public void methodZi() {

// 因为本类当中有num,所以这里用的是本类的num

        System.out.println(num);

    }

}

/*

在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:

直接通过子类对象访问成员变量:

等号左边是谁,就优先用谁,没有则向上找。

间接通过成员方法访问成员变量:

    该方法属于谁,就优先用谁,没有则向上找。*/

public class Demo01ExtendsField {

public static void main(String[] args) {

Fu fu =new Fu(); // 创建父类对象

        System.out.println(fu.numFu); // 只能使用父类的东西,没有任何子类内容

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

        Zi zi =new Zi();

        System.out.println(zi.numFu); // 10

        System.out.println(zi.numZi); // 20

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

        // 等号左边是谁,就优先用谁

        System.out.println(zi.num); // 优先子类,200

//        System.out.println(zi.abc); // 到处都没有,编译报错!

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

        // 这个方法是子类的,优先用子类的,没有再向上找

        zi.methodZi(); // 200

        // 这个方法是在父类当中定义的,

        zi.methodFu(); // 100

    }

}

四、区分子类方法中重名的三种

/*

局部变量:        直接写成员变量名

本类的成员变量:    this.成员变量名

父类的成员变量:    super.成员变量名*/

public class Demo01ExtendsField {

public static void main(String[] args) {

Zi zi =new Zi();

        zi.method();

    }

}

父类:

public class Fu {

int num =10;

}

子类:

public class Ziextends Fu {

int num =20;

    public void method() {

int num =30;

        System.out.println(num); // 30,局部变量

        System.out.println(this.num); // 20,本类的成员变量

        System.out.println(super.num); // 10,父类的成员变量

    }

}

五、继承中成员方法的访问(重写)

父类:

public class Fu {

public void methodFu() {

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

    }

public void method() {

System.out.println("父类重名方法执行!");

    }

}

子类:

public class Ziextends Fu {

public void methodZi() {

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

    }

public void method() {

System.out.println("子类重名方法执行!");

    }

}

/*

在父子类的继承关系当中,创建子类对象,访问成员方法的规则:

创建的对象是谁,就优先用谁,如果没有则向上找。

注意事项:

无论是成员方法还是成员变量,如果没有都是向上找父类,绝对不会向下找子类的。

重写(Override)

概念:在继承关系当中,方法的名称一样,参数列表也一样。

重写(Override):方法的名称一样,参数列表【也一样】。覆盖、覆写。

重载(Overload):方法的名称一样,参数列表【不一样】。

方法的覆盖重写特点:创建的是子类对象,则优先用子类方法。*/

public class Demo01ExtendsMethod {

public static void main(String[] args) {

Zi zi =new Zi();

        zi.methodFu();

        zi.methodZi();

        // 创建的是new了子类对象,所以优先用子类方法

        zi.method();

    }

}

六、方法覆盖重写的注意事项

方法覆盖重写的注意事项:

1. 必须保证父子类之间方法的名称相同,参数列表也相同。

@Override:写在方法前面,用来检测是不是有效的正确覆盖重写。

这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。

2. 子类方法的返回值必须【小于等于】父类方法的返回值范围。

小扩展提示:java.lang.Object类是所有类的公共最高父类(祖宗类),java.lang.String就是Object的子类。

3. 子类方法的权限必须【大于等于】父类方法的权限修饰符。

小扩展提示:public > protected > (default) > private

备注:(default)不是关键字default,而是什么都不写,留空。

七、继承中父、子类构造方法的访问特点

继承关系中,父子类构造方法的访问特点:

1. 子类构造方法当中有一个默认隐含的“super()”调用,所以一定是先调用的父类构造,后执行的子类构造。

2. 子类构造可以通过super关键字来调用父类重载构造。

3. super的父类构造调用,必须是子类构造方法的第一个语句。不能一个子类构造调用多次super构造。

总结:

子类必须调用父类构造方法,不写则赠送super();写了则用写的指定的super调用,super只能有一个,还必须是第一个。

八、super关键字的用法

super关键字的用法有三种:

1. 在子类的成员方法中,访问父类的成员变量。

2. 在子类的成员方法中,访问父类的成员方法。

3. 在子类的构造方法中,访问父类的构造方法。

九、this关键字的用法

super关键字用来访问父类内容,而this关键字用来访问本类内容。

用法也有三种:

1. 在本类的成员方法中,访问本类的成员变量。

2. 在本类的成员方法中,访问本类的另一个成员方法。

3. 在本类的构造方法中,访问本类的另一个构造方法。

在第三种用法当中要注意:

A. this(...)调用也必须是构造方法的第一个语句,唯一一个。

B. super和this两种构造调用,不能同时使用。

十、this和super关键字图解

十一、Java继承的三个特点

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