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 ...
随机推荐
- 特殊字符处理 java-jsp
public String dealStr(String name){ String newStr=""; if(name != null && name.leng ...
- JMeter特点&性能测试工具选型的原则&模拟压力的原理
1.JMeter自身的特点 1)开源.轻量级.更适合自动化和持续集成(100M左右,LoadRunner 4G左右) 2)学习难度大 3)资料少.全英文 2. 性能测试工具选型的原则 1)成本 a.工 ...
- JMeter简介及使用JMeter来访问网站
参考: http://jmeter.apache.org/ http://blog.chinaunix.net/uid-26884465-id-3416869.html http://www.ltes ...
- 洛谷P1273 有线电视网 树上分组背包DP
P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0: 思路: 树上分组背包DP,设dp[u][k] 表示 ...
- lightoj 1095 - Arrange the Numbers(dp+组合数)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1095 题解:其实是一道简单的组合数只要推导一下错排就行了.在这里就推导一下错排 ...
- lightoj 1044 - Palindrome Partitioning(需要优化的区间dp)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1044 题意:求给出的字符串最少能分成多少串回文串. 一般会想到用区间dp暴力3个for ...
- 安卓手机360浏览器神奇bug,难以理解的
今天渠道组,说广告在安卓手机360浏览器上显示不了,我就去排查这个问题,发现所有安卓浏览器还真看不到广告,本来以为是360浏览器屏蔽了,,但是另一个项目就没事,后来经过几个小时的不断alert断点调试 ...
- 反序列化JSON
本人编程生涯刚刚起步,以下是个人理解,如果有些不对的地方,请各位在评论区指出,如果有更详细的博客也可以推荐给我. 首先要根据JSON创建一个实体类,并且要实现Serializable接口,再创建一个J ...
- 【Offer】[19] 【字符串匹配】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式. 模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含 ...
- 使用 jupyter-notebook + python + matplotlib 进行数据可视化
上次用 python 脚本中定期查询数据库,监视订单变化,将时间与处理完成订单的数量进行输入写入日志,虽然省掉了人为定时查看数据库并记录的操作,但是数据不进行分析只是数据,要让数据活起来! 为了方便看 ...