首页 > 编程语言 >JavaSE--抽象类和接口

JavaSE--抽象类和接口

时间:2023-08-15 10:48:37浏览次数:44  
标签:-- void 接口 public int 抽象 JavaSE 抽象类

一、抽象类

1、抽象类

  1)抽象类无法实例化,无法创建对象

  2)抽象类:是类和类之间的共同特征,将这些具有共同特征的类再进一步抽象形成了抽象类,由于类本身是不存在的,所以抽象类无法创建对象,抽象类与抽象类之间也还有共同特征,还可以再一步抽象

  3)抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的,final和abstract是不能一起用的,是对立的

  4)抽象类的子类可以是抽象类

  5)抽象类虽然无法实例化,但是有构造方法,这个构造方法是供子类使用的

2、抽象类属于什么类型

  抽象类属于引用数据类型

3、抽象类的定义

[修饰符列表] abstract class 类名{
    类体;
}

4、抽象方法

  抽象方法:表示没有实现的方法,没有方法体的方法,没有方法体,以分号结尾,修饰符列表中有abstract关键字

  抽象类中不一定有抽象方法。但抽象方法必须在抽象类中

  重点::一个非抽象的类继承抽象类,必须将抽象类中的抽象方法实现了

public abstract void doSome();

 

public class AbstractTest02{
	public static void main(String[] args){
		Animal a = new Bird();
		// 这就是面向抽象编程。
		a.move();
		Animal x = new Cat();
		x.move();
	}
}

// 动物类(抽象类)
abstract class Animal{

	// 抽象方法
	public abstract void move();
}

// 子类(非抽象的)
// 错误: Bird不是抽象的, 并且未覆盖Animal中的抽象方法move()
/*
class Bird extends Animal{
}
*/

class Bird extends Animal{
	// 必须把抽象的方法实现了。
	public void move(){
		System.out.println("鸟儿在飞翔!");
	}
}

class Cat extends Animal{
	public void move(){
		System.out.println("猫在走猫步!");
	}
}

// 如果Bird是抽象类的话,那么这个Animal中继承过来的抽象方法也可以不去重写/覆盖/实现。
/*
abstract class Bird extends Animal{
}
*/

 

二、接口

1、接口

  1.1接口也是一种引用数据类型,编译之后也是class字节码文件

  1.2接口是完全抽象的,(抽象类是半抽象的),或者说是接口是特殊的抽象类

  1.3接口的语法

[修饰符列表] interface 接口名{
}

  1.4、接口支持多继承,一个接口可以继承多个接口

    类和类之间叫继承,类和接口之间叫做实现。可以将“实现”看作“继承”

  1.5、接口中只包含两部分内容,一部分:常量,一部分:抽象方法

  1.6、接口中所有的元素都是public修饰(都是公开的

  1.7、接口中的抽象方法public abstract可以省略,当然方法是抽象的,不能有方法体

  1.8、接口中常量的public static final可以省略

  1.9、实现使用implements关键字完成,继承使用extends关键字完成

  1.10、当一个非抽象的类实现接口的话,必须把接口中所有的抽象方法全部实现

2、接口的基础语法

public class Test01{
    public static void main(String[] args){
        
    }
}

interface A{
    
}

interface B{
    
}
// 一个接口可以继承多个接口,多继承
interface C extends A,B{
    
}

interface MyMath{
    // public static final double PI = 3.14;
    double PI = 3.1415926;
    int sum(int a,int b);
    int sub(int a,int b);
}

   1.11、一个类可是实现多个接口

public class Test02{
    public static void main(String[] args){
        // 多态
        MyMath mm = new MyMathImp1();
        int result = mm.sum(10,20);
    }
}
interface MyMath{
    double PI = 3.1415926;
    int sum(int a,int b);
    int sub(int a,int b);
}
class MyMathImp1 implements MyMath{
    // 实现接口中的方法
    public int sum(int a,int b){
        return a + b;
    }
    public int sub(int a,int b){
        return a - b;
    }
    /*错误:正在尝试分配更低的访问权限,之前为public
    int sub(int a,int b){
        return a - b;
    }
    */
}

  1.12、接口和接口之间在进行强制类型转换的时候,没有继承关系,也可以强转

    但是一定注意,运行时可能会出现ClassCastException异常,类转换异常

public class Test03{
    public static void main(String[] args){
        A a = new D();
        B b = new D();
        C c = new D();
        // B b2 = (B)a;// 这样是可以的
        if (a instanceof B){
            B b2 = (B)a;
        }
    }
}

interface A{
    void m1();
}
interface B{
    void m2();
}
interface C{
    void m3();
}
class D implements A,B,C{
    // 实现A接口中的方法
    public void m1(){
    
    }
    // 实现B接口中的方法
    public void m2(){
    
    }
    // 实现C接口中的方法
    public void m3(){
    
    }
}

 

3、继承和实现一起使用

  extends关键字在前,implements关键字在后

class Animal{

}
// 接口通常提取的是行为动作
interface Flyable{
    void fly();
}

class Cat extends Animal implements Flyable{
    public void fly(){
        System.out.println("猫猫zai飞翔");
    }
}
// 蛇类,不想让他飞,不实现Flyable接口就可以
class Snake extends Animal{
    
}

 

三、抽象类和接口的区别

只说一下抽象类和接口在语法上的区别  
  • 抽象类是半抽象的
  • 接口是完全抽象的
 
  • 抽象类中有构造方法
  • 接口中没有构造方法

 

  • 接口和接口之间支持多继承
  • 类和类之间只能单继承
 
  • 一个类可以同时实现多个接口
  • 一个抽象类只能继承一个类(单继承)

 

  • 接口中只允许出现常量和抽象方法

 

标签:--,void,接口,public,int,抽象,JavaSE,抽象类
From: https://www.cnblogs.com/hyy-0/p/17612006.html

相关文章

  • docker-compose启动开发环境
    前言经常需要搭建自己的环境,做个笔记。-操作系统:DeepinV23-Docker版本:24.0.5Gitee地址:链接启动准备1.配置Docker国内加速(配置完成重启docker)文件:/etc/docker/daemon.json{"registry-mirrors":["https://hub-mirror.c.163.com"]}2.命令行创建网络net-devdock......
  • 为什么会有 AtomicReference ?
    我把自己以往的文章汇总成为了Github,欢迎各位大佬starhttps://github.com/crisxuan/bestJavaer我们之前了解过了AtomicInteger、AtomicLong、AtomicBoolean等原子性工具类,下面我们继续了解一下位于java.util.concurrent.atomic包下的工具类。关于AtomicInteger、Ato......
  • 使用 OpenSSL 解密 DBeaver 保存的数据库连接信息获取数据库连接密码
    你是不是使用任何软件时都喜欢记住密码?是的,我也喜欢。但如果有一天你想把密码分享给其他人,而你又不记得密码是什么了,没错你可以去查看已保存的密码,但是当你使用的是DBeaver时,不好意思,没有查看已保存的密码功能,这个时候不就尴尬了嘛。那么现在你也许不再需要因此而烦恼了,因为......
  • CMakeLists语法详解
     https://www.jianshu.com/p/eb25baf5ca19set(Root"${CMAKE_CURRENT_SOURCE_DIR}")set(Base64${Root}/lib/libb64/src)include_directories(${OpenCV_INCLUDE_DIRS})include_directories(${Root})include_directories(${Root}/lib/libb64/include) include_dir......
  • 数学基础
    数学基础单变量微积分隐式函数求导\[f(x)+g(y)=C\]两边取\(x\)的导\[\fracd{dx}f(x)+\fracd{dy}g(y)*\frac{dy}{dx}=0\]化简\[\frac{dy}{dx}=-\frac{f'(x)}{g'(y)}\]无穷小量\(x\)的变化趋于0,\(\Deltax\)也趋于0,则\(\Deltax\)为\(x\)的无穷小量......
  • VSCode如何在行内显示变量值
    背景在调试时,我们希望能够直接在代码行显示变量的值,而不是总是去侧边栏查看,如下这种,y=12直接显示在代码行。那么VSCode中如何做呢设置VSCode提供了“inlinevalues”设置,但为了速度,默认并没有开启,我们只需修改配置即可开启这个功能。效果......
  • ai下载-中文简体正版下载 安装激活步骤
    AdobeInc.最新推出的Photoshop2023版本,是一款备受期待的图像处理软件。与之前版本相比,Photoshop2023新增了许多实用功能,可以更好地满足用户对于图片处理的需求。首先,Photoshop2023在色彩管理方面进行了升级,支持更广泛的色彩空间,使得用户可以更加精确地控制色彩。同时,该版本也新......
  • 基于PHP的娱乐新闻网站
    本毕业设计的内容是设计并且实现一个基于PHP技术的“娱新”娱乐新闻网站。它是在Windows下,以MYSQL为数据库开发平台。“娱新”娱乐新闻网站的功能已基本实现,主要包括首页、用户管理、娱新栏目、娱新文章、用户评论、系统管理等功能。论文主要从系统的设计与制作、数据库设计和系统......
  • AI最新版安装 AI2022中文汉化下载 安装激活步骤
    ai2023新版本和上个版本进行比较的话,增加了很多新的功能,当然一如既往地对以前的部分功能进行了优化和改进。比如现在Intertwine功能可以使对象部分重叠,我们在Illustrator与InDesign之间粘贴文本时可以保留格式,并且改进了放置多个链接文件的性能,这些功能的改动可以让软件的功能更加......
  • 最大传输单元MTU和最大分段大小MSS
    参考:https://support.huawei.com/enterprise/zh/knowledge/EKB1000052671https://zhiliao.h3c.com/questions/dispcont/93066在PPPoE场景出现上网慢的情况时,首先检查设备当前的MTU以及TCP-MSS值。了解一些基本概念:1.MTU(MaxitumTransmissionUnit):最大传输单元。EthernetII帧的结......