【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 我们来 ...
随机推荐
- Liunx下Mysql,MongoDB性能优化的配置
场景 这几天在赶十一上线的项目,但是突然发现接口性能不好,高并发支持不住.又不想改代码,就在数据库层面进行优化. Mysql 分区:项目中有对40万条的数据进行时间查询的要求,就算对DateTime建 ...
- SpringBoot 添加本地 jar 文件
前言 有时候我们在项目中,会用到一些本地 jar 包文件,比如隔壁公司自己打包的: 此时无法从maven远程仓库拉取: 那么我们可以考虑把 jar 文件安装到本地 maven 库中,然后再添加依赖. ...
- vulnhub靶机-Me and My Girlfriend: 1
vulnhub靶机实战 1.靶机地址:https://www.vulnhub.com/entry/me-and-my-girlfriend-1,409/ 2.先看描述(要求) 通过这个我们可以知道我们 ...
- 实验4:开源控制器实践——OpenDaylight
实验4:开源控制器实践--OpenDaylight 一.实验目的 能够独立完成OpenDaylight控制器的安装配置: 能够使用Postman工具调用OpenDaylight API接口下发流表. ...
- [USACO10NOV]Buying Feed G
part 1 暴力 不难发现有一个 $\mathcal O(K^2n)$ 的基础 dp: $$f_{i,j+l}=\min(f_{i,j+l},f_{i-1,j}+(x_i-x_{i-1})jj+c_ ...
- 浅谈机(J)惨(C)技巧——从入门到精通(?)
JC总是无聊的机房中有意思的一个瞬间... 比如: 这个杰作由 ZSWBWYX 完成 你认为这只是AK-IOI吗?不!注意用户名...也是此人的杰作. 所以,在险恶的机房里,一定要保护好自己的账号. ...
- display:none、visibility:hidden,opacity:0三者区别
1. display:none 设置display:none,让这个元素消失 消失不占据原本任何位置 连带子元素一起消失 元素显示:display:block 2. visibility:hidden ...
- Apache ShardingSphere 邀您相约 Open Source Day
Apache ShardingSphere 很荣幸接受 AnitaB.org 的邀请参加 OpenSourceDay Summer 2021 活动. Open Source Day (OSD) 是一个 ...
- python常用内置函数(转载)
1. 和数字相关 1.1 数据类型 1.2 进制转换 1.3 数学运算 2. 和数据结构相关 2.1 序列 2.2 数据集合 2.3 相关内置函数 3. 和作用域相关 4. 和迭代器生成器相关 5. ...
- 小白自制Linux开发板 六. SPI TFT屏幕修改与移植
本文章参考:https://www.bilibili.com/read/cv9947785?spm_id_from=333.999.0.0 本篇通过SPI接口,使用ST7789V TFT焊接屏(13p ...