zoukankan      html  css  js  c++  java
  • 多态

    父类引用(实现多态)

    传入父类对象的地址指针

    执行父类的功能。

    父类引用(实现多态)

    传入子类对象的地址

    执行子类中的部分功能;

    可以访问的是父类中已定义的成员:重写的和没重写的都可。

    对于重写的成员,访问的是子类的;没重写的当然是…

    Interface引用实现多态

    传入使用了该接口的类对象的地址

    执行子类中且在接口中定义了的

    的部分功能;

    例1:

    /*______________________________________________________________________________*/

    package com.fs.test;

       

    public abstract class Animal {

    public int age;

    public void go() {

    System.out.println("go....");

    }

    public abstract void sleep();

    public void eat() {

    System.out.println("Animal eat()");

    }

    }

       

    /*______________________________________________________________________________*/

    package com.fs.test;

    /**

    * 1.父类可以引用子类对象

    * 2.能访问到的成员是父类中出现过的成员,包括抽象方法

    * 3.访问重写的函数时,被访问到的是子类中的.如eat()

    * */

    public class People extends Animal {

    public String name;

    @Override

    public void sleep() {

    System.out.println("sleep()");

    }

    @Override

    public void eat() {

    System.out.println("People eat()...");

    }

    public void 说话() {

    System.out.println("说话()");

    }

       

    public static void main(String[] args) {

    Animal p2 = new People();//"能否访问某成员看左边;重写时访问哪个类的方法看右边"

    //                p2.name = "fds";//错。

    //                p2.说话();                //错。能否访问看左边;通过P2不能访问到子类中的新增类容。

    p2.sleep();//sleep()

    p2.go();//go....

    p2.age = 34;

    p2.eat();//People eat()...访问谁看右边

       

    People p1 = new People();

    p1.name = "fds";//能否访问看左边

    p1.说话();                //能否访问看左边

    p1.sleep();

    p1.go();

    p1.age = 34;

    }

    }

    /*______________________________________________________________________________*/

       

    例2:类的继承;接口也能实现多态;

    /*______________________________________________________________________________*/

    package com.test;

       

    public interface Ainf {

    public void ainfm();

    }

    package com.test;

       

    public interface Binf {

    public void binfm();

    }

    package com.test;

       

    public class A {

    public int x;

    public void m1() {

    System.out.println("A m1()");

    }

    public void m2() {

    System.out.println("A m2()");

    }

    }

    package com.test;

       

    public class B extends A{

    public int y;

    public void m3() {

    System.out.println("B m3()");

    }

    public void m1() {

    System.out.println("B m1()");

    }

    public void m2() {

    System.out.println("B m2()");

    }

    public static void main(String[] args) {

    A a = new B();

    a.x = 34;

    a.m1();//B m1()

    a.m2();// B m2()//访问谁看的是右边

    //         a.y = 34;//错的。不能访问父类中没有的成员

    //         a.m3();//错的

    }

    }

    package com.test;

       

       

    public class C extends B implements Ainf, Binf {

    public void m1() {

    System.out.println("C m1()");

    }

    public void m2() {

    System.out.println("C m2()");

    }

    public void binfm() {

    System.out.println("cbinfm()");

    }

    public void ainfm() {

    System.out.println("cainfm()");

    }

    public static void main(String[] args) {

    C c = new C();

    Ainf pa = c;

    pa.ainfm();//cainfm()//接口Ainf;pa只能使用接口 Ainf中有的这一个函数。

    Binf pb = c;

    pb.binfm();//cbinfm()//接口Binf

    //接口类的引用也可以接受使用了该接口的类的地址;这一点类似于抽象类的抽象方法的继承,规则是类似的。

       

    }

    }

    package com.test;

       

    public class Test {

    public void t(A a) {//这算是一种回调;传哪个类对象的地址,就执行哪个类的函数

    a.m1();                        //A,B,C类中有各自特别定义的m1();m2()

    a.m2();

    }

    public static void main(String[] args) {

    Test test = new Test();

    A a = new A();

    test.t(a);//A m1();A m2()

    B b = new B();

    test.t(b);//B m1();B m2()

    C c = new C();

    test.t(c);//C m1();C m2()

    Object obj = c;

    //Object 可以接受任何类的地址;但是只能执行Object原定义的成员。而这个成员可能被重写。

    obj.toString();

    }

    }

       

  • 相关阅读:
    linux 之文网络编程基础 (二)、大小端、地址地址转换函数
    linux 之文网络编程基础 (一)、网络编程基本概念
    Linux下静态库与动态库简单制作与使用
    linux 之文件基础 (五)、文件属性
    C++ pair
    Ice 线程与并发 C++
    linux 之文件基础 (四)、标准IO的API
    linux 之文件基础 (三)、标准IO的两个概念:流、缓冲区
    linux 之文件基础 (二)、文件IO API
    linux 之线程基础 (三)、多线程编程的同步和互斥
  • 原文地址:https://www.cnblogs.com/mylinux/p/3065314.html
Copyright © 2011-2022 走看看