美文网首页
2019-08-06 java的向上向下转型

2019-08-06 java的向上向下转型

作者: 惜小八 | 来源:发表于2019-08-24 10:55 被阅读0次

1.向上/向下转型

 public class Father {   
     int age=48; 
     static String name="灭霸";
     public void eat(){
         System.out.println("我是父类的方法吃。。。。。");
    }
    public static void EarnMoney(){
         System.out.println("我是父类的方法挣钱。。。。。");
    }
 }
********************************
public class Son extends Father{
     int age=12; 
     static String name="小蜘蛛";
    int String gender="男";
    public void eat(){
        System.out.println("我是Son的方法吃。。。。。");
    }
    public void sleep(){
        System.out.println("Son睡觉");
    }
}
**************************************************
public static void main(String[] args) {

      Father father=new Son();//子类向上转型           
      f.eat();    
      //f.sleep();无法调用此方法 此方法不存在
      System.out.println(father.age);
      System.out.println(father.name);    //father.gender调用不了,应为这是子类有而父类没有的方法
        
    }    
 运行结果: 我是子类的方法吃
                    48
                    灭霸
*************************************************************************
总结:当使用向上转型的时候,我们可以调用的属性和方法,都是父子类当中共有的,当调用普通方法时调用的是子类的方法,当是其他时(变量,类变量,静态方法),调用的是父类的,当调用的普通方法当中有属性时,按照父类计算
public static void main(String[] args) {

      Father father=new Son();//子类向上转型           
      Son  son=(Son) father;//向下转型
      //此时,son可以调用他自己的所有的方法
    
      Father f=new Father();
      //报错:Exception in thread "main" java.lang.ClassCastException: 
      Son son1=(Son) f;
        
    }    

2.总结

引用:https://www.cnblogs.com/chanchan/p/7787453.html

Girl g1=new MMGirl(); //向上转型
    g1.smile();
      //此时子类的所有方法皆可以调用
    MMGirl mmg=(MMGirl)g1; //向下转型,编译和运行皆不会出错
    这里的向下转型是安全的。因为g1指向的是子类对象。
        而
    Girl g2=new Girl();
    MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错
    运行出错:
    Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl
    at com.wensefu.other1.Main.main(Girl.java:36)


假设父类为Person,子类为Student,有下面的两行定义:
Student sTest = new Student();
Person pTest = sTest;

当pTest引用变量/静态变量/静态方法是,调用的是父类的,sTest只能访问子类的,这称为隐藏,可以理解成父类的这些变量和静态成员方法被放到抽屉里暂时藏起来了,当用父类对象引用访问或调用时,把抽屉拉开就可以看到了

当pTest调用的是普通方法时,调用的是子类复写的方法,用sTest调用未覆盖的父类成员方法时,该方法中如果使用到了被隐藏的变量或方法时,规则同上;
即,当sTest调用未被复写的方法时,如方法当中有父类的属性,则这些属性的值是获得不到的。






假设父类为Person,子类为Student,有下面的两行定义:
Student sTest = new Student();
Person pTest = sTest;
其中,pTest就是父类的对象引用,sTest是子类的对象引用;pTest和sTest指向了同一个子类对象。
那么,
(1).如果子类的成员变量与父类的成员变量的类型及名称都相同,则用sTest访问时,访问到的是子类的成员变量;用pTest访问时,访问到的是父类的成员变量;
(2).如果子类的静态成员变量与父类的静态成员变量的类型及名称都相同,则用sTest访问时,访问到的是子类的静态成员变量;用pTest访问时,访问到的是父类的静态成员变量;
(3).如果子类的静态成员方法重写了父类的静态成员方法,则用sTest调用时,调用的是子类的静态成员方法;用pTest调用时,调用的是父类的静态成员方法;
      (1)、(2)、(3)都称为隐藏,可以理解成父类的这些变量和静态成员方法被放到抽屉里暂时藏起来了,当用父类对象引用访问或调用时,把抽屉拉开就可以看到了;
(4).如果子类的成员方法重写了父类的成员方法,则用sTest调用时,调用到的是子类的成员方法;用pTest调用时,调用的也是子类的成员方法;
      此时称为覆盖,可以理解成父类的这些方法被子类重写后的方法用胶带给粘上了,撕不下来了,即使父类对象引用调用时也只能看到子类重写后的方法;
(5).用sTest调用未覆盖的父类成员方法时,该方法中如果使用到了被隐藏的变量或方法时,规则同上;

相关文章

  • java多态(重要O!)

    一、多态的语法 关于java语言中的向上转型和向下转型 1、向上转型(upcasting):子 -->父 2、向下...

  • 多态

    Java语言中的向上转型和向下转型, 1向上转型 (upcasting)子———>父 自动类型转换 2 ...

  • Java向上转型、向下转型

    向上转型:父类指向子类对象Person p = new SuperMan(); 例子:Person person ...

  • java向上转型、向下转型

    整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循以下原则: 容量小的类型可自动转换为容量大的数据类型;b...

  • 2019-08-06 java的向上向下转型

    1.向上/向下转型 2.总结 引用:https://www.cnblogs.com/chanchan/p/7787...

  • java的多态性

    1、需有父子类关系,子类通过extends继承父类; 2、java多态性分为向上转型以及向下转型。 向上转型:...

  • java向上转型和向下转型

    java对象的类型转换对于初学者来说很多时候是蒙的,例如当初开始学的我,#手动狗头。在整理以前学的笔记的时候看到了...

  • Java的向上转型和向下转型

    1.向上提升 孔子装爹案例

  • java转型(向上与向下)

    开始的时候,总是不理解,为什么Java中要有转型这一概念。但是随着面向对象思想的加深,以及对Java的理解深入。才...

  • Java 向上/向下转型浅析

    基于java的继承,向上或者向下转型是一种常见的情景,在thinking in java对这一情况进行了详细说明,...

网友评论

      本文标题:2019-08-06 java的向上向下转型

      本文链接:https://www.haomeiwen.com/subject/axrwdctx.html