zoukankan      html  css  js  c++  java
  • java 子类重写函数的几个测试

    public class Test {
           public static void main (String[] args) {
               Animal h = new Horse();
               h.eat();  
           }
       }
    
       class Animal {
           public void eat(){
               System.out.println ("Animal is eating.");
           }
       }
      
       class Horse extends Animal{
           public void eat(){
               System.out.println ("Horse is eating.");
           }
           public void buck(){
           }
       }
    

      一个原则是:使用了什么引用,编译器就会只调用引用类所拥有的方法。如果调用子类特有的方法,如上例的h.buck(); 编译器会抱怨的(编译错误)。也就是说,编译器只看引用类型,而不是对象类型。

    下面是有关继承中重写的几个测试

    1.函数同等权限,父类引用,子类实例;

    public class HelloWorld{
    
         public static void main(String []args){
            Animal A = new Horse();
            A.eat();
         }
    }
    class Animal
    {
        public void eat()
        {
            System.out.println("A is eating");
        }
    }
    class Horse extends Animal
    {
        public void eat()
        {
            System.out.println("B is eating");
        }
    }
    

      编译执行

    sh-4.3$ javac HelloWorld.java                                                                                                            
    sh-4.3$ javac HelloWorld.java                                                                                                            
    sh-4.3$ java -Xmx128M -Xms16M HelloWorld                                                                                                 
    B is eating 
    没有问题
    2.函数同等权限,子类引用,父类实例
    public class HelloWorld{
    
         public static void main(String []args){
            //Animal A = new Horse();
            Horse A = new Animal();
            A.eat();
         }
    }
    class Animal
    {
        public void eat()
        {
            System.out.println("A is eating");
        }
    }
    class Horse extends Animal
    {
        public void eat()
        {
            System.out.println("B is eating");
        }
    }
    

      编译报错:

    sh-4.3$ javac HelloWorld.java                                                                                                            
    HelloWorld.java:5: error: incompatible types: Animal cannot be converted to Horse                                                        
            Horse A = new Animal();                                                                                                          
                      ^                                                                                                                      
    1 error  
    向下转型不安全,子类引用不能指向父类对象;
    3.函数不同权限,父类引用,子类实例
    public class HelloWorld{
    
         public static void main(String []args){
            Animal A = new Horse();
            //Horse A = new Animal();
            A.eat();
         }
    }
    class Animal
    {
        protected void eat()
        {
            System.out.println("A is eating");
        }
    }
    class Horse extends Animal
    {
        public void eat()
        {
            System.out.println("B is eating");
        }
    }
    

      

                                                                                       

    编译执行
    sh-4.3$ javac HelloWorld.java                                                                                                            
    sh-4.3$ java -Xmx128M -Xms16M HelloWorld                                                                                                 
    B is eating
    没有问题,重写的权限要比父类函数的权限相等或更宽。
  • 相关阅读:
    [匈牙利算法] 洛谷 P1640 连续攻击
    [dfs] Jzoj P5916 flow
    [bfs] Jzoj P3522 迷宫花园
    [二分][状压dp] Jzoj P3521 道路覆盖
    [模拟] Jzoj P3520 原根
    [并查集] Jzoj P5914 盟主的忧虑
    [树上差分][子树求和][树形dp] Jzoj P5911 Travel
    [思维][暴力] Jzoj P5912 VanUSee
    [dfs][离散化] Jzoj P5910 DuLiu
    [cdq分治][树的重心] 洛谷 P3806 点分治1
  • 原文地址:https://www.cnblogs.com/TaoChiangBlog/p/6398052.html
Copyright © 2011-2022 走看看