Java继承笔记

目录

1.概述

2.格式

3.继承中子类的特点

4.继承的好处和弊端

5.什么时候使用继承

6.继承中变量的访问特点

7.super关键字

8.继承中构造方法的访问特点

9.继承中成员方法的访问特点

10.方法重写

11.方法重写注意事项

12.Java中继承的注意事项

案例请点链接:

猫和狗案例_m0_51664084的博客-CSDN博客

老师和学生案例_m0_51664084的博客-CSDN博客


1.概述

继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。

2.格式

public class 子类名 extends 父类名{

}

3.继承中子类的特点

  1. 子类可以有父类的内容
  2. 子类还可以有自己的内容

代码案例:

父类:

public class Fu {
	public void show() {
		System.out.println("show方法被调用");
	}
}

子类:

public class Zi extends Fu{
	public void method() {
		System.out.println("method方法被调用");
	}
}

测试类:

public class Demo {

	public static void main(String[] args) {
		//创建对象,调用方法
		Fu f = new Fu();
		f.show();
		
		Zi z = new Zi();
		z.method();
		z.show();
	}

}

运行结果:

show方法被调用
method方法被调用
show方法被调用

4.继承的好处和弊端

  1. 好处:                                                                                                                                        提高了代码的复用性(多个类相同的成员可以放到同一个类中)                                              提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
  2. 弊端:                                                                                                                                        继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性。

5.什么时候使用继承

  • 继承体现的关系:is a
  • 假设法:我有俩个类A和B,如果它们满足A是B的一种,或者B是A的一种,就说明它们存在继承关系,这个时候就可以考虑使用继承来实现,否则就不能滥用继承。
  • 举例:苹果和水果,猫和动物。

6.继承中变量的访问特点

在子类方法中访问一个变量:

先在子类局部范围找

再在子类成员范围找

然后在父类成员范围找

如果都没有就报错(不考虑父亲的父亲)


代码案例:

父类:

public class Fu {
	public int age = 40;
	
}

子类:

public class Zi extends Fu{
	public int height = 175;
	public int age = 20;
	
	public void show() {
		int age = 30;
		System.out.println(age);
		System.out.println(height);
		//报错
		//System.out.println(weight);
	}
}

测试类:

public class Demo {

	public static void main(String[] args) {
		//创建对象,调用方法
		Zi z = new Zi();
		z.show();
	}

}

运行结果:

30
175

7.super关键字

super关键字的用法和this关键字的用法相似

this:代表本类对象的引用(this关键字指向调用该方法的对象,一般我们是在当前类中使用this关键字,所以我们常说this代表本类对象的引用)

super:代表父类存储空间的标识(可以理解为父类对象引用)

 代码案例:

父类:

public class Fu {
	public int age = 40;
}

 子类:

public class Zi extends Fu{
	public int age = 20;
	
	public void show() {
		int age = 30;
		
		//如何访问局部变量的age?
		System.out.println(age);
		
		//如何访问本类的成员变量age?
		System.out.println(this.age);
		
		//如何访问父类的成员变量age?
		System.out.println(super.age);
	}
}

测试类:

public class Demo {

	public static void main(String[] args) {
		//创建对象,调用方法
		Zi z = new Zi();
		z.show();
	}

}

运行结果:

30
20
40

8.继承中构造方法的访问特点

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

  • 因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。
  • 每一个子类构造方法的第一条语句默认都是super();

如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?

  • 通过使用super关键字去显示的调用父类的带参构造方法
  • 在父类中自己提供一个无参构造方法

代码案例:

父类:

public class Fu {
	public Fu() {
		System.out.println("Fu中无参构造方法被调用");
	}

	public Fu(int age) {
		System.out.println("Fu中带参构造方法被调用");
	}
	
}

子类:

public class Zi extends Fu{
	public Zi() {
		//super(20);
		System.out.println("Zi中无参构造方法被调用");
	}
	
	public Zi(int age) {
		//super(20);
		System.out.println("Zi中带参构造方法被调用");
	}
}

测试类:

package ch04;

public class Demo {

	public static void main(String[] args) {
		//创建对象
		Zi z = new Zi();
		Zi z2 = new Zi(20);
	}

}

运行结果:

Fu中无参构造方法被调用
Zi中无参构造方法被调用
Fu中无参构造方法被调用
Zi中带参构造方法被调用

9.继承中成员方法的访问特点

通过子类对象访问一个方法

  • 子类成员范围找
  • 父类成员范围找
  • 如果都没有就报错(不考虑父类的父类)

代码案例:

父类:

public class Fu {
	
	public void show() {
		System.out.println("Fu中show()方法被调用");
	}
}

子类:

public class Zi extends Fu{
	
	public void method() {
		System.out.println("Zi中method()方法被调用");
	}
	
	public void show() {
		super.show();
		System.out.println("Zi中show()方法被调用");
	}
}

测试类:

public class Demo {

	public static void main(String[] args) {
		//创建对象,调用方法
		Zi z = new Zi();
		z.method();
		z.show();
		//报错
		//z.test();
	}

}

运行结果:

Zi中method()方法被调用
Fu中show()方法被调用
Zi中show()方法被调用

10.方法重写

概述:子类中出现了和父类一模一样的方法声明。

应用:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。

代码案例练习

Phone类

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

NewPhone类

public class NewPhone extends Phone{
	
	@Override
	public void call(String name) {
		System.out.println("开启视频功能");
		//System.out.println("给"+name+"打电话");
		super.call(name);
	}

}

@Override:是一个注解,可以帮助我们检查重写方法的方法声明的正确性。

PhoneTest类:

public class PhoneTest {

	public static void main(String[] args) {
		//创建对象,调用方法
		Phone p = new Phone();
		p.call("小明");
		System.out.println("-----");
		
		NewPhone np = new NewPhone();
		np.call("小明");
	}

}

11.方法重写注意事项

  • 私有方法不能被重写(父类私有成员子类是不能继承的)
  • 子类方法访问权限应该高于父类方法访问权限(public>默认>private)

父类: 

public class Fu {
	private void show() {
		System.out.println("Fu中show()方法被调用");
	}
	
	void method() {
		System.out.println("Fu中method方法被调用");
	}
}

子类:

public class Zi extends Fu{
	
	/*会报错
	@Override
	private void show() {
		System.out.println("Zi中show()方法被调用");
	}
	*/
	
	@Override
	public void method() {
		System.out.println("Zi中method()方法被调用");
	}
}

12.Java中继承的注意事项

  • Java中类只支持单继承,不支持多继承
  • Java中类支持多层继承 

Granddad类:

public class Granddad {
	public void drink() {
		System.out.println("爷爷爱喝酒");
	}
}

Father类:

public class Father extends Granddad{
	public void smoke() {
		System.out.println("爸爸爱抽烟");
	}
}

Mother类:

public class Mother {
	public void dance() {
		System.out.println("妈妈爱跳舞");
	}
}

Son类:

/*报错
public class Son extends Father, Mother{
	
	*/

public class Son extends Father{
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心比对错重要

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值