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(){ … }
- 如果在父类中有一个抽象方法public abstract void eat();
Day09.04____面试题
- 不能与abstract关键词联用的关键词有 :
- (1) final
- final表示最终的意思,被final修饰后不让子类重写,而abstract的目的就是为了让子类重写,所以冲突了
- (2) static
- 被static修饰的方法和变量可以通过( 类名. )的方式进行访问,而通过( 类名. )访问abstract修饰的方法没有意义
- (3) private
- 被private修饰的方法和变量不会被子类看见,而abstract就是为了让子类重写,所以冲突了
- (1) final
- 一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果有,意义是什么?
- 可以。这么做的目的只有一个,为了不让其他类创建本类的对象,交给子类去创建对象。
- 可以。这么做的目的只有一个,为了不让其他类创建本类的对象,交给子类去创建对象。
Day09.05____Java中的接口
- 定义格式
- interface 接口名{ … }
- 使用规则
- (1) 接口中的所有方法必须为抽象的
- (2) 继承接口使用 implements关键字
- (3) 继承接口后,子类必须实现接口中的所有抽象方法
- (4) 接口不能实例化
- (5) 接口中所有的方法系统都会默认加上public abstract,所有的变量系统都会默认加上public static final
- 接口与父类的区别:
- 用辈分关系来解释,接口是干爹,父类是亲爹
- 用辈分关系来解释,接口是干爹,父类是亲爹
Day09.06____类与类,类与接口,接口与接口的关系
- 类与类之间是继承关系( 用extends关键字 ),只能单继承
- 类与接口之间是实现关系( 用implements关键字 ),既可以单实现,也可以多实现。即继承接口的类必须实现接口中所有的抽象方法
- 接口与接口之间是继承关系( 用extends关键字 ),既可以单继承,也可以多继承。即继承接口的类必须实现接口中所有的抽象方法
Day09.07____抽象类与接口的区别:
- 抽象类:实质与普通类差不多,只是多了一个抽象方法
- 成员变量:可以是变量,也可以是常量
- 构造方法:有。( 目的是为了给子类对象属性进行初始化 )
- 成员方法:可以是抽象,也可以是非抽象
- 接口:
- 成员变量:只能是常量
- 成员方法:只能是抽象方法
- 设计理念区别:
- (1) 抽象类定义的是共性功能,即所有物体都包含的功能
- (2) 接口定义的是扩展功能,即大家不一定全都有的功能
- split-brain 脑裂问题(Keepalived)
- Android新手之旅(3) 信息的输出
- Nginx code 状态码说明
- Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器
- proxy_pass根据path路径转发时的"/"问题记录
- 温故而知新:查看端口占用情况以及DOS中的管道操作/重定向操作
- Android新手之旅(7) RadioButton的自定义
- Flash/Flex学习笔记(4):如何打开网页及Get/Post数据
- Flash/Flex学习笔记(5):捕获摄像头(续)--在线抓屏并保存到客户端本地
- 分布式监控系统Zabbix--使用Grafana进行图形展示
- Silverlight在线创建PDF(支持中文)
- Flash/Flex学习笔记(3):动态添加组件
- Flash/Flex学习笔记(1):Hello World!
- 数据库常规操作
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 带分数 第四届蓝桥杯省赛C++B组
- codeforce1178B (DP)
- String Modification (CodeCraft-20 (Div. 2))
- codeforces 107A(dfs)
- codeforces 698A(暴力)
- 机器人跳跃问题 (二分)
- codeforces 1066B(贪心)
- 机器学习模型评估指标总结!
- 地宫取宝 (第五届蓝桥杯省赛C++A/B组)
- codeforce 650A (数学)
- POJ3279 (二进制枚举)
- codeforces 1312C(思维)
- codeforces1369C(贪心)
- 新人赛《金融风控贷款违约》避坑指南!
- codeforces 911C (找规律)