Java基础学习笔记(三) - 抽象类和接口
一、抽象类
没有方法主体的方法称为抽象方法,包含抽象方法的类就是抽象类。
Java中使用 abstract 关键字修饰方法和类,抽象方法只有一个方法名,没有方法体。
public abstract class TestAbstract { //抽象类
public abstract void run();//抽象方法
}
- 如果一个类继承了抽象类,那么该类必须重写父类的所有抽象方法,否则该类也必须声明抽象类。
- 抽象类不能创建对象,只能由其子类创建。
- 抽象类可以拥有构造方法,是用来给子类创建对象时,初始化父类成员使用的。
- 必须有一个子类来实现抽象父类的抽象方法,否则,抽象类的存在无任何意义。
- 抽象类不一定拥有抽象方法,但包含抽象方法的类必定是抽象类
public abstract class Animal { //抽象类
public abstract void eat();//抽象方法
}
public class Test{
public static void main(String[] args){
Dog d = new Dog();
d.eat();
}
}
class Dog extends Animal{ //继承动物类并重写eat方法
public void eat(){
System.out.println("小狗吃饭了");
}
}
方法重写,其实是子类对父类抽象方法的完成实现,所以也叫做抽象父类的实现方法。
二、接口
概念: 接口,是Java语言中一种引用数据类型,是方法的集合。
注意:接口虽然和定义类的方式相似,但是一定要明确接口不是类,是一种引用数据类型。
使用:接口不能创建对象,但是可以被实现,使用 interface 关键字定义接口,使用 implements 关键字创建一个实现接口的类(类似于抽象类的实现),然后创建该类对象,就可以调用方法了。
特点:
- 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用 public static final (下篇介绍)修饰。
- 接口没有构造方法,不可以创建对象。
- 接口中没有静态代码块(static{},加载类时创建,只加载一次)。
内部主要封装了方法:
- 抽象方法:使用 abstract 关键词修饰,可以省略,没有方法体。该方法供子类重写实现使用。
- 默认方法:使用 default 修饰,不可省略,供子类调用或子类重写。
- 静态方法:使用 static 修饰,供接口直接使用。
- 私有方法:使用 private 修饰,供接口中的默认方法或者静态方法调用。
public interface LiveAble { //接口
//抽象方法(必须重写)
public abstract void eat();
//默认方法(可以被重写,也可以继承默认方法)
public default void play(){
System.out.println("玩游戏");
};
//静态方法(只能用接口名调用,不可以被实现类的对象调用)
public static void run(){
System.out.println("跑步");
}
//私有方法 (辅助默认方法和静态方法)
private void sing(){
System.out.println("唱歌");
}
}
public class Animal implements LiveAble{//实现类
//重写抽象方法(必须)
@Override
public void eat(){
System.out.println("吃大餐");
};
//重写默认方法(非必须,默认继承接口方法)
@Override
public void play(){
System.out.println("玩电脑");
}
}
@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处:
- 可以当注释用,方便阅读
- 编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。例如,你如果没写@Override,而你下面的方法名又写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。
接口的多实现:一个类可以继承一个父类,同时实现多个接口。
- 如果接口中的方法和父类方法重名,实现类的对象在调用该方法时会优先调用。
- 如果多个接口的默认方法存在重复,那么必须对该默认方法进行重写。
//接口
interface A {
public abstract void showA();
public default void show(){
System.out.println("我是接口A的show方法");
};
}
interface B {
public abstract void showA();
public abstract void showB();
public default void show(){
System.out.println("我是接口B的show方法");
};
}
//父类
public class D {
public void show(){
System.out.println("我是父类D的show方法");
};
}
//继承实现类
public class C extends D implements A,B{
@Override
public void showA(){//抽象方法重名重写一次就好
System.out.println("我是A");
};
@Override
public void showB(){//抽象方法
System.out.println("我是B");
};
@Override
public void show(){ //如果父类存在同名方法,优先执行父类。不存在,默认方法重名必须重写。
}
}
接口的多继承:
接口之间可以相互继承,一个接口能继承另一个或多个接口。
接口继承使用 extends 关键字,子接口继承父接口的方法,如果默认方法存在重名,则需要重写一次。
interface C extends A,B{
@Override
public default void show(){ //接口重写方法时,可以保留default关键字(子类重写不可以保留)。
System.out.println("我是C");
};
}
温馨提示
- 如果您对本文有疑问,请在评论部分留言,我会在最短时间回复。
- 如果本文帮助了您,也请评论关注,作为对我的一份鼓励。
- 如果您感觉我写的有问题,也请批评指正,我会尽量修改。
Java基础学习笔记(三) - 抽象类和接口的更多相关文章
- Java基础学习笔记三 Java基础语法
Scanner类 Scanner类属于引用数据类型,先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 ...
- Java基础学习笔记三 正则表达式和校验、Date、DateFormat、Calendar
正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex).正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个句法规则的字符串.在 ...
- java基础学习笔记三(多态)
多态? 多态是同一个行为具有多个不同表现形式或形态的能力. 存在的必要条件 继承 重写 父类引用指向子类对象 比如: Parent p = new Child(); 当使用多态方式调用方法时,首先检查 ...
- Java基础学习笔记总结
Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...
- 尚学堂JAVA基础学习笔记
目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- 第二十八节:Java基础-进阶继承,抽象类,接口
前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...
- Java基础学习笔记(一)
Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...
- Java IO学习笔记三:MMAP与RandomAccessFile
作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...
随机推荐
- 问题.springmvc错误.415:Unsupported Media Type
场景是在希望用ajax发post请求,传递一个json对象,在controller中直接使用java对象接收时遇到的,具体错误信息如下: { "timestamp": 150027 ...
- B-generator 1_2019牛客暑期多校训练营(第五场)
题意 给出\(x0,x1,a,b\), \(x_i = a\cdot x_{i-1} + b\cdot x_{i-2}\),问\(x_n取模mod\) 题解 用十进制快速幂,二进制快速幂是每到下一位就 ...
- P2059 [JLOI2013]卡牌游戏 概率DP
link:https://www.luogu.org/problemnew/show/P2059 题意: 有n个人,类似约瑟夫环的形式踢人,但是报的数是不同的,是在给定的许多数中随机抽取,问最后第i个 ...
- happen before 原则
并发一直都是程序开发者绕不开的难题,在上一篇文章中我们知道了导致并发问题的源头是 : 多核 CPU 缓存导致程序的可见性问题.多线程间切换带来的原子性问题以及编译优化带来的顺序性问题. 原子性问题我们 ...
- Zabbix4.2对IIS监控摸索记录
Zabbix是很强大,但是相关的细节技术文档貌似很少,摸索之路就显得异常难. 度娘搜了下,关于Zabbix对IIS的监控资料确实有,确实也讲如何操作了,但是细细按照对方的要求操作下,总是缺数据,no ...
- GA,RC,Alpha,Beta,Final等软件版本名词释义
对应上图的表格如下: 名词 说明 Alpha α是希腊字母的第一个,表示最早的版本,内部测试版,一般不向外部发布,bug会比较多,功能也不全,一般只有测试人员使用. Beta β是希腊字母的第二个,公 ...
- IDEA中创建maven web项目
本文将带你一路从IDEA中maven的配置到创建maven web项目,掌握IDEA中maven的使用. 一.IDEA中配置maven 开发中一般我们使用自己下载的maven,不使用IDEA工具自带的 ...
- 数据库常用SQL语句(一):常用的数据库、表操作及单表查询语句
以MySql数据库为例进行说明 1.数据库操作语句 2.表的操作语句 3.表中的字段操作语句 4.MYSQL支持的完整性约束 数据库管理系统提供了一致机制来检查数据库表中的数据是否满足规定的条件,以保 ...
- 十天快速入门Python
课程导学 001 课程定位和目标 002 课程导学 第一部分 Python快速入门 第1天 Python基本语法元素 003 Python基本语法元素 004 程序设计基本方法 005 Python开 ...
- Linux root 用户下 selenium 运行chrome --no-sandbox的问题的解决
#coding = utf-8 from selenium import webdriver chrome_options = webdriver.ChromeOptions() chrome_opt ...