一、抽象类

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

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. VMware虚拟机安装Linux系统详细教程

    VMware14虚拟机安装RedHad6系统步骤 redhat网盘资源:链接:https://pan.baidu.com/s/1GlT20vevqbZ9qTxsGH1ZzA 提取码:oh57 如果网盘 ...

  2. codeforces 456 D. A Lot of Games(字典数+博弈+思维+树形dp)

    题目链接:http://codeforces.com/contest/456/problem/D 题意:给n个字符串.进行k次游戏.每局开始,字符串为空串,然后两人轮流在末尾追加字符,保证新的字符串为 ...

  3. 深度递归必须知道的尾调用(Lambda)

    引导语 本文从一个递归栈溢出说起,像大家介绍一下如何使用尾调用解决这个问题,以及尾调用的原理,最后还提供一个解决方案的工具类,大家可以在工作中放心用起来. 递归-发现栈溢出 现在我们有个需求,需要计算 ...

  4. zabbix监控PHP脚本

    scripts]# cat php_fpm_status.sh #!/bin/bash ############################################ #$name: ngi ...

  5. Fire Balls 10——UI界面的制作

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  6. Nginx总结(六)nginx实现负载均衡

    前面讲了如何配置Nginx虚拟主机,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category/1529997.html 今天要 ...

  7. 第五场周赛(字符串卡常个人Rank赛)——题解

    本次题目因为比较简单,除了个别题目,其余题目我只写一个思路不再贴代码. 先是Div.2的题解 A题奇怪的优化,把递归函数改成2*fun(...)即可,其实看懂程序也不难,就是求a*2b: B题你会st ...

  8. Linux 笔记 - 第七章 Vi 和 Vim 编辑器

    博客地址:http://www.moonxy.com 一.前言 Vi 与 Vim 都是多模式编辑器,是 Linux 中必不可少的工具.不同的是 Vim 是 Vi 的升级版本,它不仅兼容 Vi 的所有命 ...

  9. 06 (OC)* iOS中UI类之间的继承关系

    iOS中UI类之间的继承关系 此图可以更好的让你去理解iOS中一些底层的关系.你能够了解以及理解UI类之间的继承关系,你会更加明白苹果有关于底层的东西,更有助于你的项目开发由它们的底层关系,就能更加容 ...

  10. 使用Spring中的PropertyPlaceholderConfigurer读取文件

    目录 一. 简介 二. XML 方式 三. Java 编码方式 一. 简介 大型项目中,我们往往会对我们的系统的配置信息进行统一管理,一般做法是将配置信息配置与一个cfg.properties 的文件 ...