java的字段能被重写吗?
- 问题的来源
- 测试方法重写
- 测试字段重写
- 三个问题
- 完整代码
问题的来源
在看周志明先生的《深入理解java虚拟机》的时候看到这么一句:在Java语言中字段是无法被重载的,两个字段的数据类型、修饰符不管是否相同,都必须使用不一样的名称,但是对于字节码来讲,如果两个字段的描述符不一致,那字段重名就是合法的。
描述符指的是字段的数据类型、方法的参数列表(包括数量、类型以及顺序)和返回值。
简单的理解就是Java语言中(也就是我们编码时)字段不能重名,但是在字节码层面字段重名、描述符不同是合法的。
这里提到重载,自然而然的就会想到重写,我们都知道方法是可以重写的,那么一连串的问题来啦!
什么是重写?
为什么说方法是可以重写的呢?
字段能不能被重写呢?
带着这几个问题我进行了以下测试
测试方法重写
父类中有一个print()
方法,子类继承父类,重写print()
,通过结果可以看出,子类直接调用print()
方法和将子类的对象赋值给父类的引用然后调用print()
,打印的都是M-SubClass1,都是调用了子类的print()
,体现了多态。
class SuperClass1 {
public String print() {
return "M-SuperClass1";
}
}
class SubClass1 extends SuperClass1 {
@Override
public String print() {
return "M-SubClass1";
}
}
public static void main(String[] args) {
SubClass1 subClass1 = new SubClass1();
// 将子类的对象赋值给父类的引用
SuperClass1 superClass1 = subClass1;
System.out.println("-----------------方法------------------");
System.out.println("superClass1.print() " + superClass1.print());
System.out.println("subClass1.print() " + subClass1.print());
}
结果
-----------------方法------------------
superClass1.print() M-SubClass1
subClass1.print() M-SubClass1
测试字段重写
父类中有一个str
字段,子类继承父类,子类中也有一个str
字段,通过结果可以看出,直接打印子类str
字段的结果为SubClass2,先将子类的对象赋值给父类的引用,然后打印父类的str
字段的结果为SuperClass2。也就是说字段重写没有成功。
另外给子类的str
字段添加@Override
注解时会报错,也从另一个方面说明了字段不能重写。
class SuperClass2 {
public String str = "SuperClass2";
}
class SubClass2 extends SuperClass2 {
// @Override 加上会报错
public String str = "SubClass2";
}
public static void main(String[] args) {
SubClass2 subClass2 = new SubClass2();
// 将子类的对象赋值给父类的引用
SuperClass2 superClass2 = subClass2;
System.out.println("-----------------字段------------------");
System.out.println("superClass2.str " + superClass2.str);
System.out.println("subClass2.str " + subClass2.str);
}
结果
-----------------字段------------------
superClass2.str SuperClass2
subClass2.str SubClass2
三个问题
1、什么是重写?
我个人认为,在继承关系中,能体现多态特性的行为才叫做重写。
2、为什么说方法是可以重写的呢?
因为体现了多态,从测试方法重写中可以看出,将子类的对象赋值给父类的引用然后调用print()
,最终调用的是子类的方法。
3、字段能不能被重写呢?
字段不能被重写,从测试字段重写中可以看出:将子类的对象赋值给父类的引用,然后打印,结果是父类的str
,没有体现多态。
完整代码
https://gitee.com/zhaobingshuang/codes/h9v50zdseqclk8itj2fw335