zoukankan      html  css  js  c++  java
  • Java(4)_ 多态,抽象类·,接口

    1.多态

    1.1多态概述

    同一个对象,在不同时刻表现出来的不同形态
    举例:猫
    我们可以说猫是猫:猫 cat = new 猫();
    我们也可以说猫是动物:动物 animal = new 猫();
    这里猫在不同的时刻表现出来了不同的形态,这就是多态

    多态的前提和体现

    • 有继承/实现关系
    • 有方法重写
    • 有父类引用指向子类对象

    1.2 多态中成员访问特点

    • 成员变量:编译看左边,执行看左边

    • 成员方法:编译看左边,执行看右边

    为什么成员变量和成员方法的访问不一样呢?

    • 因为成员方法有重写,而成员变量没有

    举个例子:

    //父类 动物类
    public class Animal {
        public int age=10;
        public void eat(){
            System.out.println("动物吃东西");
        }
    }
    
    //子类 猫类
    public class Cat extends Animal {
    
        public int age=20;
        public int weight=20;
        @Override
        public void eat() {
            //super.eat();
            System.out.println("猫吃鱼");
        }
    
        public void playGame() {
            //super.eat();
            System.out.println("猫玩游戏");
        }
    
    
    //测试类
    public class AnimalDemo {
        public static void main(String[] args) {
    
            Animal a=new Cat();
            a.eat();
            System.out.println(a.age);
        }
    }
    

    运行测试结果发现:image

    并且发现a.playGame会报错,因为一开始是Animal a=new Cat();
    image

    1.3 多态的好处和弊端

    • 多态的好处:提高了程序的扩展性
      具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作

    image

    1.4 多态中的转型

    • 向上转型
      从子到父
      父类引用指向子类对象
    • 向下转型
      从父到子
      父类引用转为子类对象

    举例:

            Animal a = new Cat(); //向上转型
            a.eat();
            System.out.println(a.age);
    
            /*Cat c =new Cat();
            c.eat();
            c.playGame();*/
    
            //向下转型
            Cat c = (Cat) a;
            c.eat();
            c.playGame();
    

    1.5 内存图解:

    image
    image
    image
    image

    2.抽象类

    2.1抽象类的概述(理解)

    当我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了!
    在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类!

    2.2抽象类的特点(记忆)

    • 抽象类和抽象方法必须使用 abstract 关键字修饰
    	 //抽象类的定义
    	public abstract class 类名 {}
    	//抽象方法的定义
    	public abstract void eat();
    
    • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象
    • 抽象类不能实例化
      抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态
    • 抽象类的子类
      要么重写抽象类中的所有抽象方法
      要么是抽象类

    2.3抽象类的成员特点(记忆)

    • 成员的特点

    • 成员变量

      • 既可以是变量
      • 也可以是常量
    • 构造方法

      • 空参构造
      • 有参构造
    • 成员方法

      • 抽象方法
      • 普通方法
    • 代码演示

      • 动物类
      public abstract class Animal {
      private int age = 20;
      private final String city = "北京";
      public Animal() {}
      public Animal(int age) {
      this.age = age;
      }
      public void show() {
      age = 40;
      System.out.println(age);
      // city = "上海";
      System.out.println(city);
      }
      public abstract void eat();
      }
      
      
    • 猫类

      public class Cat extends Animal {
      @Override
      public void eat() {
      System.out.println("猫吃鱼");
      }
      }
      
      
    • 测试类

      public class AnimalDemo {
      public static void main(String[] args) {
      Animal a = new Cat();
      a.eat();
      a.show();
      }
      }
      

    3.接口

    3.1接口的概述(理解)

    接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
    Java中的接口更多的体现在对行为的抽象!

    3.2接口的特点(记忆)

    • 接口用关键字interface修饰
      public interface 接口名 {}
      
    • 类实现接口用implements表示
      public class 类名 implements 接口名 {}
      
    • 接口不能实例化
      接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。
      多态的形式:具体类多态,抽象类多态,接口多态。
    • 接口的子类
      要么重写接口中的所有抽象方法
      要么子类也是抽象类

    3.3接口的成员特点(记忆)

    • 成员特点

    • 成员变量
      只能是常量 默认修饰符:public static final

    • 构造方法
      没有,因为接口主要是扩展功能的,而没有具体存在
      成员方法

    • 只能是抽象方法
      默认修饰符:public abstract

    • 代码演示

      • 接口
      public interface Inter {
      public int num = 10;
      public final int num2 = 20;
      // public static final int num3 = 30;
      int num3 = 30;
      // public Inter() {}
      // public void show() {}
      public abstract void method();
      void show();
      }
      
      
    • 实现类

      public class InterImpl extends Object implements Inter {
      public InterImpl() {
      super();
      }
      @Override
      public void method() {
      System.out.println("method");
      }
      @Override
      public void show() {
      System.out.println("show");
      	}
      }
      
      
      
    • 测试类

      public class InterfaceDemo {
      public static void main(String[] args) {
      Inter i = new InterImpl();
      // i.num = 20;
      System.out.println(i.num);
      // i.num2 = 40;
      System.out.println(i.num2);
      System.out.println(Inter.num);
       	}
      }
      
      

    3.5类和接口的关系(记忆)

    • 类与类的关系
      继承关系,只能单继承,但是可以多层继承
    • 类与接口的关系
      实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
    • 接口与接口的关系
      继承关系,可以单继承,也可以多继承

    3.6抽象类和接口的区别(记忆)

    • 成员区别
      • 抽象类
        变量,常量;有构造方法;有抽象方法,也有非抽象方法
      • 接口
        常量;抽象方法
    • 关系区别
      • 类与类
        继承,单继承
      • 类与接口
        实现,可以单实现,也可以多实现
      • 接口与接口
        继承,单继承,多继承
    • 设计理念区别
      • 抽象类
        对类抽象,包括属性、行为
      • 接口
        对行为抽象,主要是行为
  • 相关阅读:
    PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件
    PlantUML类图
    Java 基于log4j的日志工具类
    RabbitMQ Hello world(二)
    redis lua 初体验
    mysql 批处理 innodb_flush_at_trx_commit 测试分析
    mysql 服务日志 5.7.29
    redis 浅谈事务
    redis list 基本操作
    redis hash 基本操作
  • 原文地址:https://www.cnblogs.com/rouehang/p/15102777.html
Copyright © 2011-2022 走看看