java 基础知识点
1.++与--
对于a += 1 这样的表达式而言,还有一种更简单的运算符:++,要注意的是使用++运算符有两种方式:前缀式和后缀式,例如:
a ++;//后缀式
++ a ;//前缀式
注意这两种方式的区别和联系。
首先对于a ++ 和++ a 这两种方式而言,对a的操作是完全一样的,都会在表达式运算结束后把a的值加1,这两种方式所不同的地方在于表达式的值的不同。
例如,假设 a = 5,则不管执行a ++ 还是++ a,执行之后a的值均为6。所不同的是,a ++这个表达式的值为5(即a加1之前的值),而++ a这个表达式的值为6(即a加1之后的值)。
a --与-- a有类似的关系。
2.子类重复定义父类成员变量
父类:public class A{
int x = 10;
public int getAx(){
return x;
}
}
子类:public class B extends A{
int x = 100;
public int getBx(){
return x;
}
public static void main(String [] args){
B b = new B();
System.out.println("getAx x = " + b.getAx());
System.out.println("getBx x = " + b.getBx());
}
}
问题:父类A定义x并初始化为10,子类B继承A重新定义x并初始化为100,运行子类B,取得的x值各为多少呢??
结果:getAx x = 10
getBx x = 100
解析:这里只做浅显的解析。
B b = new B();
System.out.println("getAx x = " + b.getAx());
有继承关系的两个类存在这样的关系,new出来的子类对象内部会有一个父类对象,这里理解为b对象内部包含一个A的对象,
B类中没有定义getAx()方法,也就是说子类B没有重写父类A的getAx()方法, b.getAx(),表面上说.getAx()是继承下来的,因为
B类中没有定义该方法,实际上内存中是什么样?就是我上面说的那样,b对象的内部还有一个A的对象,所以b.getAx()的时候,
实际上是调用的它里面的那个父类A的对象的bgetAx()方法,而A类中定义的b.getAx()是return x;注意,return的这个x指的是
自己A的x,所以打印出10。
System.out.println("getBx x = " + b.getBx());
A和B中都定义了int x,现在的情况是子类与父类成员变量重名,但是,如果是子类B中假如没有定义成员变量x,这个时候,
b.getBx()调用的还是父类Al的x,但是现在他们重名,你定义了,所以这个时候b.getBx()指的就是自己的成员变量了,
这种现象叫做隐藏(hide)即: 一个域、静态方法或成员类型可以分别隐藏(hide)在其超类中可访问到的具有相同名字
(对方法而言就是相同的方法签名)的所有域、静态方法或成员类型。隐藏一个成员将阻止其被继承。 这里就出现了这种现象,
B中的int x 隐藏了A中的int x,所以getBx() return 的x 是B自己的x, 所以打印出100。
参考:http://wenku.baidu.com/view/a7b128bd960590c69ec37698.html