JavaSE之面向对象编程—类与对象(下)—— 4 and 5

                                                                                        4——覆写
一、覆写的概念:
一个类可以通过继承来产生一个新类,这个新类继承的原来那个类的所有成员变量和方法。但是在子类中可能对父类的一些方法不能满足,所以就对它进行修改,对继承以后存在的方法,在它的基础上只是改变函数体中的方法内容就叫做方法的覆写。那么我们需要注意;覆写只会出现在继承中,同样我们的属性也是可以覆写的,但是我们一般不会这样做。
1.方法的覆写(很重要的)
子类定义了与父类方法名称相同,参数类型及个数都相同的方法就叫方法覆写。
注意:
(1)访问控制权限符的级别:public>protected>default>private
(2)方法覆写的时候要求子类的方法(覆写的方法)访问控制权限应该比父类更松;
即:父类:public ——》子类:public;父类:protected——》子类:protected/public;父类:default——》子类:default/protected/public;
(3)(考点:)如果一个类是私有的,那么他是不可以被外界看到的,子类看不到就算和它写了一个与它相同名称相同类型相同参数个数的方法也不叫覆写。
2.方法覆写实例:

class Person{
	private String name;
	public void print(){
		System.out.println("这是父类的方法");
	}
}
class Student extends Person{
	public void print(){
		System.out.println("这是子类覆写以后的方法");
	}
}
public class Fuxie{
	public static void main(String[] args){
		
		new Student().print();//创建的是子类的对象
		//通过调用以后我们可以发现,方法经过覆写以后,创建了子类的对象,虽然子类继承了父类的所有属性结构,但是经过覆写的方法相当于
		//覆盖,在子类中只有覆写以后的方法;
	    new Person().print();
		//但是对于我们的父类来说,它的方法依然是自己的那个方法,执行的结果任然是自己的方法。
	}
}

在这里插入图片描述
经过这个实例以后我们有一些需要注意的地方:
(1)我们需要明确的知道,当前使用的对象到底是哪个类创建的,因为覆写的方法只是对于子类才起作用。
(2)当调用某个方法,这个方法已经被覆写过了,如果调用这个方法的对象是子类创建的,那么这个被调用的方法一定是被覆写以后的方法,如果是父类创建的对象那么这个方法还是之前父类拥有的方法。
3.方法覆写错误的案例:

//错误的案例
class Person{
	public void print(){
		System.ou.println("这是父类的方法");
	}
}
class Student{
	 void print(){//没有任何的修饰表示默认的限制权限
		System.out.println("这是子类覆写以后的方法");
	}
}
public class Fuxie{
	public static void main(String[] args){
		new Student().print();
	}
}

在这里插入图片描述
由于在子类中方法覆写的时候它的访问权限是默认的权限,默认的权限高于公共的权限,所以这个是错误的。
4.请解释重载与覆写的区别:(非常重要噢)

Num 区别 重载 覆写
1 概念 参数名相同,参数类型、个数、顺序不同 方法名称,参数个数、类型、顺序相同,方法体不同
2 范围 一个类 子类
3 限制 没有权限要求 子类中(进行覆写的方法)权限要没有父类严格

5.属性的覆写
我们在一开始就说到覆写分为两类,方法和属性都可以,属性的覆写权限的要求和方法覆写权限的要求是一样的,它没有方法体,所以它改变的是属性的值。
6.super关键字
super关键字之前我们在将继承的时候讲到过,不过那会我们只是使用它去调用了父类的构造方法。但是super的功能还有很多,可以用它去调用父类的普通方法、属性,通过super.方法名();super.属性名;
栗子:

//super关键字
class Person{
	 int num=10;//如果这定义为私有的,下面的super将不可以访问它
	public void print(){
		System.out.println("这是父类的方法");
	}
}
class Student extends Person{
	public void print(){
	System.out.println(super.num);
		super.print();//通过super调用父类的方法
		System.out.println("这是子类经过覆写以后的方法");
	}
}
public class Fuxie{
public static void main(String[] args){
new Student().print();	
}
}

在这里插入图片描述
经过上面的代码以及运行结果我们可以看到,super是可以调用父类的普通方法以及属性的,但是访问的时候需要注意它也是收到属性的限制的,所以super在调用这些的时候的前提都是需要有访问权限。
通过对比以后我们可以看到this和super比较像,下面将他们做一个对比:

Num 区别 this super
1 概念 访问本类中的属性和方法 在子类中,由子类访问父类的属性和方法
2 查找范围 在当前类查找,如果找不到就到父类里面找,再找不到就出错 直接到父类中寻找
3 特殊 表示当前对象

                                                                                        5——final关键字(考点多)
在java中final被称为终结器,在使用final的时候我们需要注意以下几点:
(1)final可以修饰类、方法、属性、变量、参数;

//1.final可以修饰类、修饰属性、修饰方法、修饰变量、修饰参数
final class Person{}
final private String name="张三";
final public void print(){
	System.out.println("这是被final修饰过的方法");
}

(2)被final修饰的类不能被继承;

final class Person{
	public void print(){
		System.out.println("这是被final修饰的类");
	}
}
class Student extends Person{
	public void print2(){
		System.out.println("这是子类的方法");
	}
}
public class Fuxie{
	public static void main(String[] args){
		new Student().print2();
	}
}

在这里插入图片描述
(3)被final修饰的方法不能被覆写;

class Person{
	final public void print(){
		System.out.println("这是被final修饰的类");
	}
}
class Student extends Person{
	public void print(){
		System.out.println("这是子类的方法");
	}
}
public class Fuxie{
	public static void main(String[] args){
		new Student().print2();
	}
}

在这里插入图片描述

(4)被final修饰的属性需要在构造方法中初始化或者在定义的时候直接初始化;
(5)被final修饰的属性、方法、变量一旦被初始化后就不能被再赋值了,并且它的类型也不会改变;

public class Fuxie{
	public static void main(String[] args){
		final int num=3;
		num=4;
	}
}

在这里插入图片描述
(6)final定义常量;
(7)对于static、final修饰的常量我们的命名规则是:大写字母,单词之间用下划线连接。

扫描二维码关注公众号,回复: 4114138 查看本文章

猜你喜欢

转载自blog.csdn.net/ZhuiZhuDream5/article/details/84075198