方法覆写限制
- 虽然利用方法的覆写可以更好的扩充父类的功能,但是对于覆写也是有其自身要求的:被覆写的方法不能够拥有比父类更加严格的访问控制权限。
- 对于访问控制权限现在已经接触过三种:public > default(默认) >private。
- private权限是最小的,如果父类方法中default权限定义,那么子类定义该方法的时候只能够使用public或者default,如果父类中的方法使用了public定义,那么子类中的方法只能够使用public定义。
范例:
class JavaDemo
{
public static void main(String[] args)
{
//子类的调用
DatabaseChannel Dat = new DatabaseChannel();
Dat.connect();
}
}
class Channel
{
public void connect(){
System.out.println("【Channel父类】进行资源的连接");
}
}
class DatabaseChannel extends Channel//要进行数据库连接
{
//子类对父类拥有的同种方法进行覆写
void connect(){//什么都不写,default默认权限,比父类的public权限更低
super.connect();//调用父类的方法
System.out.println("【DatabaseChannel子类】进行数据库的连接");
}
}
此时父类的方法使用了public定义,而子类的方法使用了default权限,权限更加严格了,那么这种覆写就有错误了。
private可以定义在属性上,也可以定义在方法上。
class JavaDemo
{
public static void main(String[] args)
{
//子类的调用
DatabaseChannel Dat = new DatabaseChannel();
Dat.fun();
}
}
class Channel
{
void connect(){
System.out.println("【Channel父类】进行资源的连接");
}
public void fun(){
this.connect();//调用本类方法
}
}
class DatabaseChannel extends Channel
{
public void connect (){
System.out.println("【子类】;连接数据库资源");
}
}
此时因为实例化的是子类并且覆写了此方法,所以执行的是子类的connect方法。此时加上private权限在父类上。
class JavaDemo
{
public static void main(String[] args)
{
//子类的调用
DatabaseChannel Dat = new DatabaseChannel();
Dat.fun();
}
}
class Channel
{
private void connect(){
System.out.println("【Channel父类】进行资源的连接");
}
public void fun(){
this.connect();//调用connect方法
}
}
class DatabaseChannel extends Channel
{
public void connect (){
System.out.println("【子类】:连接数据库资源");
}
}
这时候的并不是覆写,因为父类的connect不可见,这个方法对于子类而言就相当于一个新定义的方法,与覆写没有任何关系。
在以后实际开发之中只要是定义方法。95%情况下都是用public,所以覆写时也使用public。
面试题:请结束Override与Overloaging区别?Overloading时返回参数是否相同?
中文含义、概念、权限、范围
区别:
Overloaging | Override |
---|---|
重载 | 覆写 |
方法名称相同,参数类型以及个数不同 | 方法名称、参数类型及个数都相同 |
没有权限 | 被覆写方法不能拥有更严格的控制权限 |
发生在一个类中 | 发生在继承关系类中 |
在进行方法重载的时候并没有对返回类型作出限制,但是好的习惯应该保持类型的一致。