一、抽象类

没有方法主体的方法称为抽象方法,包含抽象方法的类就是抽象类。

Java中使用 abstract 关键字修饰方法和类,抽象方法只有一个方法名,没有方法体。

public  abstract class TestAbstract { //抽象类
public abstract void run();//抽象方法
}
  1. 如果一个类继承了抽象类,那么该类必须重写父类的所有抽象方法,否则该类也必须声明抽象类。
  2. 抽象类不能创建对象,只能由其子类创建。
  3. 抽象类可以拥有构造方法,是用来给子类创建对象时,初始化父类成员使用的。
  4. 必须有一个子类来实现抽象父类的抽象方法,否则,抽象类的存在无任何意义。
  5. 抽象类不一定拥有抽象方法,但包含抽象方法的类必定是抽象类
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 关键字创建一个实现接口的类(类似于抽象类的实现),然后创建该类对象,就可以调用方法了。

特点:

  1. 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用 public static final (下篇介绍)修饰。
  2. 接口没有构造方法,不可以创建对象。
  3. 接口中没有静态代码块(static{},加载类时创建,只加载一次)。

内部主要封装了方法:

  1. 抽象方法:使用 abstract 关键词修饰,可以省略,没有方法体。该方法供子类重写实现使用。
  2. 默认方法:使用 default 修饰,不可省略,供子类调用或子类重写。
  3. 静态方法:使用 static 修饰,供接口直接使用。
  4. 私有方法:使用 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基础学习笔记(三) - 抽象类和接口的更多相关文章

  1. Java基础学习笔记三 Java基础语法

    Scanner类 Scanner类属于引用数据类型,先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 ...

  2. Java基础学习笔记三 正则表达式和校验、Date、DateFormat、Calendar

    正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex).正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个句法规则的字符串.在 ...

  3. java基础学习笔记三(多态)

    多态? 多态是同一个行为具有多个不同表现形式或形态的能力. 存在的必要条件 继承 重写 父类引用指向子类对象 比如: Parent p = new Child(); 当使用多态方式调用方法时,首先检查 ...

  4. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  5. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  6. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  7. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...

  8. Java基础学习笔记(一)

    Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...

  9. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

随机推荐

  1. 阿里云(ecs服务器)使用1-安装Mongdb数据库以及远程部署

    1.下载mongodb 百度云盘连接 :链接:https://pan.baidu.com/s/1b-hTS0XHQKpatecFoumLxw  提取码:z9ax 并送上可视化工具:链接:https:/ ...

  2. python控制窗口移动(画圆)

    import win32con import win32gui import time import math notepad = win32gui.FindWindow("Notepad& ...

  3. 树形动态规划 fjutoj-2392 聚会的快乐

    聚会的快乐 TimeLimit:1000MS  MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description 你要组织一个由你 ...

  4. CodeM 美团资格赛 思维 dfs

    链接:https://www.nowcoder.com/acm/contest/138/C来源:牛客网 世界杯就要开始啦!真真正正的战斗从淘汰赛开始,现在我们给出球队之间的胜负概率,来预测每支球队夺冠 ...

  5. B. Tea Queue codeforces Round.37.div2 队列

    B. Tea Queue time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  6. yzoj1891 最优配对问题 题解

    题意 有n个点,且2|n,要求将其分为n/2对点对使得所有点对中距离之和尽量小 输出保留两位小数 考虑数据范围先想到的是搜索,然而搜索超时,我们发现在搜索的时候有重复搜索的情况,那么考虑记忆化,看到数 ...

  7. python 整型、字符串常用方法、for循环

    整型--int 定义:用于比较和计算 python2和python3: python2:python2中油int(整型)和long(长整型):1231312L+ 进制转换: 十进制转二进制:正除2,获 ...

  8. lambda表达式不同对象根据对象某个属性去重

    1.有时候有两个list对象,我们想要去重,比如: List<User> userList和List<Person>personList 想通过User的id和Person的i ...

  9. Servlet+jsp用户登录加上验证码

    最近公司有个项目被客户拿去进行漏洞扫描,发现用户登录太简单,容易被暴力破解.当然发现的问题很多,什么反射型XSS,存储型XSS,敏感信息泄露等等.但是我们今天不讲这么多,就说说如何修复暴力破解的问题. ...

  10. Java测试(二)

    一.选择题(每题2分,共40分) 1.下面哪个是Java语言中正确的标识符(C ) a)      3com        b)import        c)that d)this 2.下面哪个语句 ...