【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 我们来 ...
随机推荐
- 人力节省 50%,研发效能提升 40%,阿里 Serverless 架构落地实践
作者 | 万佳 嘉宾 | 杨皓然(不瞋) 导读:云的下一波浪潮是什么?杨皓然称"是 Serverless".作为一名阿里老兵,他早在 2010 年即加入阿里云,曾深度参与阿里云飞天 ...
- 基于TLS证书手动部署kubernetes集群
一.简介 Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S. K8S是Google内部一个叫Borg的容器集群管理系统 ...
- CountBoard 是一个基于Tkinter简单的,开源的桌面日程倒计时应用
CountBoard 是一个基于Tkinter简单的,开源的桌面日程倒计时应用. 项目地址 https://github.com/Gaoyongxian666/CountBoard 基本功能 置顶功能 ...
- MIPS指令 MIPS架构
华中科技大学 - 计算机组成原理 华中科技大学 - 计算机硬件系统设计 Microprocessor without Interlocked Pipleline Stages 无内部互锁流水级的微处理 ...
- 如何正确使用JMeter性能测试?紧扣面试实际要求
前段时间专门挑了一段时间在准备面试.经过两次面试后,有一些比较深刻的认识.对于企业要求来说,除了对专业理论知识考究之外,对测试工具这块也是看重的. 一.使用JMeter测试快速入门 1.线程组是什么 ...
- UF_CAMGEOM_ask_custom_points 封装缺陷
如果当前设置为0个点时,取自定义点就会报错,这又是一个封装错误 解决办法,只能是这么搞了:
- Kubernetes client-go 源码分析 - Reflector
概述入口 - Reflector.Run()核心 - Reflector.ListAndWatch()Reflector.watchHandler()NewReflector()小结 概述 源码版本: ...
- windows环境下基于pycharm安装Redis出现的两个错误解决方案
说明:下面给出的两个链接是解决安装和使用Redis的时候遇到的两个问题参考的博客网址,本文有解释不清楚的地方可以原博客查看,侵权删! Q1参考链接-https://blog.csdn.net/maqu ...
- 为Kubernetes集群添加用户认证
Kubernetes中的用户 K8S中有两种用户(User)--服务账号(ServiceAccount)和普通意义上的用户(User) ServiceAccount是由K8S管理的,而User通常是在 ...
- 锚点布局anchorlayout在kv中的引用
from kivy.app import App from kivy.uix.anchorlayout import AnchorLayout from kivy.uix.button import ...