[恶补JAVA]关于覆盖与重载
JAVA不允许多重继承,但允许间接继承,如C继承了B,同时B又继承了A那么就拥有类A和B的属性及方法。
以前在学习JAVA基础的时候,总以为单一个类继承了另一个类的时候,继承类
就拥有了被继承类的除private关键字修饰外的所有方法和属性。
其实不然,继承它可以分为两种情况:
一、 当继承类和被继续类位于同一包中时。
子类会继承父类中的public 、protected 和默认访问级别的成叫变量和方法。
二、 当继承类和被继续类不在同一包中时
子类会继承父类中的public 、protected 访问级别的成叫变量和方法。
如以下两个类,Base和Sub,base为Sub的父类。
在同一包时:
只有私有的方法不能继承。
在不同的包时:我们把Sub类的包改为sub时
方法重载(Overload)
类的同一种功能可以有多种方法,当一个类中多少方法具有相同的方法名,却含有不同的方法参数则为方法的重载(Overload)如:
当从父类中继承了某个方法,如果两个方法名相同,却有不同参数时,可以说一个方法是另一个方法的重载。
重载必须满足以下条件。
1、 方法名相同。
2、 方法的参数,个数,顺序至少有一个不同。
3、 方法的返回类型可以相同,也可以不相同。
方法的覆盖(Override)
如果子类中,定义的一个方法,其名称、返回类型、以及参数与父类中的某个方法相匹配,则该子类重写的父类的方法。
覆盖方法必须满足以下条件。
1、 子类方法的名称、参数、返回类型必须与父类方法一致。
2、 子类方法不能缩小父类方法的访问权限。
3、 子类方法不能抛出比父类方法更多的异常。也就是说子类方法抛出的异常必须与父类方法抛出的异常相同或者是子类方法抛出的异常是父类抛出异常的子类。
4、 方法的覆盖只能存在与父类与子类,同一类中只存在方法的重载,不存在方法的覆盖。
5、 父类中的私有方法不能补覆盖。
6、 父类中的非抽象方法,可以被覆盖为抽象方法。
this与super的区别
this表示调用当前类的属性或方法,也可以用this当前类本身。
super表示调用父类的方法或属性。
父类中的成员变量或方法为私有的(private)时,super不能调用到。
以前在学习JAVA基础的时候,总以为单一个类继承了另一个类的时候,继承类
就拥有了被继承类的除private关键字修饰外的所有方法和属性。
其实不然,继承它可以分为两种情况:
一、 当继承类和被继续类位于同一包中时。
子类会继承父类中的public 、protected 和默认访问级别的成叫变量和方法。
二、 当继承类和被继续类不在同一包中时
子类会继承父类中的public 、protected 访问级别的成叫变量和方法。
如以下两个类,Base和Sub,base为Sub的父类。
在同一包时:
- package base;
- public class Base {
- public int publicBase = 1 ; //public访问级别
- private int privateBase = 1; //private访问级别
- int defaultBase = 1; //默认访问级别
- protected void protecteMethodofBase() { //protected访问级别
- }
- }
- package base;
- public class Sub extends Base {
- protected void protecteMethodofSub() { //protected访问级别
- System.out.println(publicBase);
- System.out.println(privateBase);//报错,私有的不能继承。
- System.out.println(defaultBase);
- protecteMethodofBase();
- }
- public static void main(String args[]){
- Sub sub = new Sub();
- sub.protecteMethodofSub();
- }
- }
package base;
public class Base {
public int publicBase = 1 ; //public访问级别
private int privateBase = 1; //private访问级别
int defaultBase = 1; //默认访问级别
protected void protecteMethodofBase() { //protected访问级别
}
}
package base;
public class Sub extends Base {
protected void protecteMethodofSub() { //protected访问级别
System.out.println(publicBase);
System.out.println(privateBase);//报错,私有的不能继承。
System.out.println(defaultBase);
protecteMethodofBase();
}
public static void main(String args[]){
Sub sub = new Sub();
sub.protecteMethodofSub();
}
}
只有私有的方法不能继承。
在不同的包时:我们把Sub类的包改为sub时
- package sub;
- import base.Base;
- public class Sub extends Base {
- protected void protecteMethodofSub() { //protected访问级别
- System.out.println(publicBase);
- System.out.println(privateBase);//报错,私有的不能继承。
- System.out.println(defaultBase);//报错,不在同一包下默认级别不能继承。
- protecteMethodofBase();
- }
- public static void main(String args[]){
- Sub sub = new Sub();
- sub.protecteMethodofSub();
- }
- }
package sub;
import base.Base;
public class Sub extends Base {
protected void protecteMethodofSub() { //protected访问级别
System.out.println(publicBase);
System.out.println(privateBase);//报错,私有的不能继承。
System.out.println(defaultBase);//报错,不在同一包下默认级别不能继承。
protecteMethodofBase();
}
public static void main(String args[]){
Sub sub = new Sub();
sub.protecteMethodofSub();
}
}
方法重载(Overload)
类的同一种功能可以有多种方法,当一个类中多少方法具有相同的方法名,却含有不同的方法参数则为方法的重载(Overload)如:
- Public void getString(String str){
- return str ;
- }
- Public void getString(String str,String str1){
- return str + str1;
- }
Public void getString(String str){
return str ;
}
Public void getString(String str,String str1){
return str + str1;
}
当从父类中继承了某个方法,如果两个方法名相同,却有不同参数时,可以说一个方法是另一个方法的重载。
重载必须满足以下条件。
1、 方法名相同。
2、 方法的参数,个数,顺序至少有一个不同。
3、 方法的返回类型可以相同,也可以不相同。
方法的覆盖(Override)
如果子类中,定义的一个方法,其名称、返回类型、以及参数与父类中的某个方法相匹配,则该子类重写的父类的方法。
覆盖方法必须满足以下条件。
1、 子类方法的名称、参数、返回类型必须与父类方法一致。
2、 子类方法不能缩小父类方法的访问权限。
3、 子类方法不能抛出比父类方法更多的异常。也就是说子类方法抛出的异常必须与父类方法抛出的异常相同或者是子类方法抛出的异常是父类抛出异常的子类。
4、 方法的覆盖只能存在与父类与子类,同一类中只存在方法的重载,不存在方法的覆盖。
5、 父类中的私有方法不能补覆盖。
6、 父类中的非抽象方法,可以被覆盖为抽象方法。
this与super的区别
this表示调用当前类的属性或方法,也可以用this当前类本身。
super表示调用父类的方法或属性。
父类中的成员变量或方法为私有的(private)时,super不能调用到。