JavaSE知识-09(面向对象_多态&抽象类&接口)

多态的概述及其代码体现

  • 多态(polymorphic)概述

    • 事物存在的多种形态
  • 多态前提
    • a:要有继承关系。
    • b:要有方法重写。
    • c:要有父类引用指向子类对象。
class Demo1_Polymorphic {
    public static void main(String[] args) {
        Cat c = new Cat();
        c.eat();

        Animal a = new Cat();  //猫是一只动物             //父类引用指向子类对象
        a.eat();
    }
}

class Animal {
    public void eat() {
        System.out.println("动物吃饭");
    }
}

class Cat extends Animal {
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

运行结果为猫吃鱼 猫吃鱼

多态中的成员访问特点之成员变量

  • 成员变量

    • 编译看左边(父类),运行看左边(父类)。

运行结果为 10 20

多态中的成员访问特点之成员方法

  • 成员方法

    • 编译看左边(父类),运行看右边(子类)。

将Father.class 中的print方法注释掉就会报错:找不到符号 f.print();
运行结果为 son

多态中的成员访问特点之静态成员方法

  • 静态方法

    • 编译看左边(父类),运行看左边(父类)。
    • (静态和类相关,算不上重写,所以,访问还是左边的)
  • 只有非静态的成员方法,编译看左边,运行看右边
class Demo2_Polymorphic {
    public static void main(String[] args) {
        Father f = new Son();
        f.method();                         //相当于是Father.method()
    }
}

class Father {
    public static void method() {
        System.out.println("father static method");
    }
}

class Son extends Father {
    public static void method() {
        System.out.println("son static method");
    }
}

运行结果为father static method

多态中向上转型和向下转型

class Demo3_SuperMan {
    public static void main(String[] args) {
        Person p = new SuperMan();          //父类引用指向子类对象,超人提升为了人,向上转型
                                            //父类引用指向子类对象就是向上转型
        System.out.println(p.name);
        p.谈生意();
        SuperMan sm = (SuperMan)p;          //向下转型
        sm.fly();
    }
}

class Person {
    String name = "John";
    public void 谈生意() {
        System.out.println("谈生意");
    }
}

class SuperMan extends Person {
    String name = "superMan";

    public void 谈生意() {
        System.out.println("谈几个亿的大单子");
    }

    public void fly() {
        System.out.println("飞出去救人");
    }
}

运行结果为 John 谈几个亿的大单子 飞出去救人

  • 多态的好处

    • a:提高了代码的维护性(继承保证)
    • b:提高了代码的扩展性(由多态保证)
    • 可以当作形式参数,可以接收任意子类对象
  • 多态的弊端
    • 不能使用子类的特有属性和行为。

多态的好处和弊端

class Demo4_Animal {
    public static void main(String[] args) {
        //Cat c1 = new Cat();
        //c1.eat();
        method(new Cat());
        method(new Dog());

        //Animal a = new Cat();         实际开发中很少在创建对象的时候用父类引用指向子类对象,直接创建子类对象更方便,可以使用子类中的特有属性和行为
    }

    //Cat c = new Dog();狗是一只猫,这是错误的
    /*public static void method(Cat c) {
        c.eat();
    }

    public static void method(Dog d) {
        d.eat();
    }*/

    //如果把狗强转成猫就会出现类型转换异常,ClassCastException
    public static void method(Animal a) {   //当作参数的时候用多态最好,因为扩展性强
        //关键字 instanceof 判断前边的引用是否是后边的数据类型
        if (a instanceof Cat) {
            Cat c = (Cat)a;
            c.eat();
            c.catchMouse();
        }else if (a instanceof Dog) {
            Dog d = (Dog)a;
            d.eat();
            d.lookHome();
        }else {
            a.eat();
        }
    }
}

class Animal {
    public void eat() {
        System.out.println("动物吃饭");
    }
}

class Cat extends Animal {
    public void eat() {
        System.out.println("猫吃鱼");
    }

    public void catchMouse() {
        System.out.println("抓老鼠");
    }
}

class Dog extends Animal {
    public void eat() {
        System.out.println("狗吃肉");
    }

    public void lookHome() {
        System.out.println("看家");
    }
}

抽象类的概述及其特点

  • A:抽象类概述

    • 抽象就是看不懂的
  • B:抽象类特点
    • a:抽象类和抽象方法必须用abstract关键字修饰

      • abstract class 类名 {}
      • public abstract void eat();
    • b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
    • c:抽象类不能实例化那么,抽象类如何实例化呢?
      • 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
    • d:抽象类的子类
      • 要么是抽象类
      • 要么重写抽象类中的所有抽象方法 推荐
class Demo1_Abstract {
    public static void main(String[] args) {
        //Animal a = new Animal();          //错误: Animal是抽象的; 无法实例化
        Animal a = new Cat();               //父类引用指向子类对象
        a.eat();
    }
}

abstract class Animal {                     //抽象类
    public abstract void eat();             //抽象方法

    public Animal() {
        System.out.println("父类空参构造");
    }
}

class Cat extends Animal {
    public Cat() {
        super();
    }
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

运行结果为 父类空参构造 猫吃鱼

猫狗案例

  • 具体事物:猫,狗
  • 共性:姓名,年龄,吃饭
  • 猫的特性:抓老鼠
  • 狗的特性:看家
class Test1_Animal {
    public static void main(String[] args) {
        Cat c = new Cat("加菲",8);
        System.out.println(c.getName() + "..." + c.getAge());
        c.eat();
        c.catchMouse();

        Dog d = new Dog("八公",30);
        System.out.println(d.getName() + "..." + d.getAge());
        d.eat();
        d.lookHome();
    }
}

abstract class Animal {
    private String name;                //姓名
    private int age;                    //年龄

    public Animal(){}                   //空参

    public Animal(String name,int age) {//有参
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {  //设置姓名
        this.name = name;
    }

    public String getName() {           //获取姓名
        return name;
    }

    public void setAge(int age) {       //设置年龄
        this.age = age;
    }

    public int getAge() {               //获取年龄
        return age;
    }

    public abstract void eat();         //吃饭
}

class Cat extends Animal {
    public Cat(){}                  //空参

    public Cat(String name,int age) {//有参
        super(name,age);
    }

    public void eat() {
        System.out.println("猫吃鱼");
    }

    public void catchMouse() {
        System.out.println("抓老鼠");
    }
}

class Dog extends Animal {
    public Dog(){}                  //空参

    public Dog(String name,int age) {//有参
        super(name,age);
    }

    public void eat() {
        System.out.println("狗吃肉");
    }

    public void lookHome() {
        System.out.println("看家");
    }
}

老师案例

  • 具体事物:基础班老师,就业班老师

    • 共性:姓名,年龄,讲课。
class Test2_Teacher {
    public static void main(String[] args) {
        BaseTeacher bt = new BaseTeacher("冯佳",18);
        bt.teach();
    }
}

abstract class Teacher {
    private String name;                //姓名
    private int age;                    //年龄

    public Teacher(){}                  //空参

    public Teacher(String name,int age) {//有参
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {  //设置姓名
        this.name = name;
    }

    public String getName() {           //获取姓名
        return name;
    }

    public void setAge(int age) {       //设置年龄
        this.age = age;
    }

    public int getAge() {               //获取年龄
        return age;
    }

    public abstract void teach();
}

class BaseTeacher extends Teacher {
    public BaseTeacher(){}                  //空参

    public BaseTeacher(String name,int age) {//有参
        super(name,age);
    }

    public void teach() {
        System.out.println("我的姓名是:" + this.getName() + ",我的年龄是:" + this.getAge() + ",讲的内容是java基础");
    }
}

原文地址:https://www.cnblogs.com/albieh/p/12207407.html

时间: 2024-11-19 09:36:23

JavaSE知识-09(面向对象_多态&抽象类&接口)的相关文章

2019-05-17 Java学习日记之面向对象_多态&抽象类&接口

多态 多态的概述: A:多态(polymorphic) 事物存在的多种形态 B:多态前提 a:要有继承关系 b:要有方法重写c:要有父类引用指向子类对象 多态中的成员访问特点之成员变量: 成员变量:编译看左边(父类),运行看左边(父类)多态中的成员访问特点之成员方法:成员方法:编译看左边(父类),运行看右边(子类)多态中的成员访问特点之静态成员方法:静态方法:编译看左边(父类),运行看左边(父类)(静态和类相关,算不上重写,所以访问还是左边的)只有非静态的成员方法,编译看左边,运行看右边 多态的

JavaSE知识-10(面向对象_权限修饰符&匿名内部类)

A:为什么要有包 将字节码(.class)进行分类存放 包其实就是文件夹 举例: 学生:增加,删除,修改,查询 老师:增加,删除,修改,查询 ... 方案1:按照功能分 com.hwh.add AddStudent AddTeacher com.hwh.delete DeleteStudent DeleteTeacher com.hwh.update UpdateStudent UpdateTeacher com.hwh.find FindStudent FindTeacher 方案2:按照模块

JavaSE知识-08(面向对象_继承&方法&final)

代码块的概述和分类 根据其位置和声明的不同,代码块可以分为局部代码块,构造代码块,静态代码块,同步代码块. 常见代码块的应用 a:局部代码块 在方法中出现:限定变量生命周期,及早释放,提高内存利用率 b:构造代码块 (初始化块) 在类中方法外出现:多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行 c:静态代码块 在类中方法外出现,并加上static修饰:用于给类进行初始化,在加载的时候就执行,并且只执行一次. 一般用于加载驱动 class Demo1_Code {

小知识(五):抽象类&接口

抽象类abstract: 抽象类和抽象方法可以用abstract关键字进行标识.就是没有完全定义的类或方法.所以不能直接实例化操作. 就因为他没完全定义所以不能用sealed关键字进行密封. 抽象方法不含程序主体: public abstract class Student { //抽象方法,不含程序体 public abstract void GetStudentID(); //子类可访问字段 prodected int i; //定义i的属性 public int I { get { ret

面向对象的理解 抽象类&接口

一.关于面向对象 1.什么是面向对象 在解释面向对象之前,先说说面向过程.学过C的同学都知道,C就是面向过程的一种语言.那什么是面向过程呢?比方说组装主机,对于面向过程,需要从0开始.买cpu,显卡,主板,电源,风扇,把这些都通过主板链接到一起.我需要清楚的知道主机组装的每一个步骤. 介绍了面向过程,再说会正题,什么是面向对象?对于上面的装主机过程面向对象会把主机先抽象成一个机箱,机箱里有cpu,显卡,主板,电源.用主机的人,不关心里面是怎么工作的,也不需要知道内部逻辑,只知道插上电源就能用.面

go面向对象之多态即接口(interface)

1.go语言的多态是用接口来实现的interface package main import "fmt" //面向对象的多态是通过接口interface来实现的,不同的对象,调用相同的接口,实现不同的效果 //go语言中,接口interface是一个自定义类型,描述了一系列方法的集合,关键字interface //接口不能被实例化 //定义接口的方法 //type 接口名字 interface { // //} //接口的名字一般以er结尾 //定义一个Personer的接口 type

面向对象_多态_抽象类_接口

09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案例演示 代码体现多态 public class Demo1_polymorphic { /** * 成员变量:编译时看左边(父类),运行时看左边(父类) * 成员方法:编译时看左边(父类),运行时看右边(子类) * @param args */ public static void main(Str

06 面向对象:多态&抽象类&接口&权限修饰符&内部类

多态: /* 多态(polymorphic)概述 * 事物存在的多种形态 多态前提 * a:要有继承关系. * b:要有方法重写. * c:要有父类引用指向子类对象. * 成员变量 * 编译看左边(父类),运行看左边(父类). * 成员方法 * 编译看左边(父类),运行看右边(子类).动态绑定 * 静态方法 * 编译看左边(父类),运行看左边(父类). * (静态和类相关,算不上重写,所以,访问还是左边的) * 只有非静态的成员方法,编译看左边,运行看右边 */ class Demo_Polym

JAVA基础笔记(很实用)继承-多态-抽象类-接口-异常-集合-IO-线程-Socket

第七章:Java继承 一.继承的概念 1.一个父类派生出一个子类的机制称为继承. 2.承是重用程序代码的有力手段,当多个类之间存在相同的属性和方法时,可以从这些类中抽象出父类. 3.们只需要在父类中定义这些属性和方法,而子类无须重新定义这些属性和方法,直接从父类继承即可. 4.通过继承,子类就会自动的拥有在父类中定义的属性和方法. 5.两个或多个类的成员中存在一部分相同的情况,通过继承机制,可以利用现有的类来创建新的类. 6.子类不但拥有父类的成员,还可以定义新的成员. 7.可以提高软件的可重用