public class Base {
public static final String Foo = "foo";
public static void main(String[] args) {
Base b = new Base();
Sub s = new Sub();
System.out.println(((Base)s).Foo);
}
}
class Sub extends Base{
public static final String Foo = "bar";
}
System.out.println(((Base)s).Foo);这个语法里面是什么意思?初学者没学过这种语法三个括号
请老手帮忙解答一下这三个括号这种语法什么意思,输出结果我知道是输出父类的FOO;
System.out.println(((Base)s).Foo);
java装箱和拆箱
这段输出可以等同于这样
Base s1= (Base)s;
加个括号相当于强转,是一种装箱行为,可以将s转化成Base类型的变量从而调出Base里的属性
System.out.println(s1.Foo);
关于装箱和拆箱可以这样理解
Integer是int的封装类
Integer类型的变量被int类型的变量赋值,是一种装箱行为。(小转大)
int类型的变量被Integer类型的变量赋值,是一种拆箱行为。(大转小)
对于初学者建议先百度一下装箱拆箱的详细介绍
(Base)s表示强制类型转换;
((Base)s).Foo表示经强制类型转换后调用Base类的属性值。
括号的作用是改变优先级,括号最深的最先被求值
(Base)s.Foo
是先得到s.Foo,把s.Foo字段再转换为Base
((Base)s).Foo
是先把s整体转换为Base,再得到Foo字段。
这里,static的字段foo,没有继承关系,所以对象是哪个类型,foo就是哪个。
System.out.println(((Base)s).Foo);
相当于
Base temp = (Base)s;
System.out.println(temp.Foo);
(Base)s 将对象s强制转换为Base类型,前提是s对象的类型是继承子Base类的,可以进行强转
((Base)s).Foo 将对象s强转后调用了父类的常量属性Foo,常量是不会被继承的,所以不会被重写
看下多态的知识。(Base)s表示子类实例s向上强转为父类类型Base类型。((Base)s).Foo表示访问Foo属性,这里需要强调的是,
Foo属性并不属于(Base) s实例,因为是static修饰的,所以,Foo是类成员变量,它属于Base类,任何Base类的实例都可以访问这个Foo,
这里你加了final修饰,如果不添加final关键字修饰,那么如果你修改了Foo的值,比如:Foo=“修改后”,那么再访问Base类型的
所有实例对象的Foo时,获取的值都变成了“修改后”。