之前学习没有注意到这个小问题,有一次到java贴吧逛时看到有关成员变量隐藏的问题,发现自己对此的理解是有的偏差的。写下此文进行总结。
1.成员变量的隐藏
package 测试;
public class DemoClass {
public static void main(String[] args)
{
A a=new A();
a.printOut(); //1
B b=new B();
b.printOut(); //0
b.show();
a=b;
a.printOut(); //0
}
}
class A
{
private int i=0;
public void doAdd()
{
i++;
System.out.println("fu.A");
}
public void printOut()
{
this.doAdd();
System.out.println(this.i);
}
}
class B extends A
{
public int i=0;
public void doAdd()
{
i=i+2;
System.out.println("zi.B");
}
void show()
{
System.out.println(i);
}
}
分析:第一个输出不用说了,自然输出1;
第二个输出中b对象调用printOut()方法时自然只能调用父类的方法;里面这句this.doAdd()调用的是父类的函数,还是子类的呢?之前我记住的是:子类继承的方法只能操作子类继承和隐藏的成员变量;所以我刚刚开始觉得是父类,的是结果是子类的doAdd函数;原因很简单:就是上面那就话我理解是错误的。他的意思其实是说“父类中独有的方法只能调用父类的成员变量”注意是成员变量!不包括成员方法,也就是说父类中继承下来的方法也是可以调用子类中重写方法的。printOut()中输出this.i时就只能调用父类中隐藏的成员,所以输出的i是父类的i,即还是初始值:0;
第三个也是一样的意思!
附上运行结果:
2,方法重写。
下面有一段代码!
class C
{
int i=0;
folat add( folat a, folat b)
{
return a+b;
}
}
class D
{
folat add( folat a, folat b)
{
return a*b;
}
}
这个就是方法重写,重写的作用很多 ,主要用在多态和统一代码。
注意二点就是:
(1)重写是函数原型是一样的(java中其实没有函数声明这个概念);
假如上面 D中的add()函数是这样写的:double add(float a,floatb) 那么D类的对象调用这个方法时就会发生语法错误。
原因是:D中的Add()函数此时既不是overload (overload错误)也不是override。导致对象不知道要调用那个方法。
(2) 子类中重写方法的访问权限一定不能小于父类中被重写的方法的访问权限(一般初学者容易出错)。