概念
隐藏:
父类和子类拥有相同名字的属性或者方法时,父类的同名的属性或者方法形式上不见了,实际是还是存在的 方法隐藏
只有一种形式,就是父类和子类存在相同的静态方法
子类实例变量/静态变量可以隐藏父类的实例/静态变量,
总结为变量可以交叉隐藏
重载
方法名相同,但参数不同的多个同名函数
参数不同的意思是参数类型、参数个数、参数顺序至少有一个不同
返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义
eg:void a ()和int a() ,如果调用a(),出现歧义)
main方法也是可以被重载的
重写(覆盖)
子类重写父类的方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父类小或者相同(即为父类的子类),访问修饰符比父类大或者相同两同两小一大
子类实例方法不能覆盖父类的静态方法;子类的静态方法也不能覆盖父类的实例方法(编译时报错)
总结为方法不能交叉覆盖
即子类的静态方法才能覆盖父类的静态方法
2.代码例子
class Shape {
public String name = "shape";
public Shape(){
System.out.println("shape constructor");
}
//重载
public Shape(String name){
this.name = name;
System.out.println(name);
}
public void printType() {
System.out.println("this is shape");
}
public static void printName() {
System.out.println("shape");
}
}
class Circle extends Shape {
public String name = "circle"; //父类属性被隐藏
public Circle() {
System.out.println("circle constructor");
}
//对父类实例方法的覆盖
public void printType() {
System.out.println("this is circle");
}
//对父类静态方法的隐藏
public static void printName() {
System.out.println("circle");
}
}
3.特殊情况
1.final修饰的属性可以被隐藏,但是不能被赋值,即不能用=来赋值,final属性不能被修改,这个说法不准确
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的
2.final修饰的方法不能被覆盖,可以被重载
3.final修饰的类不能被继承
4.private 方法隐式添加了final
参考链接https://www.cnblogs.com/xiaoQLu/archive/2013/01/07/2849869.html