zoukankan      html  css  js  c++  java
  • Java学习笔记11(面向对象四:多态)

    多态:

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

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

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

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

    举例:

    public class Fu {
        public void show(){
            System.out.println("父类的show方法");
        }
    }
    public class Zi extends Fu{
        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 Person {
        public abstract void work();
    }
    public class Teacher extends Person {
        public void work() {
            System.out.println("Teacher在工作");
        }
    
    }
    public class Test {
    
        public static void main(String[] args) {
            //抽象类多态
            Person p = new Teacher();
            p.work();
        }
    
    }
    //输出:Teacher在工作

    接口多态:

    public interface Work {
        public abstract void work();
    }
    public class Student implements Work{
        public void work(){
            System.out.println("Student在工作");
        }
    }
    public class Test {
    
        public static void main(String[] args) {
            //接口多态
            Work w = new Student();
            w.work();
        }
    
    }
    //输出:Student在工作

    多态中成员方法的特点:

    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

    成员变量:

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

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

    总结:编译运行全看父类

    成员方法:

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

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

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

    instanceof关键字:

    用于比较引用数据类型:

    public class Test {
        public static void main(String[] args) {
            //Person p = new Student();
            Person p = new Teacher();
            boolean b = p instanceof Student;
            System.out.println(b);
        }
    }
    //输出:false

    多态转型:

    向上转型:

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

    Person p = new Student();

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

    因为这里出现了自动类型提升,将取值范围小的自动提升为取值范围大的

    范围小的,看成是子类,范围大的,看成是父类

    这里子类提升到了父类的类型

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

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

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

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

    Student s = (Student)p;

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

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

    转型的案例:

    public abstract class Animal {
        public abstract void eat();
    }
    public class Cat extends Animal {
        public void eat(){
            System.out.println("猫在吃");
        }
        public void catchMouse(){
            System.out.println("猫在抓老鼠");
        }
        
    }
    public class Dog extends Animal {
        public void eat(){
            System.out.println("狗在吃");
        }
        public void lookHome(){
            System.out.println("狗在看家");
        }
    }
    public class Test {
        public static void main(String[] args) {
            Animal a1 = new Cat();
            Animal 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();
            }
        }
    }
    /*输出:
     * 猫在吃
     * 狗在吃
     * 猫在抓老鼠
     * 狗在看家
     */
  • 相关阅读:
    关于界面和UI
    Windows Form编程中的Command模式
    转载:从地理学透视中国现代化
    [3sNews, 关外飞雪]2005年3S业界盘点暨《3S新闻周刊》创刊题记
    Bridge? 一个GIS二次开发中常用的设计模式
    2005年GIS技术盘点
    [3sNews]建立GIS人自己的工会,抵制低薪无薪上岗
    2005国产空间信息系统软件测评结果揭晓
    从语义(semantic)GIS和知识表达谈起
    使用编译器来使用宏变量
  • 原文地址:https://www.cnblogs.com/xuyiqing/p/8241202.html
Copyright © 2011-2022 走看看