抽象类和接口—javaSE

news2024/11/26 0:48:58

这里写目录标题

  • 1.抽象类
    • 1.1概念
    • 1.2语法
    • 1.3特性
    • 1.4使用
  • 2.接口
    • 2.1概念
    • 2.2语法
    • 2.3特性
    • 2.4重要的接口
      • 2.4.1给数组对象排序(Comparable、Comparator)
      • 2.4.2 Cloneable(浅拷贝)
    • 2.5抽象类和接口的区别
  • 3.object类
    • 3.1定义
    • 3.2equals
    • 3.3获取对象信息
    • 3.4HashCode

1.抽象类

1.1概念

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类

1.2语法

被abstract修饰的类就称为抽象类,不是一个具体的类

//抽象类
abstract class Shape {
    public abstract void draw();//抽象方法
}
public class Text {
}

1.3特性

(1)抽象类不能进行实例化,也就是new一个抽象类

abstract class Shape {
    public abstract void draw();//抽象方法
}
public class TextDame {
    public static void main(String[] args) {
        //Shape shape = new Shape();//报错,抽象类不能进行实例化
    }
}

(2)抽象类中也可以包含普通的数据成员、方法、构造方法等

//抽象类
abstract class Shape {
    public int a;//数据成员
    public static int b;
    //普通的方法
    public void func(){
        System.out.println("抽象方法中的普通方法");
    }
    //构造方法
    public Shape(int a) {
        this.a = a;
    }
    public abstract void draw();//抽象方法
}
public class Text {
}

(3)如果一个普通类A继承了一个抽象类B,那么这个普通类A需要重写抽象类B中所有的抽象方法

//抽象类
abstract class Shape {

    public abstract void draw();//抽象方法
}
//普通类继承抽象类
class Cycle extends Shape {
//    必须重写抽象方法
    @Override
    public void draw() {
        System.out.println("画○");
    }
}
public class Text {
}

(4)如果一个抽象类C继承了一个抽象类B,那么这个抽象类C需要不用重写抽象类B中的抽象方法

//抽象类
abstract class Shape {

    public abstract void draw();//抽象方法
}
//抽象类继承抽象类
abstract class Rect extends Shape {
//    不需要重写抽象方法
}
public class Text {
}

(5)在(4)的基础上,如果一个普通类D继承了一个抽象类C,那么这个普通类D不仅需要重写抽象类C中所有的抽象方法,还需要重写抽象类B中所有的抽象方法

//抽象类
abstract class Shape {

    public abstract void draw();//抽象方法
}
//抽象类继承抽象类
abstract class Rect extends Shape {
//    不需要重写抽象方法
    public abstract void func();
}
class D extends Rect {
    @Override
    public void draw() {
        
    }
    @Override
    public void func() {
        
    }
}
public class Text {
}

(6)抽象类(抽象方法)是不能被static或private修饰的
(7)抽象类最大的意义就是为了被继承,final和abstract是不能同时存在的(被final修饰的类是不能被继承的,而被final修饰的方法不能被重写)
(8)抽象类中不一定有抽象方法
(9)抽象方法没有加访问限定符时,默认是public

1.4使用

抽象类本身不能被实例化,要想使用,只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法

abstract class Shape {
    public abstract void draw();
}
class Cycle extends Shape {
    @Override
    public void draw() {
        System.out.println("画○");
    }
}
class Rect extends Shape {
    @Override
    public void draw() {
        System.out.println("画♦");
    }
}
public class TextDame {
    public static void shape(Shape shape){
        shape.draw();
    }
    public static void main(String[] args) {
        shape(new Cycle());
        shape(new Rect());
    }
}

2.接口

2.1概念

接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用,在Java中,接口可以看成是多个类的公共规范,是一种引用数据类型

2.2语法

被interface修饰的就是接口,java中的接口名称一般都会在前面加一个I,一个接口一般也是一个java文件

//接口
public interface IText {
    
}

2.3特性

(1)接口中的成员变量默认是public static final的在这里插入图片描述
(2)接口中的方法默认是public abstract的在这里插入图片描述
(3)接口中可以包含default修饰的方法,也可以被static修饰的方法

interface IShape {
    public static void func(){
        System.out.println("接口中的func方法");
    }
    default void function(){
        System.out.println("接口中的function方法");
    }
}
public class Text {
}

(4)接口不可以被实例化
(5)接口和类之间可以使用implements,表示这个类实现了这个接口,此时这个类就必须重写这个接口中所有的抽象方法

//接口IShape 
interface IShape {
    public abstract void draw();
}
//Cycle这个类就实现了IShape这个接口
class Cycle implements IShape {
    @Override
    public void draw() {
        System.out.println("画○");
    }
}
public class Text {
}

(6)一个类实现接口的时候可以重写接口中的default修饰的方法

interface IShape {
    public abstract void draw();
    default void function(){
        System.out.println("接口中的function方法");
    }
}
class Cycle implements IShape {
    @Override
    public void draw() {
        System.out.println("画○");
    }
    //可以重写接口中的default修饰的方法
    @Override
    public void function() {
        
    }
}
public class Text {
}

(7)一个类可以实现多个接口,接口之间用逗号隔开,此时这个类必须重写他所实现的多个接口中所有的抽象方法

package dame1;
interface IA {
    void A ();
}
interface IB {
    void B ();
}
interface IC {
    void C ();
}
class E implements IA,IB,IC {
    @Override
    public void A() {
        
    }
    @Override
    public void B() {

    }
    @Override
    public void C() {

    }
}
public class Text {
}

(8)一个类可以在继承某个抽象类或普通类的同时,实现接口,注意是先继承再实现

interface IA {
    void A ();
}
class B {
    
}
class C extends B implements  IA {
    @Override
    public void A() {
        
    }
}
public class Text {
}

(9)当一个接口使用了extends拓展了其他接口,此时一个类实现这个接口,需要重写所有接口中的抽象方法。类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承,java中可以用接口可以达到多继承的目的

interface IA {
    void A ();
}
interface IB {
    void B ();
}
interface IC {
    void C ();
}
interface ID extends IA,IB,IC {
    void D ();
}
class E implements ID {
    @Override
    public void A() {
        
    }
    @Override
    public void B() {

    }
    @Override
    public void C() {

    }
    @Override
    public void D() {

    }
}
public class Text {
}

(10)接口中的方法是不能在接口中实现的,只能由实现接口的类来实现,接口中的抽象方法是不能带主体的

interface IA {
    void A ();
//    报错
//    public void A (){
//        
//    }
}
public class Text {
}

(11)接口中不能有静态代码块和构造方法
(12)接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
(13)如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类

2.4重要的接口

2.4.1给数组对象排序(Comparable、Comparator)

package dame2;

import java.util.Arrays;
class Student implements Comparable<Student>{
    public int age;
    public String name;
    public double score;
    public Student(int age, String name, double score) {
        this.age = age;
        this.name = name;
        this.score = score;
    }
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
    @Override
    public int compareTo(Student o) {
        return this.age - o.age;
    }
}
public class Text {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0]  = new Student(18,"张三",38.8);
        students[1] = new Student(58,"李四",8.8);
        students[2] = new Student(8,"王五",28.8);
        Arrays.sort(students);
        System.out.println(Arrays.toString(students));
    }
//结果:
//    [Student{age=8, name='王五', score=28.8}, Student{age=18, name='张三', score=38.8}, Student{age=58, name='李四', score=8.8}]
}

import java.util.Arrays;
import java.util.Comparator;
class Student {
    public int age;
    public String name;
    public double score;
    public Student(int age, String name, double score) {
        this.age = age;
        this.name = name;
        this.score = score;
    }
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
}
//年龄比较器
class AgeComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.age - o2.age;
    }
}
//成绩比较器
class ScoreComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return (int)(o1.score - o2.score);
    }
}
public class Text {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0]  = new Student(18,"张三",38.8);
        students[1] = new Student(58,"李四",8.8);
        students[2] = new Student(8,"王五",28.8);
        AgeComparator ageComparator = new AgeComparator();
        ScoreComparator scoreComparator = new ScoreComparator();
        Arrays.sort(students,ageComparator);
        System.out.println(Arrays.toString(students));
        Arrays.sort(students,scoreComparator);
        System.out.println(Arrays.toString(students));
    }
//结果:
//    [Student{age=8, name='王五', score=28.8}, Student{age=18, name='张三', score=38.8}, Student{age=58, name='李四', score=8.8}]
//    [Student{age=58, name='李四', score=8.8}, Student{age=8, name='王五', score=28.8}, Student{age=18, name='张三', score=38.8}]
}

2.4.2 Cloneable(浅拷贝)

(1)浅拷贝:通过clone,我们只是拷贝了Person对象,但是Person对象中的Money对象,并没有拷贝。通过person2这个引用修改了money的值后,person这个引用访问money的时候,值也发生了改变。这里就是发生了浅拷贝
在这里插入图片描述

class Money implements Cloneable{
    public double money = 10.1;
//    重写clone方法
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class Person implements Cloneable {
    public int id;
    public Money money = new Money();

    public Person(int id) {
        this.id = id;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class Text2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person = new Person(1);
        System.out.println(person);//dame2.Person@1b6d3586
        Person person2 = (Person)person.clone();
        System.out.println(person2);//dame2.Person@4554617c
        System.out.println("修改money:");
        person2.money.money = 99.9;
        System.out.println(person.money.money);//99.9
        System.out.println(person2.money.money);//99.9
    }
}

Cloneable底层是一个空接口,也就是标记接口,证明实现该接口的类是可以被克隆的
在这里插入图片描述
(2)深拷贝:
在这里插入图片描述

class Money implements Cloneable{
    public double money = 10.1;
//    重写clone方法
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class Person implements Cloneable {
    public int id;
    public Money money = new Money();
    public Person(int id) {
        this.id = id;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person personCopy = (Person) super.clone();
        personCopy.money = (Money) this.money.clone();
        return personCopy;
    }
}
public class Text2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person = new Person(1);
        System.out.println(person);//dame2.Person@1b6d3586
        Person person2 = (Person)person.clone();
        System.out.println(person2);//dame2.Person@4554617c
        System.out.println("修改money:");
        person2.money.money = 99.9;
        System.out.println(person.money.money);//10.1
        System.out.println(person2.money.money);//99.9
    }
}

2.5抽象类和接口的区别

相同点:

  1. 都不能被实例化
  2. 接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化

不同点:

  1. 接口中能包含有抽象方法和成员变量;抽象类中包含抽象方法、普通类、成员变量
  2. 接口不能继承抽象类,但是接口可以使用extends关键字继承多个父接口;一个抽象类可以实现若干接口
  3. 一个子类只能继承一个抽象类;一个子类可以实现多个接口
  4. 使用extends关键字继承抽象类;使用implements关键字实现接口

3.object类

3.1定义

(1)Object是Java默认提供的一个类
(2)Java里面除了Object类,所有的类都是存在继承关系的,默认会继承Object父类。即Object类是所有类的父类
(3)父类引用引用子类对象,意为值object类可以引用任意数据类型

public class Text2 {
    public static void main(String[] args) {
//        Object接受数组对象,发生向上转型
        Object array = new int[]{1,2,3};
//        向下转型(不安全),需要强转
        int[] a = (int[]) array;
        Object[] array1 = {1, 'c', false};
    }
}

3.2equals

(1)如果 == 左右两侧是基本类型变量,比较的是变量中值是否相同
(2)如果 == 左右两侧是引用类型变量,比较的是引用变量地址是否相同
(3)equals方法底层也是按照地址比较的
在这里插入图片描述

class Student{
    public int id;
    public Student(int id) {
        this.id = id;
    }
}
public class Text2 {
    public static void main(String[] args) {
        Student student1 = new Student(1);
        Student student2 = new Student(1);
        System.out.println(student1 == student2);//false
        System.out.println(student1.equals(student2));//false
    }
}

(4)如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的

class Student{
    public int id;
    public Student(int id) {
        this.id = id;
    }
//    重写equals方法
    @Override
    public boolean equals(Object obj) {
        if(obj == null){
            return false;
        }
        if (this == obj){
            return true;
        }
//        如果obj不是Student,返回false
        if (!(obj instanceof Student)){
            return false;
        }
        Student tmp = (Student) obj;//向下转型,比较属性值是否相等
        return this.id == tmp.id;
    }
}
public class Text2 {
    public static void main(String[] args) {
        Student student1 = new Student(1);
        Student student2 = new Student(1);
        System.out.println(student1 == student2);//false
        System.out.println(student1.equals(student2));//true
    }
}

3.3获取对象信息

要打印对象中的内容,可以直接重写Object类中的toString()方法

import java.util.Arrays;
class Student {
    public int age;
    public String name;
    public double score;
    public Student(int age, String name, double score) {
        this.age = age;
        this.name = name;
        this.score = score;
    }
//    重写toString方法
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", score=" + score +
                '}';
    }
}
public class Text {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0]  = new Student(18,"张三",38.8);
        students[1] = new Student(58,"李四",8.8);
        students[2] = new Student(8,"王五",28.8);
        System.out.println(Arrays.toString(students));
        //[Student{age=18, name='张三', score=38.8}, Student{age=58, name='李四', score=8.8}, Student{age=8, name='王五', score=28.8}]
    }
}

3.4HashCode

(1)不重写HashCode方法,两个对象的hash值不一样

import java.util.Objects;
class Student{
    public int id;
    public Student(int id) {
        this.id = id;
    }
}
public class Text2 {
    public static void main(String[] args) {
        Student student1 = new Student(1);
        Student student2 = new Student(1);
        System.out.println(student1.hashCode());//460141958
        System.out.println(student2.hashCode());//1163157884
    }
}

(2)重写HashCode方法

import java.util.Objects;
class Student{
    public int id;
    public Student(int id) {
        this.id = id;
    }
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
public class Text2 {
    public static void main(String[] args) {
        Student student1 = new Student(1);
        Student student2 = new Student(1);
        System.out.println(student1.hashCode());//32
        System.out.println(student2.hashCode());//32
    }
}

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

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

相关文章

智慧文旅-VR全景展示助力开启景区数字化管理新方式

导语&#xff1a; 在数字化时代&#xff0c;旅游业面临着新的机遇和挑战。 为了吸引更多游客并提供独特的旅行体验&#xff0c;结合VR全景技术和智慧文旅的创新模式已经成为不可忽视的趋势。 一&#xff0e;提升旅游感官体验 VR全景技术正以惊人的速度在旅游业中崭露头角。通过…

【自监督论文阅读 2】MAE

文章目录 一、摘要二、引言2.1 引言部分2.2 本文架构 三、相关工作3.1 Masked language modeling3.2 Autoencoding3.3 Masked image encoding3.4 Self-supervised learning 四、方法4.1 Masking4.2 MAE encoder4.3 MAE decoder4.4 Reconstruction target 五、主要实验5.1 不同m…

【云原生】· 一文了解docker中的网络

目录 &#x1f352;查看docker网络 &#x1f352;bridge网络 &#x1f352;none网络 &#x1f352;host网络 &#x1f352;自定义容器网络 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;云原生专栏 根据前面的学习&#xff0c;已经对d…

netty http3功能从零开始

1、windows安装jdk和mvn、gradle、gloovy 配置环境变量JAVA_HOME CLASSPATH MVN_HOME GRADLE_HOME GLOOVY_HOME mvn和gradle都是用来管理和编译java项目的&#xff0c;mvn比较老&#xff0c;现在一般用gradle 2、vscode环境 vscode安装extension&#xff1a;Extension Pack fo…

springboot 日志配置(logback)

概述 Java 中的日志框架主要分为两大类&#xff1a;日志门面和日志实现。 Java 中的日志体系&#xff1a; 日志门面 日志门面定义了一组日志的接口规范&#xff0c;它并不提供底层具体的实现逻辑。Apache Commons Logging 和 Slf4j&#xff08;Simple Logging Facade for Jav…

基于Python垃圾短信识别程序(KNN、逻辑回归、随机森林、决策树和多项式分布朴素贝叶斯、伯努利分布朴素贝叶斯等算法进行融合)—含python工程全源码

目录 前言总体设计系统整体结构图请求流程图系统流程图 运行环境Python 环境jieba分词库Scikit-learn 库nginxphp 模块实现1. 前端模块2. 后端模块 系统测试1. 测试结果2. 结果对比3. 可视化部分 工程源代码下载其它资料下载 前言 本项目以Python为基础&#xff0c;旨在开发一…

http 三次握手 四次挥手

网络参考模型 网络层是端点间的&#xff08;客户端、服务端&#xff09; 链路层是跳跃节点间的。 TCP/IP 下一跳模式&#xff08;网关&#xff09; 内存小&#xff0c;速度快&#xff0c;不可靠。&#xff08;网络号、主机号&#xff09; TCP协议是一种面向连接的、可靠的、基…

Docker部署(4)——运行时日志时间不对(时区设置)

当使用docker run 命令时&#xff0c;发现容器虽然成功运行&#xff0c;但是输出的时间却不对 。使用timedatectl命令后发现Linux系统的时间是正常的时间。 于是将问题缩小到是不是docker 在运行时没有使用宿主机的时区的原因&#xff0c;那么解决办法可以将宿主机的时区映射到…

Maven(二):Maven的使用入门

文章目录 使用入门项目骨架pom.xml构建过程编写测试打包和运行常用打包方式maven-shade-plugin使用filter与artifactSet - 过滤jar包Transformer 参考文献 使用入门 项目骨架 对于一个使用Maven来管理的项目&#xff0c;Maven提倡使用一个目录结构标准&#xff1a; ${basedi…

Selenium+Python+Pycharm自动化环境搭建具体步骤

一、python下载&#xff1a;建议选择3.4以上的版本 官网下载地址&#xff1a; Download Python | Python.org 下载后自行进行安装&#xff0c;安装python需要配置环境变量&#xff0c;安装时可勾选“add python to path”的选项。勾选之后会自动将python添加到系统环境变量Pa…

学习AD的一些记录

1.首先创建一个工程&#xff0c;然后在工程里面创建原理图&#xff0c;PCB&#xff0c;原理图库和PCB库。 并保存。 2.将外部的原理图库&#xff0c;pcb库复制到自己创建的原理图库和pcb库。放到这两个里面。 复制&#xff0c;并粘贴到自己创建的原理图库中。PCB库同理 3.然后…

vue2和vue3的渲染过程简述版

文章目录 vue2渲染过程vue3渲染过程优化和扩充 vue2和vue3对比 vue2渲染过程 在Vue 2的渲染过程中&#xff0c;包括以下几个关键步骤&#xff1a; 解析模板&#xff1a;Vue 2使用基于HTML语法的模板&#xff0c;首先会将模板解析成抽象语法树&#xff08;AST&#xff09;&…

高频前端面试题汇总之代码输出结果篇

前言&#xff1a; 代码输出结果是面试中常考的题目&#xff0c;一段代码中可能涉及到很多的知识点&#xff0c;这就考察到了应聘者的基础能力。在前端面试中&#xff0c;常考的代码输出问题主要涉及到以下知识点&#xff1a;异步编程、事件循环、this指向、作用域、变量提升、…

SolidWorks软件三维建模教程——莫比乌斯环建模案例

SolidWorks是达索系统&#xff08;Dassault Systemes &#xff09;下的子公司&#xff0c;专门负责研发与销售机械设计软件的视窗产品。SOLIDWORKS软件三维建模功能强大&#xff0c;为制造型企业提供SOLIDWORKS一体化解决方案和服务。 今天微辰三维就以莫比乌斯环的三维建模案例…

智慧灯杆云盒是什么?如何挑选智慧云盒?

慧路灯杆云盒&#xff0c;是一种专门用于智慧路灯杆远距通信、远程控制、数据分析、边缘计算的智能终端设备&#xff0c;智慧路灯杆云盒作为联通智慧路灯杆与物联网云平台的桥梁&#xff0c;可以有效提高智慧路灯杆的管理效率、降低维护成本、实现多样化设备联动协同功能&#…

【C++】的多态

目录 1. 多态的概念2. 多态的定义及实现虚函数虚函数的重写虚函数重写的两个例外&#xff1a;C11 override 和 final重载、覆盖(重写)、隐藏(重定义)的对比 3. 抽象类接口继承和实现继承 4. 多态的原理虚函数表 5. 单继承和多继承关系中的虚函数表单继承中的虚函数表多继承中的…

qemu虚拟机配置网络

一、实现qemu虚机&宿主机网络互通 qemu虚机的网络介绍及原理可参考前人文章&#xff1a;Linux 内核调试 七&#xff1a;qemu网络配置_lqonlylove的博客-CSDN博客 这里只简单梳理下操作流程&#xff0c;以便快速实现网络互通。 1.宿主机创建 tap0 [rootlocalhost ~]# if…

一文入门Mongodb

目录 概述核心概念下载与安装版本问题环境配置cmd运行 数据库与集合命令数据库命令集合命令文档命令 mongoosemongoose的使用插入字段类型mongoose字段验证与强制性设置删除文档更新文档读取数据条件控制 后记 概述 Mongodb是一个分布式文件存储的数据库。 官网&#xff1a;M…

使用 AI 修复去除不需要的对象

Inpainting 是一种运用了稳定扩散&#xff08;Stable Diffusion&#xff09;技术来部分重绘图像的方法。简单来讲需准备一张图像&#xff0c;绘制一块遮罩以标明想要重绘的图像区域&#xff0c;同时提供一些重绘提示。随后稳定扩散就能根据这些提示&#xff0c;重新绘制遮罩区域…