详述重写

详述重写

一、为什么重写?
子类可以继承父类方法,但有时从父类继承的方法在子类中必须进行修改以适应新类的需要,这种对父类方法进行改写或改造的现象称为方法重写或方法覆盖。父类方法在子类中重写使继承更加灵活。

public class Father {
	public void eat( ) {
		System.out.println("用筷子吃饭.......");
	}
}
public class Student extends Father{
	@Override
	public void eat( ) {
		System.out.println("用刀叉吃饭.......");
	}
	
	public static void main(String[] args) {
		Student student = new Student();
		student.eat( );
		new Father().eat( );
	}
}

在这里插入图片描述
在没有重写eat 方法之前,子类继承Father类,子类对象调用eat方法使用的是父类的eat方法,子类继承自父类的eat方法已经不能准确描述子类的行为特征,因此需要重写eat方法。
二、什么是重写?
重写就是重新改写,将一个已有的事物进行某些改变已适应新的要求。
子类重写了父类的方法,则使用子类创建的对象调用该方法时,调用的是重写后的方法,即子类中的方法,如果想要调用父类被重写的方法:①在子类的非静态代码块或方法中调用父类中被重写的方法通过关键字super实现。②在子类的静态代码块或方法中调用父类中被重写的方法需要创建父类对象。

public class Father {
	public void eat() {
		System.out.println("用筷子吃饭.......");
	}
}
public class Student extends Father{
	@Override
	public void eat( ) {
		System.out.println("用刀叉吃饭.......");
	}
	{
		super.eat();
	}
	static {
		new Father().eat();
	}
	public static void main(String[] args) {
		Student student = new Student();
		student.eat();
		new Father().eat();
	}

在这里插入图片描述
三、怎么重写?
@Override可以判断当前方法是否重写了父类的某个方法,如果在方法上加上该注解没有报错,则说明重写了父类方法,否则没有重写父类方法。
1、方法名和参数列表
子类重写的方法和父类方法在方法名和参数列表方面相同。

public class Father {
	public void eat(String str) {
		System.out.println("用筷子吃饭.......");
	}
}
public class Student extends Father{
	@Override
	public void eat(String a) {
		System.out.println("用刀叉吃饭.......");
	}
	public static void main(String[] args) {
		Student student = new Student();
		student.eat("a");
		new Father().eat("b");
	}
}

在这里插入图片描述
如果将子类重写方法的参数类型改为int,程序将会报错。
2、返回值类型
①如果父类被重写方法没有返回值类型或返回值类型为基本数据类型则子类重写方法的返回值类型应与父类被重写方法的返回值类型相同。
②如果父类被重写方法的返回值能类型是引用类型则子类重写方法的返回值类型要么与父类被重写方法的返回值类型相同要么是父类被重写方法的返回值类型的子类但不能是基本数据类型。

public class Father {
	public Object eat() {
		System.out.println("用筷子吃饭.......");
		return "rice";
	}
}
public class Student extends Father{
	@Override
	public String eat() {
		System.out.println("用刀叉吃饭.......");
		return "meat";
	}
	
	public static void main(String[] args) {
		Student student = new Student();
		student.eat();
		new Father().eat();
	}
}

在这里插入图片描述
Object类是所有类的父类,因此父类中被重写方法的返回值类型是Object时,子类重写方法的返回值类型可以是任何类。
3、访问权限
子类重写方法的访问权限不能小于父类被重写方法的访问权限,子类重写方法的访问权限必须大于等于父类被重写方法的访问权限。

public class Father {
	protected Object eat() {
		System.out.println("用筷子吃饭.......");
		return "rice";
	}
}
public class Student extends Father{
	@Override
	public String eat() {
		System.out.println("用刀叉吃饭.......");
		return "meat";
	}
	
	public static void main(String[] args) {
		Student student = new Student();
		student.eat();
		new Father().eat();
	}
}

在这里插入图片描述
父类被重写方法的访问权限是protected,子类重写方法的访问权限是public。
访问权限大小:
public>protected>friendly>private
4、父类中的静态方法可以被子类继承,但不能被子类重写

public class Father {
	public static Object eat() {
		System.out.println("用筷子吃饭.......");
		return "rice";
	}
}
public class Student extends Father{
	@Override
	public String eat() {
		System.out.println("用刀叉吃饭.......");
		return "meat";
	}
	
	public static void main(String[] args) {
		Student student = new Student();
		student.eat();
		new Father().eat();
	}
}

子类中被重写的方法报错
5、重写父类非静态方法时,重写后的方法不能被static修饰
在这里插入图片描述
在这里插入图片描述
重写的eat()方法报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值