JavaSE入门---掌握抽象类和接口

news2024/12/22 13:30:04

文章目录

  • 抽象类
    • 什么是抽象类?
    • 抽象类语法
    • 抽象类特性
  • 接口
    • 什么是接口?
    • 接口语法
    • 接口使用
    • 接口特性
    • 实现多个接口
    • 接口间的继承
  • 抽象类 VS 接口
  • Java中的 Clonable 接口
  • Java中的 Object 类

抽象类

什么是抽象类?

在面向对象的概念中,所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描述对象的。如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类

比如:在继承关系当中的父类,它并不描绘一个具体的对象,只是用来描绘所有子类对象的一些共性,因此它就可以被定义成抽象类。

抽象类语法

在Java中,如果一个类被abstract修饰称为抽象类,抽象类中被abstract修饰的方法称为抽象方法,抽象方法不用给出具体的实现。因为抽象类是必须要被继承才能使用的,在继承抽象类后必须重写抽象方法。

// 抽象类
abstract class Animal{
    // 抽象方法
    abstract public void eat();
    abstract public void sleep();

}

注: 抽象类也是类,也可以包含属性和普通方法,甚至是构造方法。

抽象类特性

  1. 抽象类不能直接实例化对象,即不能直接new。
  2. 抽象方法不能是private修饰的。
  3. 抽象方法不能被final和static修饰。
  4. 抽象类必须被继承使用,并且继承后子类要重写父类中的抽象方法;否则子类也是抽象类,必须用abstract修饰。
  5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类—必须加abstract修饰。
  6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量。
  7. 使用抽象类是为了“预防出错”,防止不小心使用父类方法来完成原本应该子类方法完成的工作。

接口

什么是接口?

接口:就是公共的行为规范标准,大家只要符合规范标准就可以使用。

在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。

接口语法

public interface 接口名称{
    // 抽象方法
    public abstract void method();
    public void method1();
    abstract void method2();
    
    void method3();
}

注:

  1. 接口中的方法默认被 public abstract修饰,public和abstract都可以省略,更推荐都省略掉。
  2. 创建接口时,接口的名称一般以 大写字母‘I’开头。
  3. 接口的命名一般使用“形容词”词性的单词。

接口使用

接口不能直接使用,必须要有一个类来实现该接口,同时要实现该接口中的所有抽象方法。

class 类名 implements 接口名{
    ......
}

接口特性

  1. 接口是一种引用类型,但是不能直接new接口对象。
  2. 接口中的每个方法都默认被public abstract修饰。
  3. 接口中的方法不能在接口中实现只能在实现接口的类中实现。
  4. 重写接口中的方法时以 public 访问权限修饰。
  5. 接口中可以有变量,但是默认被 public static final 修饰。
  6. 接口中不能有静态代码块和构造方法。
  7. 接口虽然不是类,但是接口经过编译以后生成的字节码文件也是以 .class为后缀。
  8. 如果类没有实现接口的所有抽象方法,则类必须设置为抽象类。

实现多个接口

在Java中,类和类之间是单继承的,一个类只能有一个父类。但是一个类可以实现多个接口

class Animal{
    public String name;
    public Animal(String name){
        this.name = name;
    }
}

interface IRun{
    void run();
}

interface IEat{
    void eat();
}

interface ISwim{
    void swim();
}

class Duck extends Animal implements IRun,IEat,ISwim{
    public Duck(String name) {
        super(name);
    }

    @Override
    public void run() {
        System.out.println("鸭子跑");
    }

    @Override
    public void eat() {
        System.out.println("鸭子吃");
    }

    @Override
    public void swim() {
        System.out.println("鸭子游");
    }
}

注: 一个类实现多个接口时,每个接口中的抽象方法都要实现,否则该类必须设置为抽象类。

接口间的继承

在Java中,类和类之间是单继承的,但是接口和接口之间可以多继承。

interface IRun{
    void run();
}

interface ISwim{
    void swim();
}

interface IAmphibious extends ISwim,IRun{

}

class Frog implements IAmphibious{
    @Override
    public void run() {
        
    }

    @Override
    public void swim() {

    }
}

抽象类 VS 接口

抽象类和接口都是Java中多态的常见使用方式。

二者的核心区别是:
抽象类中包含普通方法和普通字段,这样的普通方法和普通字段可以被子类直接使用,不用重写。
接口中不能包含普通方法,子类必须重写所有的抽象方法。

在这里插入图片描述

Java中的 Clonable 接口

Object类中存在一个clone()方法,调用这个方法可以创建对象的拷贝,但是想要合理调用clone()方法,必须要实现Clonable接口,否则就会抛出 CloneNotSupportedException 异常

class Animal implements Cloneable {
    public String name;

    public Animal(String name) {
        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

注:拷贝出的对象是一份浅拷贝。

Java中的 Object 类

Object是Java默认提供的一个类,且它是所有类的父类。Java中,所有的类都默认继承Object类。

Object类中也存在一些定义好的方法:

1. toString()方法:打印对象中的内容;

class Animal{
    public String name;

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                '}';
    }
} 

2. equals()方法:
在Java中,使用 == 进行比较时:
1> 如果左右两侧是基本类型变量:比较的是变量中的值是否相等;
2> 如果
左右两侧是引用类型变量:比较的是引用变量地址是否相等;
3> 如果要比较对象中的内容,必须重写Object中的equals()方法,因为equals()方法默认是按照地址比较的。

class Animal {
    public String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Animal animal = (Animal) o;
        return Objects.equals(name, animal.name);
    }

}

3. hashcode()方法:用来确定对象在内存中的存储位置;

class Animal {
    public String name;
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux编译器-gcc/g++使用函数库

【Linux】系列文章目录 【Linux】基础常见指令:http://t.csdn.cn/hwLPb 【Linux】基本权限:http://t.csdn.cn/faFZg 【Linux】软件包管理器yum与环境开发工具vim:http://t.csdn.cn/LEqkm 目录 【Linux】系列文章目录 前言 一、gcc选项总…

【C语言】malloc()函数详解(动态内存开辟函数)

一.malloc()函数简介 我们先来看一下cplusplus.com - The C Resources Network网站上malloc()函数的基本信息: 1.函数功能 可以看到,malloc()函数的功能是:向内存申请一块连续可用的空间,并返回指向块开头的指针. 2.函数参数 该函数有1个参数,是: void* malloc (…

关于iterm2的美化

iterm2 美化 笔者公司最近给发了一个新 M1 mac pro,所以一些软件需要重新安装。其中比较麻烦就是iterm2的一个美化工程 , 由于每次安装的效果都不尽相同所以这次写一个博客来记录一下 安装的过程 。 全程高能开始: 使用brew 来安装 iterm2 …

26. 通过 cilium pwru了解网络包的来龙去脉

pwru是一种基于eBPF的工具,可跟踪Linux内核中的网络数据包,并具有先进的过滤功能。它允许对内核状态进行细粒度检查,以便通过调试网络连接问题来解决传统工具(如iptables TRACE或tcpdump)难以解决甚至无法解决的问题。在本文中,我将介绍pwru如何在不必事先了解所有内容的…

C++ 模板类编译前需要实例化

在复习list容器的模拟实现,遇到了模板未实例化导致代码报错的问题,list的模拟实现可以看下面这篇文章,这里就不多赘述了,直接切入正题。Clist模拟http://t.csdnimg.cn/N6BGh现在的情况是我们已经模拟实现了list类,想在…

1024 漏洞综合项目演示(第十七课)

1024 漏洞综合项目演示(第十七课) 一 渗透流程 前期交互(Reconnaissance):这是一个信息收集的阶段,黑客或攻击者会收集目标系统或网络的信息,例如域名、IP地址、子网结构、网络拓扑等。 信息收集(Informa…

开源博客项目Blog .NET Core源码学习(4:生成验证码)

开源博客项目Blog中的后台管理登录界面中支持输入验证码(如下图所示),本文学习并记录项目中验证码的生成及调用方式。   博客项目中调用VerifyCode类生成验证码,该类位于App.Framwork项目中,命名空间为App.Framwork…

[Docker]一.Docker 简介与安装

一、Docker简介与为什么要用 Docker 1.1、Docker 介绍 Docker 是一个跨平台的开源的 应用容器引擎 ,诞生于 2013 年初,基于 Go语言 并遵从 Apache2.0 协议开源, Docker 可以把它理解成虚拟机,但是 Docker 和传统虚拟化方式 有所不同 …

玩转视频剪辑全攻略:批量添加上自定义封面的技巧

在进行视频编辑的过程中,我们经常需要为视频添加引人入胜的封面,以吸引观众的注意力。以下是一份详细的全攻略,指导你如何批量添加自定义的视频封面。 首先,你需要在浏览器中搜索并下载“固乔智剪软件”,这是一款功能强…

精通Linux系列第三章:文件系统管理与权限设置(含目录结构思维导图)

文章目录 一、前言二、文件系统概述2.1 文件系统的定义2.2 常见的Linux文件系统2.3 查看当前Linux系统所使用的文件系统2.4 怎么使用特定的文件系统2.5 文件系统的层次结构 三、文件和目录管理3.1 文件和目录的基本概念3.2 创建文件和目录3.3 查看文件和目录信息3.4 复制、移动…

codeforces (C++ Simple Design)

题目&#xff1a; 翻译&#xff1a; 思路&#xff1a; 1、难点在于读题&#xff0c;输入两个数x&#xff0c;k&#xff0c;从x开始递增寻找最小可整除k的数。 代码&#xff1a; #include<iostream> using namespace std; int main() {int x, k;int n;cin >> n;…

使用 OpenGL 渲染会旋转 会变色的三角形(LearnOpenGL P3)

文章目录 前言代码 前言 本文参考文献&#xff0c;侵删&#xff01;LearnOpenGL - 你好&#xff0c;三角形 本文将假设您完成了 OpenGL 的配置&#xff0c;并且使用 VAO、VBO 渲染图形 由于时间问题&#xff0c;代码的详细讲解将在几日内给出~ 代码 #include <glad/glad…

UML类图中各箭头表示总结

UML类图中各箭头表示总结 1、泛化2、实现3、依赖4、关联5、聚合6、组合 在UML类图中&#xff0c;箭头关系是用来表示类之间的关系的。箭头关系的种类有以下几种&#xff1a; 1、泛化 泛化&#xff1a;表示类之间的继承关系。箭头从子类指向父类。箭头&#xff1a;实线空心三角…

【计算机网络】UDP/TCP协议

文章目录 :peach:1 UDP协议:peach:1.1 :apple:UDP协议端格式:apple:1.2 :apple:UDP的特点:apple:1.3 :apple:UDP的缓冲区:apple:1.4 :apple:UDP使用注意事项:apple:1.5 :apple:基于UDP的应用层协议:apple: 2 :peach:TCP协议:peach:2.1 :apple:TCP协议端格式:apple:2.2 :apple:确…

《windows核心编程》第3章 内核对象

一、内核对象简介 1.1 内核对象有哪些 令牌对象 token、事件对象 Event、文件对象 File、文件映射对象 Mapping_File、线程对象 Thread、时钟对象 Timer、线程池对象 ThreadPool、I/O完成端口对象 Completion port、工作对象 job、邮槽对象 mailslot、互斥对象 Mutex、管道对…

Hook原理--逆向开发

今天我们将继续讲解逆向开发工程另一个重要内容--Hook原理讲解。Hook&#xff0c;可以中文译为“挂钩”或者“钩子”&#xff0c;逆向开发中改变程序运行的一种技术。按照如下过程进行讲解 Hook概述Hook技术方式fishhook原理及实例符号表查看函数名称总结 一、Hook概述 在逆…

LeetCode刷题---有效的括号

这里用到了栈的思想 栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说&#xff0c;表尾端称为栈顶&#xff08;top&#xff09;&#xff0c;表头端称为栈低&#xff08;bottom&#xff09;。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除&#xff0c…

生成包含10个随机字母或数字的字符串,然后统计每个字符的出现次数

from random import choices from string import ascii_letters, digitsx .join(choices(ascii_lettersdigits, k10)) d dict() # 创建空字典 for ch in x:d[ch] d.get(ch, 0) 1 # x中有ch字符,个数1,并作为字典的值 print(x) print(d)也可以使用collections模块的defaul…

从车窗升降一探 Android 车机的重要 API:车辆属性 CarProperty

前言 前面我们介绍过 Android 车机 Automotive OS 的几块重要内容&#xff1a; 一文了解 Android 车机如何处理中控的旋钮输入从实体按键看 Android 车机的自定义事件机制深度入门 Android 车机核心 CarService 的构成和链路 本篇文章我们聚焦 Android 车机上最重要、最常用…

LeetCode--180 连续出现的数字

文章目录 1 题目描述2 结果示例3 解题思路3.1 MySQL 代码 4 知识拓展 1 题目描述 Logs表: ---------------------- | Column Name | Type | ---------------------- | id | int | | num | varchar | ----------------------在 SQL 中&#xff0c;id …