java——方法重写

1、为什么重写?
为了更准确的描述子类的行为特征
比如:当子类的行为与父类的某个行为不同时

父类
package javalearn;
public class Hello {

	String name;
	
	void speak(){
		System.out.println(name+"正在说中文......");
	}
	
	public static void main(String[] args) {
		Hello student = new Hello();
		student.name="shiiqing";
		student.speak();
	}
}

子类
package javalearn;

public class World extends Hello {
	@Override
	void speak(){
		System.out.println(name+"正在说英语......");//与父类的不同
	}

	public static void main(String[] args) {
		World world=new World();
		world.name="shiqing";
		world.speak();
	}
}

2、什么是重写?
重新改写父类的某个方法

3、怎么重写?
(1)在方法前加上注解,@Override,表示重写覆盖,如果不是重写,加上注解会出现错误

@Override
	void speak(){
		System.out.println(name+"正在说英语......");//与父类的不同
	}

(2)如果父类中的方法加了final或static,则不能被重写,但是可以被继承

(3)重写后的方法的访问权限不能小于父类的
访问权限从大到小:public、protected、默认、private

例如:

父类
package javalearn;
public class Hello {

	String name;
	
	void speak(){
		System.out.println(name+"正在说中文......");
	}
	
	public static void main(String[] args) {
		Hello student = new Hello();
		student.name="shiiqing";
		student.speak();
	}
}

子类
package javalearn;

public class World extends Hello {
	@Override
	protected void speak(){   //访问权限大于父类的
		System.out.println(name+"正在说英语......");//与父类的不同
	}

	public static void main(String[] args) {
		World world=new World();
		world.name="shiqing";
		world.speak();
	}
}

(4)重写后的方法的方法名和参数列表(参数个数和参数类型)要与父类中的相同

(5)如果父类的返回值类型是void或基本数据类型,那么子类的要与其一致
注:必须一模一样,不存在之前定义数据类型那样的存储范围要大于或等于

例如:

父类
package javalearn;
public class Hello {

	String name;
	
	void speak(){  //void类型
		System.out.println(name+"正在说中文......");
	}
	
	public static void main(String[] args) {
		Hello student = new Hello();
		student.name="shiiqing";
		student.speak();
	}
}

子类
package javalearn;

public class World extends Hello {
	@Override
	void speak(){ //void类型
		System.out.println(name+"正在说英语......");//与父类的不同
	}

	public static void main(String[] args) {
		World world=new World();
		world.name="shiqing";
		world.speak();
	}
}

(6)如果父类返回的是引用类型,那么子类的返回类型要么和父类一致,要么是父类返回值类型的子类
例如:

父类
package javalearn;
public class Hello {

	String name;
	
	Object speak(){//Object类
		System.out.println(name+"正在说中文......");
	}
	
	public static void main(String[] args) {
		Hello student = new Hello();
		student.name="shiiqing";
		student.speak();
	}
}

子类
package javalearn;

public class World extends Hello {
	@Override
	Object speak(){   //还可以是String等等,Object是所有类的父类
		System.out.println(name+"正在说英语......");//与父类的不同
	}

	public static void main(String[] args) {
		World world=new World();
		world.name="shiqing";
		world.speak();
	}
}

(7)父类为静态方法是,不可重写。那么当父类为非静态方法时,重写后的子类中的方法不可以有static修饰

发布了29 篇原创文章 · 获赞 3 · 访问量 377

猜你喜欢

转载自blog.csdn.net/qq_44687512/article/details/104712399