永发信息网

关于java中的final继承问题

答案:2  悬赏:60  手机版
解决时间 2021-02-15 01:51
  • 提问者网友:了了无期
  • 2021-02-14 04:34
当Test2.java改成这样时:

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















最佳答案
  • 五星知识达人网友:纵马山川剑自提
  • 2021-02-14 05:37
首先你需要知道:在堆内存中,你建立的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。
全部回答
  • 1楼网友:雪起风沙痕
  • 2021-02-14 07:06

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; } }

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯