永发信息网

关于java中的final继承问题

答案:2  悬赏:60  手机版
解决时间 2021-02-15 01:51
当Test2.java改成这样时:

问题一:结果为什么会这样?
问题二:Test1 test = new Test2();到底为什么要这样写,这样写的作用是什么?为什么不直接写成Test2 test = new Test2();
请详细讲一讲,刚申请账号,实属学习交流,望大神解答。















最佳答案
首先你需要知道:在堆内存中,你建立的Test2对象被new出来以后,实际上里面有两个var_final变量,一个是this.var_final,一个是super.var_final,也有两个方法,一个是this.myFunction(),一个是super.myFunction()。
所以,当你在Test2类里面输出时,如果你没有在那个变量前面加this或super进行指定,那么虚拟机就会按照对象的类型来决定是调用哪一个。所以在修改以前,你的test的类型是父类,自然就是调用的的super.var_final和super.myFunction()。修改以后,这个对象被强制转变成了子类,所以就调用了this.var_final和this.myFunction()。
当本类中的方法访问时,会自动在前面加this,所以在你直接调用doit()时返回了this.var_final,结果也就是200。
你这段程序,用了多态,所以才可以写Test1 test = new Test()2;也就是父类引用接受子类对象。这种编程模式被称为面向父类的编程,相同的还有面向接口的编程。这个优点挺多的,你可以去查一下:面向父类的编程。
最后再给你一个建议,按照通常java程序员的编程习惯,会把final定义的常量的名称都用大写字母书写。对应你这段程序也就是会写成VAR_FINAL。
全部回答

final是能够用在子类的创建的方法前

并且可以是子类重写父类的方法前

这是我试过的:

1.test.java:

package com;

public class test{

public static void main(string[] args){ system.out.println("hello java"); b a3=new b(); system.out.println(a3.getsalary()); } }

2.a.java:

package com; class a{

public int test() { return 15; } }

3.b.java:

package com; class b extends a{

public final double getsalary() { return 123.3; } }

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
桃铺村地址在什么地方,想过去办事
转桥村地址好找么,我有些事要过去
远达宾馆这个地址在什么地方,我要处理点事
铁友12306app查询车次时,在到站那有个红色+1
北京沙城有什么好玩的
【托物言志的诗】托物言志的现代诗
给水管道疾病预防控制中心检测报告有效期几年
丽雅美妆地址在什么地方,想过去办事
如何做好施工现场6s管理
S312地址有知道的么?有点事想过去
2月份发财树要胶水吗?我一月份整个月都没浇
西平村地址好找么,我有些事要过去
求鸽子情缘是谁写的
为什么说青海湖美先说油菜花美
小儿急惊风的主要病位是()A.肝、脾B.肝、肾C.
推荐资讯
有人认识一个叫袁成芳的女孩子吗?她是达州桥
我是211本科学生,本科期间没有任何科研经历,
买篮球在哪买比较好?
德古拉元年里吸血鬼说的 那句 光明对黑暗 希
肾功能不全是肾病综合症吗
城市部落自行车怎么去啊,有知道地址的么
(14分)阅读下列材料,并回答问题。材料一
喂奶期间能吃穿山甲土鳖蜈蚣么
兔子尾巴--------长不了用于哪种句子
南疃村地址在哪,我要去那里办事
猫来家里快一个月了还是很怕人
祥福家具城在什么地方啊,我要过去处理事情
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?