【JAVA】笔记(5)--- final;抽象方法;抽象类;接口;解析继承,关联,与实现;
final:
1.理解:凡是final修饰的东西都具有了不变的特性;
2.修饰对象:
1)final+类--->类无法被继承;
2)final+方法--->方法无法被覆盖;
3)final+变量--->只能被赋值一次;
eg:被 final 修饰的引用,由于只能被赋值一次,所以其储存的地址不变,所以它的指向也就不会改变,但不代表其指向的对象内部的数据不会改变;
注意:
被 final 修饰的变量为实例变量时,必须手动初始化(否则报错),不能系统自动赋值了;
final 修饰的静态变量一般与static联合使用,称为常量,eg:public static final double PI = 3.1415926 ;
抽象方法:
1.概念:被 abstract 修饰的方法,无方法体( { } 也不能写 ),而且不以 ” } “结尾,以 ” ;“ 结尾;
2.格式:public abstract void fangFa ( ) ;
3.注意:抽象方法可以有参数列表;
抽象方法被重写时,abstract 要去掉;参数列表不能改变;并且加上方法体;
抽象类与接口:
1.抽象类:
1)概念:将类之间的共同特征提取出来,抽象为一个类,这种类就叫抽象类;
2)格式:abstract + class + 类名
3)抽象类可以被继承,子类可以为抽象类,也可以不是,但如果不是抽象类,必须对抽象类(父类)中的所有抽象方法进行覆盖;
4)注意:抽象类无法实例化为对象;
若抽象之间有共同特征,也可将其进一步抽象为一个抽象类;
final 与 abstract 不能联合修饰一个东西;
抽象类中也有构造方法,意义:给子类使用;
抽象类中可以有普通方法,也可以有抽象方法,但是抽象方法必须出现在抽象类中,不能出现在非抽象类中;
2.接口:
1)定义: interface + 接口名
2)特性:
接口支持多继承;
接口中所有的方法都是默认被 public abstract 修饰的,且可以省略,eg: 返回值类型 + 方法名(参数列表);
接口中的所有量都是默认被 public static final 修饰的,且可以省略,所以接口中只有常量,没有变量;
接口被继承不用 extends 用 implements(实现);
接口的完全抽象的性质,可以进一步使程序的耦合性降低,拓展性提高;
3)注意;
extends 可以与 implements 共存,extends 在前,implements 在后;
接口由于是完全抽象的,所以被实现时,也与抽象类遵循相同的规则,若子类不为抽象类,则需要对接口中的所有抽象方法都进行方法覆盖
分析原因:因为继承与实现都相当于将类体中或接口内的代码复制粘贴到子类中,所以遵循” 抽象方法只能出现在 抽象类 / 接口中 “的原则,必须要对 抽象/接口 中的所有抽象方法进行方法覆盖-->即将抽象方法转化为普通方法 ;
3.抽象类与接口的区别;
1)构造方法:前有,后无;
2)继承机制:前单继承,后多继承(interfaces 后可以加多个接口,extends 后只可以加一个类)
3)抽象类中的方法与量都无限制,接口中的方法只能是抽象方法,量只能是常量;
解析继承,关联,与实现:
1.继承:” is a “, 例如:猴子是一种动物,则 猴子 extends 动物;
---使猴子继承动物该有的特性
2.关联:” has b “,例如:我有一双鞋类,则 class 我 { 鞋 鞋 ; }
---将鞋类作为一种属性写在 我类 中,因为我穿鞋呀,所以利用关联来使” 我 拥有了 鞋“
3.实现:” like c “,例如:厨师像一个菜单一样,则 class 厨师 interfaces 菜单 { 重写菜单中的方法 }
---对于” 顾客利用菜单来点菜 “的机制来说,厨师类来实现接口,顾客来调用接口
辅助理解代码:
public class 顾客点西式柿子炒鸡蛋 {
public static void main(String[] args) {
//利用多态机制创建美国厨师对象
FoodMenu cooker=new AmericanCooker();
//调用构造方法使 顾客拿到了菜单,并将对象美国厨师传到了菜单中
Customer customer=new Customer(cooker);
//调用顾客中的点菜方法(顾客中的点菜方法调用菜单中的柿子炒鸡蛋方法,此时菜单中的方法已被美国厨师中的方法覆盖了,所以顾客吃到的是西式柿子炒鸡蛋)
customer.order();
}
}
interface FoodMenu{
void shiZiChaoJiDan();
}
class ChinaCooker implements FoodMenu{
public void shiZiChaoJiDan(){
System.out.println("中国师傅做的柿子炒鸡蛋!");
}
}
class AmericanCooker implements FoodMenu{
public void shiZiChaoJiDan(){
System.out.println("美国师傅做的柿子炒鸡蛋!");
}
}
class Customer{
private FoodMenu foodMenu;
public Customer() {
}
public Customer(FoodMenu foodMenu) {
this.foodMenu = foodMenu;
}
public FoodMenu getFoodMenu() {
return foodMenu;
}
public void setFoodMenu(FoodMenu foodMenu) {
this.foodMenu = foodMenu;
}
public void order(){
foodMenu.shiZiChaoJiDan();
}
}
运行结果:
美国师傅做的柿子炒鸡蛋!
Process finished with exit code 0
代码解析;
1.菜单是一个接口(菜单上有一个抽象的照片:柿子炒鸡蛋);
2.顾客面向菜单点菜,调用接口;
3.后台的厨师负责把柿子炒鸡蛋做好,是接口的是实现者;
4.接口作用:这个饭馆的菜单,让顾客和后厨解耦合了,顾客不用找后厨,后厨不用找顾客,他们之间完全依靠这个抽象的菜单沟通;
5.总结:面向接口编程,可以降低程序的耦合度,提高程序的拓展力;接口的使用离不开多态机制(接口+多态才可以达到降低耦合度);任何一个接口都有调用者和实现者,接口可以将调用者与实现者解耦合,调用者面向接口调用,实现者面向接口编写实现;
随笔:
Java语言中凡是没有方法体的方法都是抽象方法?
错,Object 类中就有很多方法都没有方法体,都是以 ” ;“ 结尾的,但他们 都不是抽象方法,eg:public native int hashCode( ) ;
此方法底层是调用了C++写的动态链接库程序,native 表示调用 JVM 本地程序;
由于博主目前只是一只猿宝宝,所以有些地方可能说的有些片面,若前辈们能够指点一二就更好了 (~ ̄(OO) ̄)ブ
【JAVA】笔记(5)--- final;抽象方法;抽象类;接口;解析继承,关联,与实现;的更多相关文章
- 菜鸡的Java笔记 第三十五 接口定义增强
接口定义增强 在java从一开始到现在接口之中的核心组成部分:抽象方法与全局常量,但是随着技术的不断发展,用户在使用过程之中发现了有一些问题 如果说现在有一个接口经过了长年 ...
- Java进阶篇(一)——接口、继承与多态
前几篇是Java的入门篇,主要是了解一下Java语言的相关知识,从本篇开始是Java的进阶篇,这部分内容可以帮助大家用Java开发一些小型应用程序,或者一些小游戏等等. 本篇的主题是接口.继承与多态, ...
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal
java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型 也就是 ...
- JAVA笔记20-容器之四Map接口、自动打包、泛型(重要)
一.Map接口 Map提供的是key到value的映射.key不能重复,每个key只能映射一个value. 注:重复是指equals,但用equals()方法效率低,所以此处用hashCode()方法 ...
- JAVA笔记19-容器之三 Set接口、List接口、Collections类、Comparable接口(重要)
一.Set接口 //HashSet综合举例 import java.util.*; public class Test{ public static void main(String[] args){ ...
- JAVA笔记2-面向对象与内存解析
1.java中的变量先声明.再赋值.再使用.(局部变量必须初始化,成员变量默认初始化) 2.基本类型之外的所有类型都是引用类型.基本类型占一块内存,引用类型占两块(所有new出来的东西装在堆内存,因为 ...
- java复习(5)---接口、继承、多态
Java作为完全面向对象语言,接口.继承和多态是三个非常重要的概念. 1.继承. (1)关键字: extends (2)子类用super()调用父类构造函数,用super().方法 调用父类的成员方法 ...
- java详解final、多态、抽象类、接口原理
1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. C:它修饰的变量,是一个常量. (3)面试相关: ...
- JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展
JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来 ...
随机推荐
- vm 将宿主机文件夹 映射至 虚拟机
一.关于centos如何安装(自行百度) 二.设置共享文件夹 添加共享文件夹(关闭虚拟机时操作) 虚拟机->设置->选项->共享文件夹 三.安装vm-tools (请用root用户执 ...
- IO之字节流
什么是字节流 像操作 图片 视频 mp4 文档(里面可能有图片) 等等 注意点 必须使用try catch finally 来包 不用throws(流是要关闭的 如果中途抛错 throws 无法将流关 ...
- JS 实现计算器功能
括号功能未实现,后续更 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- 活动回顾|ShardingSphere X openGauss,将会产生怎样的化学反应?
"ShardingSphere 作为 openGauss 生态的开源分布式数据库解决方案,将持续助力于 openGauss,满足千行百业广大客户分布式场景需求." 5月29日,由 ...
- 告别Vuex,发挥compositionAPI的优势,打造Vue3专用的轻量级状态
Vuex 的遗憾 Vuex 是基于 Vue2 的 option API 设计的,因为 optionAPI 的一些先天问题,所以导致 Vuex 不得不用各种方式来补救,于是就出现了 getter.mut ...
- 图解java 多线程模式 读书笔记
第1章"Single Threaded Execution模式--能通过这座桥的只有一个人" 该模式可以确保执行处理的线程只能是一个,这样就可以有效防止实例不一致. 第⒉章&quo ...
- 离线状态迁移Anaconda虚拟环境
离线状态迁移Anaconda虚拟环境 同样是项目需求,需要布署的服务器上的Anaconda安装到了普通账户下 而后续所有的内容都需要通过root账户进行操作,而服务器已经布署,联网比较麻烦 本文提出, ...
- Java中的函数式编程(八)流Stream并行编程
写在前面 在本系列文章的第一篇,我们提到了函数式编程的优点之一是"易于并发编程". Java作为一个多线程的语言,它通过 Stream 来提供了并发编程的便利性. 题外话: 严格来 ...
- 6月6日 Scrum Meeting
日期:2021年6月6日 会议主要内容概述: 删除模板选择页面,画图页面新增模板选择 保存时后端判重 后端要新增数据分享url 主题色->lxd:画图教程->lsp:表格数据分析-> ...
- 轻量级 Java 基础开发框架,Solon & Solon Cloud 1.5.52 发布
Solon 已有120个生态扩展插件,此次更新主要为细节打磨: 插件 mybatis-solon-plugin 增加 mappers 单行配置支持 之前的多行模式: mybatis.db1: type ...