一、抽象类

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

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. ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。

    报错 Traceback (most recent call last): File "D:/PyCharm 5.0.3/WorkSpace/2.NLP/2.获取数据源和规范化/4.word ...

  2. P3119 [USACO15JAN]草鉴定Grass Cownoisseur 分层图或者跑两次最长路

    https://www.luogu.org/problemnew/show/P3119 题意 有一个有向图,允许最多走一次逆向的路,问从1再走回1,最多能经过几个点. 思路 (一)首先先缩点.自己在缩 ...

  3. HihoCoder - 1617 方格取数

    HihoCoder - 1617 (从群主那里借鉴来的, 群主好强啊) 题意:中文题不解释... 题解: dp[X][i][j] 代表的是X是坐标之和 第一个人 走到位置 dp[i][x-i] 第二个 ...

  4. CSS特效集锦:视觉魔法的碰撞与融合(二)

    引言 长久以来,我认识到.CSS,是存在极限的.正如曾经替你扛下一切的那个男人,也总有他眼含热泪地拼上一切,却也无法帮你做到的事情,他只能困窘地让你看到他的无能为力,怅然若失. 然后和曾经他成长的时代 ...

  5. 【Nginx】基于Consul+Upsync+Nginx实现动态负载均衡

    一.Http动态负载均衡 什么是动态负载均衡 动态负载均衡实现方案 常用服务器注册与发现框架 二.Consul快速入门 Consul环境搭建 三.nginx-upsync-module nginx-u ...

  6. 小白的消费为何被迫升级?-java数据类型的转换

    背景 小白最近有点烦恼,原因也很简单,不知道为何?小白的消费不知不觉被迫升级了,请看费用清单: for (byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; ...

  7. 第 15 篇:优化博客功能的细节,提升使用体验—— HelloDjango 系列教程

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在之前的系列教程中,我们已经实现了:文章的发布.展示.评论等功能,可能认真的小伙伴已经 ...

  8. Spring事务失效的2种情况

    使用默认的事务处理方式 因为在java的设计中,它认为不继承RuntimeException的异常是”checkException”或普通异常,如IOException,这些异常在java语法中是要求 ...

  9. springboot使用 @EnableScheduling、@Scheduled开启定时任务

    1.在main启动项添加一个注解@EnableScheduling package com.example.springmybatis; import org.mybatis.spring.annot ...

  10. MultipartFile 获取上传TXT文件字数

    @ResponseBody @RequestMapping(value = "/addImgForDynamic")//(发布动态) public Map addImgForDyn ...