Java学习 ---- 多态、接口与抽象

时间:2019-04-20
本文章向大家介绍Java学习 ---- 多态、接口与抽象,主要包括Java学习 ---- 多态、接口与抽象使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Day09.01____Java中的多态

  • 含义:
    • 多态指的是同一事物的多种形态,例子:
      • 比如说门口有只猫,你可以说这只猫很乖,也可以说这只小动物很乖,无论是这只猫还是这只小动物都指的同一只动物,这就是同一事物的多种形态
  • 前提:
    • (1) 父类( 父接口 )必须要有子类去继承它
    • (2) 子类必须要有方法的重写
    • (3) 必须有父类( 父接口 )引用指向子类对象
      • Animal a = new Cat( )
  • 成员访问特点:
    • 只有成员方法在多态中,编译看左边(父类),运行看右边(子类);
    • 成员变量和静态成员方法,编译看左边(父类),运行看左边(父类)
      • 解析:
 class  Demo{
		public static void main(String[] args){
			Animal a = new Dog();
			System.out.print(a.num);    --->  10
			a.eat();	---> 狗吃饭
			a.study();  ---> 动物学习
		}
} 
class Animal{
		int num = 10;
		public void eat(){
			System.out.print("动物吃饭");
		}
		public static void study(){
			System.out.print("动物学习");
		}
}
class Dog extends Animal{
		int num = 20;
		public void eat(){
			System.out.print("狗吃饭");
		}
		public static void study(){
			System.out.print("狗学习");
		}
}
  • (1) 成员变量的访问:
    • 当程序运行的时候:
      • a、 将Demo.class文件加载进方法区中,并将该类中的方法加载进入方法区,静态方法进入静态区,非静态方法进入非静态区;
      • b.、将主方法加载进栈内存中;
      • c、 将Animal.class文件加载进方法区中,并将该类中的方法加载进入方法区,静态方法进入静态区,非静态方法进入非静态区;
      • d.、将Dog.class文件加载进方法区中,并将该类中的方法加载进入方法区,静态方法进入静态区,非静态方法进入非静态区;
      • e、 将引用变量Animal a加载进栈内存中;f. 在堆内存中创建newDog()的实例( 在这个实例中有一块区域是super的区域,用于存放父类的成员变量 );
      • g、 将创建的对象地址赋值给Animal a;
      • h、 访问数据得出结果( 因为a是父类Animal的引用对象,所以a在指向堆内存中的对象 时,访问的是super中的变量);
  • (2) 成员方法的访问:
    • 当程序运行的时候:
      • a、将Demo.class文件加载进方法区中,并将该类中的方法加载进入方法区,静态 方法进入静态区,非静态方法进入非静态区;
      • b、 将主方法加载进栈内存中;
      • c、将Animal.class文件加 载进方法区中,并将该类中的方法加载进入方法区,静态方法进入静态区,非静态方法进入非静态区;
      • d、 将Dog.class文件加载进方法区中,并将该类中的方法加载进入方法区,静态方法进入静态区、非静态方法进入非静态区;
      • e、将引用变量Animal a加载进栈内存中;
      • f、在堆内存中创建new Dog()的实例( 在这个实例中有一块区域是super的区域,用于存放父类的成员变量 );
      • g、将创建的对象地址赋值给Animal a;
      • h、调用方法区中的eat()方法(因为a是父类Animal的引用对象,所以a在指向堆内存中的对象时,访问的是super中的方法);
      • i、程序在编译时,a指向Animal中的成员方法,但是当在运行时虚拟机会检查子类中是否有重写父类中的方法,如果重写了就调用子类中的成员方法,如果没有重写就调用父类的成员方法,这种方式叫做 —> 动态绑定
  • (3) 静态方法的访问:
    • 当程序运行的时候:
      • a. 将Demo.class文件加载进方法区中,并将该类中的方法加载进入方法区,静态方法进入静态区,非静态方法进入非静态区;
      • b、 将主方法加载进栈内存中;
      • c、将Animal.class文件加载进方法区中,并将该类中的方法加载进入方法区,静态方法进入静态区,非静态方法进入非静态区;
      • d、将Dog.class文件加载进方法区中,并将该类中的方法加载进入方法区,静态方法进入静态区,非静态方法进入非静态区;
      • e、将引用变量Animal a加载进栈内存中;
      • f、在堆内存中创建new Dog()的 实例( 在这个实例中有一块区域是super的区域,用于存放父类的成员变量 );
      • g、将创建的对象地址赋值给Animal a;
      • h、调用方法区中的study()方法( 因为a是父类Animal的引用对象,所以a在指向堆内存中的对象时,访问的是Animal中的静态方法);
      • i、程序运行,得出结果( 因为静态的方法可以用(类.)的形式调用,且随着类的加载而加载,因此静态的成员方法不存在重写的说法,因此是谁的引用对象就调用谁的静态成员方法 )
  • 多态的好处与弊端:
    • 好处:
      • (1) 提高了代码的维护性
      • (2) 提高了代码的扩展性
    • 弊端:
      • 父类引用不能调用子类的特有功能


Day09.02____向上转型与向下转型

  • 向上转型:即自动类型提升 Person p = new Student()
    • 运用特别的广泛,其运用的场景为:
      • 当所有的子类都重写了父类中方法,并且在另一个类中需要去调用该方法时,就可以通过多态提高代码的复用性
  • 向下转型:即强制类型转换 Student stu = (Student) p


Day09.03____Java中的abstract(抽象)

  • 定义抽象类格式:
    • abstract class 类名{ … }
  • 定义抽象方法格式:
    • public abstract void eat();
  • 定义抽象的意义:
    • 给继承自己的子类定义一种规范、规则
  • 定义抽象的注意事项:
    • (1) 抽象方法存在,那所在的类一定是抽象类
    • (2) 抽象方法中不允许有内容( 方法体 )
    • (3) 抽象类中既可以有抽象方法,也可以有非抽象的方法。
  • 子类继承抽象类后:
    • (1) 子类是一个抽象类
    • (2) 子类重写父类( 抽象类 )中所有的抽象方法
      满足其中之一即可
  • 子类继承抽象类后重写抽象方法注意事项:
    • 如果在父类中有一个抽象方法public abstract void eat();
      那么在子类中重写时应该为public void eat(){ … }


Day09.04____面试题

  • 不能与abstract关键词联用的关键词有 :
    • (1) final
      • final表示最终的意思,被final修饰后不让子类重写,而abstract的目的就是为了让子类重写,所以冲突了
    • (2) static
      • 被static修饰的方法和变量可以通过( 类名. )的方式进行访问,而通过( 类名. )访问abstract修饰的方法没有意义
    • (3) private
      • 被private修饰的方法和变量不会被子类看见,而abstract就是为了让子类重写,所以冲突了
  • 一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果有,意义是什么?
    • 可以。这么做的目的只有一个,为了不让其他类创建本类的对象,交给子类去创建对象。


Day09.05____Java中的接口

  • 定义格式
    • interface 接口名{ … }
  • 使用规则
    • (1) 接口中的所有方法必须为抽象的
    • (2) 继承接口使用 implements关键字
    • (3) 继承接口后,子类必须实现接口中的所有抽象方法
    • (4) 接口不能实例化
    • (5) 接口中所有的方法系统都会默认加上public abstract,所有的变量系统都会默认加上public static final
  • 接口与父类的区别:
    • 用辈分关系来解释,接口是干爹,父类是亲爹


Day09.06____类与类,类与接口,接口与接口的关系

  • 类与类之间是继承关系( 用extends关键字 ),只能单继承
  • 类与接口之间是实现关系( 用implements关键字 ),既可以单实现,也可以多实现。即继承接口的类必须实现接口中所有的抽象方法
  • 接口与接口之间是继承关系( 用extends关键字 ),既可以单继承,也可以多继承。即继承接口的类必须实现接口中所有的抽象方法


Day09.07____抽象类与接口的区别:

  • 抽象类:实质与普通类差不多,只是多了一个抽象方法
    • 成员变量:可以是变量,也可以是常量
    • 构造方法:有。( 目的是为了给子类对象属性进行初始化 )
    • 成员方法:可以是抽象,也可以是非抽象
  • 接口:
    • 成员变量:只能是常量
    • 成员方法:只能是抽象方法
  • 设计理念区别:
    • (1) 抽象类定义的是共性功能,即所有物体都包含的功能
    • (2) 接口定义的是扩展功能,即大家不一定全都有的功能