【问题标题】:A confusion with a type casting in interface & inheritance [duplicate]与接口和继承中的类型转换混淆[重复]
【发布时间】:2020-10-11 12:10:43
【问题描述】:

为什么jave 在Test1 类中进行强制转换而不在Test2 中进行转换? 在 Test1 类中,当我调用 getGrade() 方法时,编译器工作正常。 但是在 Test2 类中,我进行了强制转换,但引用变量仍然引用了 Student 类型的对象?!这是为什么呢?

1 public class Test1{
 2 public static void main (String[]argus){
 3 Person s1=new Student(4);
 4 Student s2=(Student) s1;
 5 s2.getGrade(); 
 6 }}
 7 
 8 interface Person{
 9 String name="Amani";
10 public void display();
11 }
12 
13 class Student implements Person{
14 int study_level;
15 double grade;
16 public Student(int study_level ){
17 this.study_level=study_level;
18 }
19 public void display(){
20 System.out.println("name="+name+" level= "+study_level);
21 }
22 public void getGrade(){
23 System.out.println("Grade= "+grade);
24 }
25 }

Outputs:
Grade= 0.0;


1 public class Test2{
 2 public static void main (String[]argus){
 3 Person s1=new Student(4);
 4 Person s2=(Person)s1;
 5 s2.display(); // here it calls the method in the Student class!!
 6 }}
 7 
 8 class Person{
 9 String name;
10 public void display(){
11 System.out.println("name="+name);
12 }
13 }
14 
15 class Student extends Person{
16 int study_level;
17 double grade;
18 public Student(int study_level ){
19 super();
20 this.study_level=study_level;
21 }
22 public void display(){
23 super.display();
24 System.out.println(" level= "+study_level);
25 }
26 } 

【问题讨论】:

  • 即使你施放它,底层对象仍然是一个学生。如果其类覆盖它,则每个对象基本上都有自己的方法副本。 Java 对这些实例方法使用了一种称为动态调度的东西,这基本上意味着要运行的方法是在运行时选择的。
  • 我只是在用户评论中添加信息。变量类型让您知道您可以访问哪些属性和方法。对象类型让您知道将调用哪个类的方法。

标签: java inheritance interface casting superclass


【解决方案1】:

当你这样做时,

public class Test2 {
  public static void main (String[] argus) {
    Person s1=new Student(4);
    Person s2=(Person)s1;
    s2.display(); // here it calls the method in the Student class!!
  }
}

s1 和 s2 都将具有其 ref 类 var 和方法。即 s1 和 s2 只能访问 name 和 display()

在 Java 中,对象的状态和行为由它的 ref 决定。分配给它的类。

这就是您在 Test1 中所做的,并且成功了 :)

即使您尝试Person s1=new Student(4); s1.getGrade(),由于同样的原因,它也不会起作用。

【讨论】:

    猜你喜欢
    • 2015-05-13
    • 2016-11-19
    • 2017-02-11
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多