继承

6、继承

好处:

​ 提高了代码的复用性

​ 提高了代码的维护性

​ 让类与类之间产生了关系,是多态的前提(耦合性很强)

概述:

​ 单独的这个类被称为父类,基类或超类,这多个类可以成为子类或者派生类

格式

class Fu{

}

class Zi extends Fu {

}

class Student extends Person {
	public Student() {
	}
}

class Teacher extends Person{
	public Teacher() {
	}
}

class Person {
	String name;
	int age;

	public Person() {
	}
	public void eat() {
		System.out.println("吃饭");
	}
}
特点

A.Java 只支持单继承,不支持多继承

B.Java中支持多层继承(继承体系)

public class ExtendDemo {
	public static void main(String[] args) {
		Son s =new Son();
		s.method();//使用爷爷的
		s.show(); //使用父亲的
	}

}

class GrandFather {
	public void method() {
		System.out.println("我是爷爷");
	}
}

class Father extends GrandFather {
	public void show() {
		System.out.println("我是老子");
	}
}

class Son extends Father {

}
注意事项

A.子类只能继承父类所有非私有的成员(成员方法和成员变量)

但是可以在父类定义共有方法,用共有方法访问父类的私有成员变量,再调用这个公有方法

public class ExtendDemo {
	public static void main(String[] args) {
		Son s =new Son();
	
		s.show(); 
	}

}

class Father {
	private int num1 = 20;
	private int num2 = 10;
	public void show() {
		System.out.println(num1);
		System.out.println(num2);
	}
}

class Son extends Father {

}

B.子类不能继承父类的构造方法,但是可以通过super(关键字)去访问父类的构造方法

C.不要为了部分功能去继承

什么时候使用继承?

​ 继承体现的是一种关系:“is a”

​ Person

​ Student

​ Teacher

​ 水果

​ 苹果

​ 香蕉

采用假设法:如果有两个类A、B,A是B的一种,或者,B是A的一种

类的组成部分关系

类:

成员变量、成员方法、构造方法

成员变量关系:

​ A:子类中成员变量和父类中成员变量名称不同
在这里插入图片描述
​ B:子类中成员变量和父类中成员变量名称相同,在子类中变量查找顺序:1子类方法局部范围 2子类成员范围 3父类成员范围 4还找不到就报错.(类与类之间平级不能访问另一个类内部的内容)

在这里插入图片描述

就近原则。

访问局部范围num、本类成员范围num、父类成员范围num

在这里插入图片描述

this和 super的应用与区别

区别:

​ this 代表本类对应的引用

​ super 父类存储空间标识(父类引用)

怎么用?

​ 1、调用成员变量:this.成员变量 、super.成员变量

​ 2、调用构造方法:this(…) 、 super(…)

​ 3、调用成员方法 :this.成员方法 、super.成员方法

public class ExtendDemo {
	public static void main(String[] args) {
		Son s = new Son();
		s.show();

	}

}

class Father {
	public int num = 10;

}

class Son extends Father {
	public int num = 20;

	public void show() {
		int num = 30;
		System.out.println(num);
		System.out.println(this.num); //输出本类成员num
		System.out.println(super.num);//输出父类成员num
	}

}
继承中构造方法关系

子类中所有的构造方法默认都会访问父类中空参数构造方法

因为子类会继承父类中数据,可能还会使用父类数据。所以,子类初始化之前一定要完成父类数据的初始化

注意:

​ 子类构造方法第一条语句 默认 super();super()写不写都存在。
在这里插入图片描述
注意事项:如果父类没有无参构造方法,子类构造方法报错。

面试题

看程序写结果

一、
在这里插入图片描述

二、

在这里插入图片描述
类的加载: 静态代码块父 、静态代码块子

构造: 构造代码块父、构造方法父、构造代码块子、构造方法子

三、

在这里插入图片描述
main方法–>new Z 继承X 走X------走父亲(一个类)初始化,先走成员变量初始化—走new Y-----classY ------打印Y------class X成员变量初始化完毕-----走构造方法 X()-----打印X-----同理父类结束进入子类

结果: Y—X ----Y----Z

在这里插入图片描述

继承中成员方法关系

子类中方法和父类中声明不一样

在这里插入图片描述
子类中方法和父类中声明一样

​ 子类对象调用方法:

​ 先找子类中有没有这个方法,有就使用

​ 再看父类中有没有这个方法,有就使用

​ 没有就报错

在这里插入图片描述

方法重写的应用

方法重写:子类中出现了和父类中方法声明一摸一样的方法

​ 沿袭了父类的功能,又定义了子类特有的内容

方法重载: 本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关

子类对象调用方法时:

​ 先找子类本身,再找父类

public class PhoneDemo {
	public static void main(String[] args) {
		NewPhone np = new NewPhone();
		np.call("林青霞");
	}

}

class Phone{
	public void call(String name) {
		System.out.println("给"+name+"打电话");
	}
}

class NewPhone extends Phone{
	public void call(String name) {
		//System.out.println("给"+name+"打电话");
		super.call(name);
		System.out.println("可以听天气预报");
	}
}

注意事项:

​ 父类私有方法不能被重写 ,因为父类私有方法子类根本无法继承

​ 子类重写父类方法时,访问权限不能更低。最好一致

面试题

1 、Override:方法重写 、Overload:方法重载 的区别?方法重载能改变返回值类型吗?

Override:在子类,出现和父类中一模一样的方法声明现象

Overload:同一类中出现的方法名相同,参数列表不同的现象

方法重载能改变返回值类型,因为他和返回值类型无关。

2、this 关键字 和 super 关键字分别代表什么?以及他们各自的使用场景和作用

this:代表当前类的对象引用

super:代表父类存储空间的标识(可以理解为父类的引用,通过这个东西可以访问父类的成员)

场景:

​ 成员变量:

​ this.成员变量

​ super.成员变量

​ 构造方法 :

​ this.(…)

​ super(…)

​ 成员方法:

​ this.成员方法

​ super.成员方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值