黑马程序员-继承

类用于描述事物。

父类的由来,子类不断向上抽取。

继承:

1.提高了代码的复用性。

2.让类与类之间产生了关系,有了这个关系,才有了多态的特性。

注意:不要为了获取其他类的功能,简化代码而继承。

必须是类与类之间有所属关系才可以继承。所属关系is a.

java不支持多继承。多继承带来隐患;当多个类中定义了相同的功能(如一个方法)时,当功能内容不同时,子类不确定要运行哪个。但是支持多实现。但是接口可以多继承。

java支持多层继承。也就是一个体系。A extends B C extends A

问题:继承体系在具体调用时,要创建最子类的对象,为什么?

1.父类可能不能创建对象。

2.创建子类对象可以使用更多的功能,包括基本的和特有的。

体系结构:

简单一句话:查阅父类功能,创建子类对象使用功能

继承的弊端:打破了封装性。

子父类出现后,类成员的特点:

类中成员;

1,变量 2,函数 3,构造函数

如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量,用this,

子类要访问父类中的同名变量,用super.

super的使用和this的使用几乎一致。

this代表的是本类对象的引用,super代表的是父类对象的引用。

this,super存在非静态方法区。

子父类在内存:new zi分配两个属性空间:一个空间存放zi-num,一个空间存放
fu-num(即使是private,仍存在,只是访问有权限),子父类的.class文件加载:fu.class先加载,zi.class后加载。

方法区:fu:存放方法show(); 
zi:存放的是haha()【注意没有show】,但是有this,super引用。super.show(),

即可访问父类方法。

class fu{

int num=4;

void show(){}

}

class zi extends fu{

//子类没有num时,两种理解方式:1.num是子的属性,省略this 2.this,super指向同一num;

void haha(){

System.out.println(num);

}}

当子类继承父类,功能相同,内容不同时,使用覆盖,保留父类的功能,但是改变的父类的内容。

重载;只看同名函数的参数类型。

子类覆盖父类要遵循“两同两小一大”

“两同”即方法名相同,形参列表相同

“两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等

“一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。

注意:覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法一个是实例方法,

否则编译出错,静态只能覆盖静态。

override 和 overload的区别:

两者都是多态的表现形式。override是子类与父类的多态性,对父类的函数进行重新定义。overload是一个类中的多态表现。

override的复写要遵循“两同”,“两小”和“一大”。

3.子父类中的构造函数

在对子父类对象进行初始化时,父类构造函数也会运行,那是因为子类

的构造函数默认第一行有一条隐式的语句super();

super();会访问父类中的空参数的构造函数。

而且子类中所有的构造函数的第一行默认都是super();

如果父类的构造函数有参数,子类的构造函数要手动调用父类构造函数,super(x)

构造函数:用super 一般函数:用super.(多了一个点)

问题:为什么子类函数一定要访问父类函数。

因为父类中的数据,子类可以直接获取。所以子类对象在建立时,需要查看父类是

怎样初始化这些数据的(如果父类num=60,那么子类在定义num=60,无意义)。

所以要访问父类中指定的构造函数,可以通过手动定义super()语句来实现。

问题:supe语句一定要在子类构造函数的第一行。为了先初始化父类,再初始化子类,如果不

放在第一行,相当于先初始化子类(调用this),再初始化父类,那么父类岂不是

把子类给覆盖了。不可以。

结论;

子类的【所有的构造函数】,默认都会访问父类中的【空参数的构造函数】(不是默认构造函数)

因为子类每一个构造函数内的第一行都有一句隐式的super();

当父类中没有空参数的构造函数时,子类必须手动指定super语句来访问父类中的构造函数。

当然;子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。

子类中至少会有一个构造函数会访问父类中的构造函数。

注:

1.为什么super,和this不能再同一个构造函数中,必须要放在第一行。

2.为什么要放在第一行:初始化动作先执行。

练习1;

class fu{

fu(){

System.out.println("fu run");

}}

class zi extends fu {

zi(){

//super(); 在子类中隐藏了

System.out.println("zi run");

}

zi(int x){

this();//不会再有super(),有岂不是要放在第二行了,那么要如何访问父类呢,先调用本类无参gahs,在通过它,调用父类的。

System.out.println("zi....+4");

}}

练习2;

class fu{

fu(String str){

System.out.println("haha");

}}

/*

class fu{

fu(){

System.out.println("fu run");

}}

*/

class zi extends fu {

zi(){

super("haha");//不管构造方法是否调用(现在不用以后可能会用,说以有可能出错,java不允许),

//父类没有无参构造函数,子类都要手动调用,

//因为如果不手动,会默认super(),但是父类没有无参构造函数,报错。

//super(); 任何一个子类中都隐藏了super,除非手动写上this.

System.out.println("zi run");

}

zi(int x){

super("hahaa");

//this();//有this,不会再有super(),有岂不是要放在第二行了,那么要如何访问父类呢,

//先调用本类无参gahs,在通过它,调用父类的。但是this()不是隐士的,隐士的是super();

//如果不指定,它不会访问子类的的无参构造函数。

System.out.println("zi....+4");

}

}

子父类小练习1:

class Super{

int i=0;

public Super() {

System.out.println("B");

i+=2;

System.out.println(i+"...");//i=2

}}

class Demo3 extends Super{

public Demo3(String
a){

System.out.println("C");

i+=5;

}

public static void main(String[]
args)  {

int
i=4;

Super
d=new Demo3("A");

System.out.println(d.i);

}}

字父类小练习2:

class fu1{

final int x= 3;

public final void
show(){//final修饰的方法可以被继承。

System.out.println(x);//x变量有一个super

}

}

class zi1 extends fu1{

public final int x =4;

}

class Demo4 {

public static void
main(String[] args)   {

zi1 z= new zi1();

z.show();

System.out.println(z.x);

}

}

黑马程序员-继承,布布扣,bubuko.com

时间: 2024-10-26 09:38:30

黑马程序员-继承的相关文章

黑马程序员------继承(三)

1.1 多态:可以理解为某一类事物存在的多种体现形态. 人:男人,女人 动物:猫,狗. 猫 x = new 猫(); 动物 x = new 猫(); 1,体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,好处 多态的出现大大的提高程序的扩展性. 4,弊端: 提高了扩展性,但是只能使用父类的引用访问父类中的成员. 示例1: 1 /* 2 动物, 3 猫,狗. 4 */ 5 6 abs

黑马程序员------继承(一)

4.1 继承的描述 通过 extends 关键字让类与类之间产生继承关系.    多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可.    多个类可以称为子类,单独这个类称为父类或者超类. P.S.    1.子类可以直接访问父类中的非私有的属性和行为.    2.子类无法继承父类中私有的内容.    3.父类怎么来的?共性不断向上抽取而来的.

黑马程序员-OC面向对象继承关系和组合关系笔记

继承关系是描述类和类之间的关系,两个类分别称为子类和父类,子类继承了父类,子类就拥有了父类的属性和方法: 继承的关系特点描述出来就是:** "是" **  (例如:学生类 是 人类) 组合关系描述的语句是:**** "拥有" ***  (例如:学生有成绩这个属性,而成绩属性本来就是一个成绩类的对象 ) 继承示例代码: #import <Foundation/Foundation.h> //Animal类的声明 @interface Animal : NS

黑马程序员 面向对象(上) 封住,继承,多态,以及this和super的用法

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ----------------------/* * 一.类的继承: 当多个类出现了相同的属性和行为时,我们可以把这些类中相同的属性和行为抽取出来 成为独立的一个类,然后让这些类分别去继承抽取类,再根据自己需求去实现别的功能 这样大大的增强的相同代码的复用性,也使代码变得美观 我们把这个抽取类叫做这些类的父类,这些类叫做抽取类的子类,子类是可以继承父类中 的所有信息. 在Java中所有的类

黑马程序员------IO(五)

黑马程序员------IO(五) 1.1  操作对象(示例1)ObjectInputStream与ObjectOutputStream 被操作的对象需要实现Serializable. Serializable:用于给被序列化的类加入ID号,用于判断类和对象是否是同一个版本 类通过实现java.io.Serializable接口以启用序列化功能,Serializable只是一个标记接口. 1 示例1: 2 import java.io.*; 3 4 class ObjectStreamDemo 5

黑马程序员_关于黑马java班入学测试技术分享-后五(二)

??????????????????????????????????????????????????????????????????????????-----Java培训.Android培训.iOS培训..Net培训.期待与您交流! 作为本人首篇黑马技术博客有必要交代一下背景.个人理解博客的用作在于于己在于交流,于他在于学习,在交流学习中共同成长.下面进入正题.本文主要是介绍在做黑马入门测试时的一些问题(这个应该不是泄露题库吧). 本文只要是讲述黑马程序员基础测试题的6-10题,回过头来分析明显

黑马程序员_集合

集合1.集合和对象数组的区别: 数组的长度不可变,集合的可变: 数组可以存储基本数据类型和对象,集合只能存储对象. 集合的框架图 集合派系的顶层接口Collection1.Collection集合存储对象的方法: add(E e)将元素存储到集合中 addAll(Collection c)将一个集合添加到另外的集合中2.Collection集合提取对象的方法: 通过迭代器iterator中的方法:hasNext()和next()来取出 Iterator it=new iterator(); wh

黑马程序员_JAVA 基础加强学习笔记

一.面向对象 (一)继承  1.继承的好处: (1) 提高了代码的复用性. (2) 让类与类之间产生了关系,提供了另一个特征多态的前提. 注意: 子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();  如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数. 如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数. 2.final特点

黑马程序员学习笔记_OC之给NSString增加分类

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>.<a href="http://www.itheima.com"target="blank">.Net培训</a>.期待与您交流! ---------------------- 黑马程序员学习笔记_OC