xzdjsnb 2022-04-09 22:09 采纳率: 92.2%
浏览 30
已结题

多态性的问题,内存结构不明白,向下强转不知道哪些可以。是怎么强转,下面public为什么报错,还有我的理解在下面注释里。


public class PersonTest {//The public type Man must be defined in its own file
    public static void main(String[] args) {
    Person p = new Person();
    Person p1 = new Man();//这里是把new Man(里面有Man的结构和父类的结构)的地址值赋给p1
    Person p2 = new Woman();
    Woman w5 = (Woman)p1;//这里是把p1的地址值强转给w5。w5指向new Man
    w5.goShopping();//这里应该报错因为没有new Woman,所以不应该有这个方法按我的理解这里
                    //编译都该报错,因为给他赋的地址值里面没有goShopping这个方法。但为什么没报错
    
    System.out.println(w5.age);//这里又不应该报错,因为woman是person的子类,继承了
                            //person的方法属性,所以可以调父类的属性,输出父类的属性,但是为什么报错
    }
    //自己感觉上面两个应该都报错,因为没有 new Woman,但是他们语法又没报错,所以我产生了上面两个想法。
}

public class Person {
    String name;
    int age = 5;
    
    public void eat() {
        System.out.println("chifan");
    }
    public void walk() {
        System.out.println("走路");
    }

}
public class Man extends Person {//The public type Man must be defined in its own file
    boolean isSmoking;
    public void earnMoney() {
        System.out.println("男人赚钱");
    }
    public void eat() {
        System.out.println("大口吃肉");
    }
    public void walk() {
        System.out.println("威武霸气");
    }
}
public class Woman extends Person {//The public type Man must be defined in its own file
    boolean isBeauty;
     
    public void goShopping() {
        System.out.println("女人爱购物");
    }
    public void eat() {
        System.out.println("少吃");
    }
    public void walk() {
        System.out.println("优美");
    }

}
  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2022-04-09 22:15
    关注
    Woman w5 = (Woman)p1;//这里是把p1的地址值强转给w5。w5指向new Man
        w5.goShopping();//这里应该报错因为没有new Woman,所以不应该有这个方法按我的理解这里
                        //编译都该报错,因为给他赋的地址值里面没有goShopping这个方法。但为什么没报错
    

    编译不会报错,是因为w5指向了p1对应的地址。
    类似:

    Student s1=new Student();
    Student s2=s1;
    

    s1,s2都已经实例化了,都可以调用类中的属性,方法。

    w5.goShopping();
    w5.age;
    

    运行时,应该会报错,因为p1指向的是Man对象地址,又强转为Woman对象,在运行时会出现异常,应该用instanceof判断一下。

    
    if (p1 instanceof Woman){
                Woman w5 = (Woman)p1;
                w5.goShopping();
                w5.age;
                
             }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月18日
  • 已采纳回答 4月10日
  • 创建了问题 4月9日

悬赏问题

  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元