java面向对象基础语法问题
    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;

5个回答

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类型的变量赋值,是一种拆箱行为。(大转小)
对于初学者建议先百度一下装箱拆箱的详细介绍

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 这和装箱拆箱毫无关系。
一年多之前 回复

(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时,获取的值都变成了“修改后”。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问