概述
一.属性的隐藏:子类中声明了与超类中相同的成员变量名
1.从超类继承的变量将被隐藏
2.子类拥有了两个相同名字的变量,一个继承自超类,另一个由自己声明
3.当子类执行继承自超类的操作时,处理的是继承自超类的变量,
而当子类执行它自己声明的方法时,所操作的就是它自己声明的变量
栗子:
class Parent class Child extends Parent
{ {
int aNumber; float aNumber;
} }
二.访问被隐藏的超类属性
1.调用从超类继承的方法,则操作的是从超类继承的属性
2.子类中声明的方法是用 "super.属性" 访问从超类继承的属性
栗子:属性的隐藏
class A1
{
int x = 2;
public void setX(int i)
{
x =i ;
}
void printa()
{
System.out.println(x);
}
}
class B1 extends A1
{
int x = 10;
void printb()
{
super.x = super.x + 10;
System.out.println("super.x = " + super.x + " x= " + x);
}
}
public class Test{
public static void main(String[] args)
{
A1 a1 = new A1();
a1.setX(4);
a1.printa(); //打印结果: 4
B1 b1 = new B1();
b1.printb(); //打印结果: super.x = 12 x = 100
b1.printa(); //打印结果: 12
b1.setX(6); //将继承的X值 设置为6
b1.printb(); //打印结果: super.x = 16 x = 100
b1.printa(); //打印结果:16
a1.printa(); //打印结果:4
}
}
栗子:访问超类静态属性
class A1
{
static int x = 2;
public void setX(int i)
{
x =i ;
}
void printa()
{
System.out.println(x);
}
}
class B1 extends A1
{
int x = 10;
void printb()
{
super.x = super.x + 10;
System.out.println("super.x = " + super.x + " x= " + x);
}
}
public class Test{
public static void main(String[] args)
{
A1 a1 = new A1();
a1.setX(4);
a1.printa(); //打印结果: 4
B1 b1 = new B1();
b1.printb(); //打印结果: super.x = 14 x = 100
b1.printa(); //打印结果: 14
b1.setX(6); //将继承的X值设置为6
b1.printb(); //打印结果: super.x = 16 x = 100
b1.printa(); //打印结果:16
a1.printa(); //打印结果: 16
}
} //结论:在继承过程中,超类的静态属性不会被继承,但它可以被本来的对象和子类的对象所访问
三. 方法覆盖:子类定义了重名的方法,那么从超类继承来的方法就被覆盖了
1.覆盖方法的返回类型,方法名称,参数的个数及类型必须和被覆盖的方法一模一样
2.只需在方法名前面使用不同的类名 或 不同类的对象名即可覆盖方法和被覆盖方法
3.覆盖方法的访问权限可以比被覆盖的宽松,但是不能更为严格
4.调用被覆盖的方法: super.被覆盖的方法名();
方法覆盖的注意事项
1.必须覆盖的方法:子类必须覆盖超类中的抽象方法,否则派生类自身也成为抽象类
2.不能覆盖的方法: 超类中声明为final的终结方法,超类中声明为static的静态方法
最后
以上就是拉长手机为你收集整理的JAVA中的隐藏和覆盖的全部内容,希望文章能够帮你解决JAVA中的隐藏和覆盖所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复