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 ...
随机推荐
- HDU-3478Catch二分图的否命题
HDU-3478Catch 题意:考虑Thief能否: 由于我推着推着就想到必须要三点可以互通,和二分图的结论正好相反,所以就试了一发, 真没想到thief的初始位置是不用考虑的. 下面是ac代码: ...
- Marvelous Mazes UVA - 445
#include<iostream> #include<stdio.h> #include<string> #include<cstring> #def ...
- codeforces 572 C. Lengthening Sticks(数学)
题目链接:http://codeforces.com/contest/572/problem/C 题意:给出a,b,c,l要求a+x,b+y,c+z构成三角形,x+y+z<=l,成立的x,y,z ...
- PAT 天梯杯 L2-020 功夫传人
L2-020. 功夫传人 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一门武功能否传承久远并被发扬光大,是要看缘分的.一般来 ...
- Java代理设计模式(Proxy)的几种具体实现
Proxy是一种结构设计模型,主要解决对象直接访问带来的问题,代理又分为静态代理和动态代理(JDK代理.CGLIB代理. 静态代理:又程序创建的代理类,或者特定的工具类,在平时开发中经常用到这种代理模 ...
- Elasticsearch之更新
public class UpdateElasticAPI { private static RestClient restClient; static { restClient=RestClient ...
- JDBC处理mysql大数据
大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时是需要用程序把 ...
- 记录一次oracle的坑
背景:程序正常运行中,突然技术支持人员反映数据库数据好久没有增加,于是乎各种排查问题,但是一直没有找到原因,由于代码比较久,也不是本人所写,更气的是居然用的是oracle数据库,并且是通过java代码 ...
- 即时聊天APP(六) - 消息的接收以及EventBus使用
通常我们在接收消息的时候会有声音和震动的提示,因此我也加了代码达到这样的效果,这就要用到EventBus了,当然这里我也用到了自定义的广播,所以首先在Mainfests文件中加入以下代码: <r ...
- linux 操作系统级别监控 df 命令
df命令可以查看当前系统磁盘空间的使用情况 命令:df -h du -sh * 查看目录文件暂用磁盘大小 如果磁盘空间不够,需清理磁盘 磁盘速度测试,如果磁盘性能不好,性能测试数据会不准确(读写速度) ...