zoukankan      html  css  js  c++  java
  • java学习笔记10(多态)

    多态:

      举例:描述一个事物的多种形态,如Student类继承了person类,一个Student对象既是Student,又是person

      多态体现为:父类引用变量可以指向子类对象

       多态的前提:必须有父子类关系 或者类实现接口关系,否则无法完成多态

      在使用多态后的父类 引用变量来调用方法时, 会调用子类重写后的方法

      举例:

    public class Fu{
      public void show(){
        System.out.println("父类的show方法");
      }
    }
    public class Zi extends Fu{
        public static int num=777;
        public void show(){
            System.out.println("子类重写父类的show方法");
        }
    }
    public class Test{
          
          public static void main(String[] args){
                //利用多态性
        
               //公式: 父类类型   变量= new  子类的对象
               Fu   f=new  Zi();
               f.show();
          }
    }
    //输出:子类重写父类的show方法        

    抽象类多态

    public abstract class Fu {
        public abstract void method();
    }
    public class Zi extends Fu{
        public void method() {
            System.out.println("我是子类");
            
        }
        
    }
    public class Test {
        public static void main(String[] args) {
            Fu f=new Zi();
            //抽象类多态定义格式;
            //抽象类 变量名 = new 抽象类子类();
            f.method();
        }
    }

    接口多态

    public interface Fu {
        public abstract void method();
    }
    public class Zi implements Fu{
        public void method() {
            System.out.println("我重写了接口中的method方法");
            
        }
        
    }
    public class Test {
        public static void main(String[] args){
            Fu f=new Zi();
            f.method();
        }
    }

    多态中成员方法的特点

    public class Fu{
        int a = 1;
    }
    public class Zi  extends Fu{
            int a= 2;
    }
    public class Test{
    
        public static void main(String[] args){
    
             Fu  f= new  Zi();
               System.out.println(f.a);
        }
    }
    // 输出:1

    成员变量:

      编译的时候,参考父类中有没有这个变量,如果有,编译成功,如果没有,编译失败

      运行的时候,运行的是父类的变量值

      总结: 编译运行全看父类

    成员方法:

      父类中没有声明或者定义的方法无法调用,

      子类如果重写,调用的是子类方法,子类没有重写,调用父类的方法

      总结:编译看父类,运行看子类

    多态转型:

        向上转型:

          java是一种强制数据类型语言,参与运算的数据,需要保证类型的统一

          如 person p = new Student();

          l两个数据类型是不同的,但是成功运行

          优点:  可以调用子类和父类的共有内容

          缺点:  无法调用子类特有的内容

        如果想调用子类的特有内容

        向下转型:(类似以前的强制转型)

        Student   s = (Student)p;

        由父类类型强制转回子类的类型

          好处:可以调用子类特有的功能

    public abstract class Animals {
        public abstract void eat();
    }
    public class Cat extends Animals{
        public void eat(){
            System.out.println("猫在吃");
        }
        public void catchMouse(){
            System.out.println("猫在抓老鼠");
        }
    }
    public class Dog extends Animals{
        public void eat(){
            System.out.println("狗再吃");
        }
        public void lookhome(){
            System.out.println("狗看家");
        }
    }
    public abstract class Test {
        public static void main(String[] args) {
            Animals  a1=new Cat();
            Animals  a2=new Dog();
            a1.eat();
            a2.eat();
            //向下转型,调用子类特有的方法
            //使用if instanceof  为了确保安全性
            if(a1 instanceof Cat){
                Cat c=(Cat)a1;
                c.catchMouse();
            }
            if (a2 instanceof Dog) {
                Dog d= (Dog)a2;
                d.lookhome();
            }
        }
    }

  • 相关阅读:
    5G网络类型 ?
    命令行签名
    软件著作权之源代码
    汗,查了很久的问题,竟然是重载错函数
    终于考完PMP
    ImportError: No module named _tkinter on macos
    numpy.trace对于三维以上array的解析
    ValueError: output parameter for reduction operation logical_and has too many dimensions ?
    numexpr low version warning
    Execution failed for task ':compileDebugAidl'.
  • 原文地址:https://www.cnblogs.com/bxl-1016/p/10539606.html
Copyright © 2011-2022 走看看