iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >解析JavaSe的抽象类和接口
  • 238
分享到

解析JavaSe的抽象类和接口

2024-04-02 19:04:59 238人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 抽象类和抽象方法2. 相关面试题1、抽象类必须要有抽象方法吗?2、普通类和抽象类有哪些区别?3、抽象类能使用 final 修饰吗?3. 接口3.1 接口中的常量3.2 接口

1. 抽象类和抽象方法

抽象方法和抽象类必须使用abstract修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类里可以没有抽象方法。抽象方法和抽象类的规则如下:

(1) 抽象类和抽象方法必须使用abstract修饰符来修饰,抽象方法不能有方法体。

(2) 抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。即使抽象类里不包含抽象方法,这个抽象类也不能创建实例。

(3) 抽象类可以包含Field、方法、构造器、初始化块、内部类、枚举类6种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。

(4) 含有抽象方法的类只能被定义成抽象类。

(5) abstract不能用于修饰Field,不能用于修饰局部变量,即没有抽象变量、没有抽象Field等说法;abstract也不能用于修饰构造器,没有抽象构造器,抽象类里定义的构造器只能是普通构造器。

定义抽象方法只需在普通方法上增加abstract修饰符,并把普通方法的方法体(也就是方法后花括号括起来的部分)全部去掉,并在方法后增加分号即可。

public abstract class Person {
    // 初始化块
    {
        System.out.println("执行Person类的初始化块");
    }
    private int age;
    // 该构造器并不是为了创建对象,而是为了子类调用
    public Person(){
    }
    public Person(int age){
        this.age = age;
    }
    // 抽象方法,没有方法体
    public abstract void show();
    public void test(){
        System.out.println("非抽象方法");
    }
}

抽象类不能用于创建实例,只能当作父类被其他子类继承。

public class Student extends Person {
    public Student(int age){
        super(age);
    }
    @Override
    public void show() {
        System.out.println("重写抽象类中的抽象方法");
    }
}

注意:

(1) 当使用abstract修饰类时,表明这个类只能被继承;当使用abstract修饰方法时,表明这个方法必须由子类提供实现(即重写)。而final修饰的类不能被继承,final修饰的方法不能被重写。因此final和abstract永远不能同时使用。

(2) 当使用static修饰一个方法时,表明这个方法属于该类本身,即通过类就可调用该方法,但如果该方法被定义成抽象方法,则将导致通过该类来调用该方法时出现错误(调用了一个没有方法体的方法肯定会引起错误)。因此static和abstract不能同时修饰某个方法,即没有所谓的类抽象方法。

(3) 抽象类不能创建实例,只能当成父类来被继承。从语义的角度来看,抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。

2. 相关面试

1、抽象类必须要有抽象方法吗?

抽象类不一定非要有抽象方法,抽象类中可以含有抽象方法和非抽象方法,可以只含有抽象方法,也可以只含有非抽象方法

public abstract class Person {
    public void test(){
        System.out.println("非抽象方法");
    }
}

2、普通类和抽象类有哪些区别?

(1) 普通类不能包含抽象方法,抽象类可以包含抽象方法。

(2) 抽象类不能直接实例化,只能当作父类被其他子类继承,普通类可以直接实例化。

public abstract class Person {
    // 抽象方法
    public abstract void show();
    // 非抽象方法
    public void test(){
        System.out.println("非抽象方法");
    }
}

外部类的形式继承抽象类Person

public class Student extends Person {
    @Override
    public void show() {
        System.out.println("重写抽象类中的抽象方法");
    }
}

内部类的形式继承抽象类Person

public class Teacher {
    public static void main(String[] args) {
        Person person = new Person() {
            @Override
            public void show() {
                System.out.println("重写抽象类的抽象方法");
            }
        };
        person.show();
    }
}

3、抽象类能使用 final 修饰吗?

当使用abstract修饰类时,表明这个类只能被继承;当使用abstract修饰方法时,表明这个方法必须由子类提供实现(即重写)。而final修饰的类不能被继承,final修饰的方法不能被重写。因此final和abstract永远不能同时使用。

3. 接口

接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭,对扩展(不同的实现implements)开放,接口是对开闭原则的一种体现。

接口体:

interface 接口名{  常量    抽象方法    静态方法    默认方法}interface 接口名
{
  	常量
    抽象方法
    静态方法
    默认方法
}

3.1 接口中的常量

接口中的所有成员变量都默认是由public static final修饰的,且由于接口里没有构造器和初始化块,因此需要在定义Field时就指定初始值;

接口中的Field都是常量,经常用来被定义常量的集合

public interface FieldInterface {
    
    int DAY = 365;
    
    int WEEK = 52;
    
    int MONTH = 12;
}
public class Main {
    public static void main(String[] args) {
        
        System.out.println(FieldInterface.DAY);
    }
}

一个类实现某个接口时,该类将会获得接口中定义的Field :

public class FieldImpl implements FieldInterface {
    // 将会继承FieldInterface中定义的所有Field
}
public class Main {
    public static void main(String[] args) {
        System.out.println(FieldInterface.DAY);
        // 使用实现类调用接口中的常量
        System.out.println(FieldImpl.DAY);
    }
}

3.2 接口中的方法

接口中的三种方法:

(1) 接口中的普通方法,默认都是public abstract修饰的抽象方法,没有方法体;

(2) 接口中的静态方法,静态方法必须要有实现,且这个静态方法只能用public修饰或不写;

(3) 接口中的默认方法,默认方法必须要有实现,用default修饰且不可省略,用来供子类继承或重写,二选一,但只能在实现类中使用或者实现类对象中使用;

分别展开举例说明:

3.2.1 接口中的普通方法

接口中的普通方法,默认都是public abstract修饰的抽象方法,没有方法体;

  • 接口的实现类如果是普通类,那么必须重写接口中的所有抽象方法
  • 接口的实现类如果是抽象类,那么可以不用重写接口中的抽象方法
public interface BaseMethod {
    
    public abstract void show1();
    abstract void show2();
    public void show3();
    void show4();
}

① 接口的实现类如果是普通类,那么必须重写接口中的所有抽象方法:

public class BaseMethodImpl implements BaseMethod {
    
    @Override
    public void show1() { }
    @Override
    public void show2() { }
    @Override
    public void show3() { }
    @Override
    public void show4() { }
}

② 接口的实现类如果是抽象类,那么可以不用重写接口中的抽象方法:

public abstract class BaseMethodImpl2 implements BaseMethod {
    
    @Override
    public void show1() { }
}

3.2.2 接口中的静态方法

  • 调用形式:接口名.静态方法名
  • 接口中定义的静态方法,不能被子接口继承
  • 接口中定义的静态方法,不能被实现该接口的类继承
public interface StaticMethod {
    
    public static void test1(){
        System.out.println("接口中定义静态方法");
    }
}
public class Main {
    public static void main(String[] args) {
        
        StaticMethod.test1();
    }
}

① 接口中定义的静态方法不能被子接口继承:

public interface StaticMethod1 extends StaticMethod {
}
public class Main {
    public static void main(String[] args) {
        
        StaticMethod1.test1();
    }
}

② 接口中定义的静态方法不能被实现类继承:

public class StaticMethodImpl implements StaticMethod {
}
public class Main {
    public static void main(String[] args) {
        
        StaticMethodImpl.test1();
    }
}

3.2.3 接口中的默认方法

  • 接口中的默认方法,不能通过接口名调用,需要通过接口实现类的实例进行访问,即对象名.默认方法名()
  • 接口中的默认方法,可以被实现类继承,也可以在实现类中重写
  • 接口中的默认方法,可以被子接口继承,也可以在子接口中重写
public interface DefaultMethod {
    
    public default void test2(){
        System.out.println("接口中定义默认方法");
    }
}

① 接口中的默认方法,可以被实现类继承,也可以在实现类中重写

public class DefaultMethodImpl implements DefaultMethod {
    // 继承接口中的方法
}
public class DefaultMethodImpl implements DefaultMethod {
    // 重写接口中的方法
    @Override
    public void test2() {
        System.out.println("实现类重写接口中的方法");
    }
}
public class DefaultMethodImpl implements DefaultMethod {
    // 重写接口中的方法
    @Override
    public void test2() {
        System.out.println("实现类重写接口中的方法");
    }
}

② 接口中的默认方法,可以被子接口继承,也可以在子接口中重写

public interface DefaultMethod1 extends DefaultMethod {
    // 继承父接口中的方法
}
public interface DefaultMethod1 extends DefaultMethod {
    // 重写父接口中的方法
    @Override
    default void test2() {
        System.out.println("子接口中重写父接口中的方法");
    }
}

3.3 接口中的接口和枚举类

public interface Base {
    
    interface CommonConstant{
        
        int DAY = 365;
        
        int WEEK = 52;
        
        int MONTH = 12;
        
        static void show() {
            System.out.println("在接口中定义接口");
        }
    }
    
    @AllArgsConstructor
    enum WhiteStatusEnum {
        
        NO_WHITE("未加白", "未加白"),
        
        PART_WHITE("部分加白", "部分加白"),
        
        ALL_WHITE("全部加白", "全部加白");
        @Getter
        private final String label;
        @Getter
        private final String value;
    }
}

3.4 接口和抽象类

共同点:

(1) 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承;

(2) 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法;

(3) 接口和抽象类中都可以包括抽象方法和非抽象方法;

不同点:

(1) 接口里只能定义静态常量Field,不能定义普通Field;抽象类里则既可以定义普通Field,也可以定义静态常量Field。

(2) 接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。

(3) 接口里不能包含初始化块;但抽象类则完全可以包含初始化块。

(4) 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。

public class MethodImpl implements FieldInterface, MethodInterface {
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!   

--结束END--

本文标题: 解析JavaSe的抽象类和接口

本文链接: https://www.lsjlt.com/news/141040.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解析JavaSe的抽象类和接口
    目录1. 抽象类和抽象方法2. 相关面试题1、抽象类必须要有抽象方法吗?2、普通类和抽象类有哪些区别?3、抽象类能使用 final 修饰吗?3. 接口3.1 接口中的常量3.2 接口...
    99+
    2022-11-13
  • JAVASE---抽象类和接口
    抽象类 抽象类的概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类语法 在Java中,一个类如果被 abst...
    99+
    2023-09-21
    java 开发语言
  • 详解JavaSE中抽象类与接口的定义及使用
    目录一、抽象类1、抽象类定义2、抽象方法二、接口1、接口定义2、类实现接口3、接口与多态联合4、extends和implements5、接口在开发当中的作用6、is has like...
    99+
    2022-11-13
  • JavaSE中抽象类与接口怎么定义及使用
    这篇文章主要介绍“JavaSE中抽象类与接口怎么定义及使用”,在日常操作中,相信很多人在JavaSE中抽象类与接口怎么定义及使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaSE中抽象类与接口怎么定义...
    99+
    2023-07-02
  • 深入浅析Java 抽象类和接口
    目录一、抽象类1.抽象类1.1抽象类的定义1.2抽象方法的定义方式1.3抽象类的定义方式2.抽象类和实例类的区别3.抽象类示例4.抽象类的特征二、接口1.接口1.1接口的定义1.1定...
    99+
    2022-11-12
  • Java中的抽象类和接口
    目录 一、什么是抽象类 抽象类在实现多态中的意义  二、接口是什么  通过接口实现多态 三、抽象类和接口的区别  各位铁汁们大家好呀😊! 😎今天让我们继续学习java,看看java中的抽象类和接口到底是什么...
    99+
    2023-08-31
    java Java接口 抽象类与多态
  • Java中抽象类和接口的示例分析
    这篇文章主要介绍了Java中抽象类和接口的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、抽象类1.抽象类1.1抽象类的定义在Java面向对象当中,所有的对象都是用...
    99+
    2023-06-25
  • Java中的抽象类和接口实例分析
    这篇文章主要介绍了Java中的抽象类和接口实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的抽象类和接口实例分析文章都会有所收获,下面我们一起来看看吧。抽象类什么是抽象类?类和类之间有共同特征,...
    99+
    2023-06-29
  • Java 接口和抽象类的区别详解
    目录什么是抽象类和接口? 区别在哪里?抽象类接口抽象类和接口解决了什么问题?如何模拟抽象类和接口如何决定该用抽象还是接口?什么是抽象类和接口? 区别在哪里? 不同的编程语言对接口和...
    99+
    2022-11-12
  • 如何理解Java抽象类和接口
    这期内容当中小编将会给大家带来有关如何理解Java抽象类和接口,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在面试中我们经常被问到:Java中抽象类和接口的区别是什么然后,我们就大说一通抽象类可以有方法,...
    99+
    2023-06-17
  • Java抽象类和接口的比较
    这篇文章主要介绍“Java抽象类和接口的比较”,在日常操作中,相信很多人在Java抽象类和接口的比较问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java抽象类和接口的比较”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-17
  • C#抽象类和接口的区别
    这篇文章主要介绍“C#抽象类和接口的区别”,在日常操作中,相信很多人在C#抽象类和接口的区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#抽象类和接口的区别”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-18
  • Java 深入浅出解析面向对象之抽象类和接口
    目录抽象类声明抽象类声明抽象方法案例使用规则接口声明接口案例接口特性抽象类和接口的区别抽象类 java语言,声明类时 abstract class Db{} 说明Db类为抽象类。 j...
    99+
    2022-11-13
  • JAVA抽象类,接口,内部类详解
    目录一.内容抽象类抽象方法与抽象类抽象类的使用接口接口的概念接口的定义接口中的成员变量接口中的方法接口的继承接口的实现/使用接口与抽象类的差异面向接口编程内部类非静态内部类静态内部类...
    99+
    2022-11-12
  • Java抽象类与接口实例分析
    这篇“Java抽象类与接口实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java抽象类与接口实例分析”文章吧。1.抽...
    99+
    2023-06-30
  • Java中的抽象类和接口你了解吗
    目录抽象类什么是抽象类?抽象类属于什么类型?抽象类怎么定义?抽象类是干什么的?什么是抽象方法?非抽象类继承抽象类抽象类总结接口接口的基础语法接口的实现接口和多态联合使用继承和实现同时...
    99+
    2022-11-13
  • Java中的多态、抽象类和接口详解
    目录1.多态1.1 向上转型1.2 向下转型1.3 实现多态的条件1.4多态的特点与使用1.5多态的应用以父类类型作为方法的参数使用父类型作为方法的返回值1.6 多态的注意点2.抽象...
    99+
    2022-11-13
  • Java中的抽象类和接口怎么理解
    这篇文章主要介绍“Java中的抽象类和接口怎么理解”,在日常操作中,相信很多人在Java中的抽象类和接口怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的抽象类和接口怎么理解”的疑惑有所帮助!...
    99+
    2023-06-30
  • 深入理解java中抽象类和接口
    相信大家都有这种感觉:抽象类与接口这两者有太多相似的地方,又有太多不同的地方。往往这二者可以让初学者摸不着头脑,无论是在实际编程的时候,还是在面试的时候,抽象类与接口都显得格外重要!希望看完这篇文章各位都能从容地明了二者...我所理解的抽象...
    99+
    2021-07-19
    java入门 java 抽象类 接口
  • java中抽象类、抽象方法、接口与实现接口实例详解
    前言对于java中的抽象类,抽象方法,接口,实现接口等具体的概念就不在这里详细的说明了,网上书本都有很多解释,主要是我懒,下面通过一个例子来说明其中的精髓要点,能不能练成绝世武功,踏上封王之路,就看自己的的啦(不要误会,我指的只是我自己啦啦...
    99+
    2023-05-30
    java 抽象类 接口
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作