Java入门篇 之 抽象类接口

本篇碎碎念:个人认为压力是一种前进的动力,但是不要有太多压力,不然会使心情烦躁,会控制不住自己的情绪,会在一个临界值爆发,一旦爆发,将迟迟不能消散

今日份励志文案: 努力的背后必有加倍的赏赐

少年要把压力转变为动力哦!!!

目录

 抽象类

下面是抽象方法声明采用的语法以及注意事项:(引用了abstrac关键字)

抽象类的总结

接口

interface使用方法:

implements使用方法:

接口的总结

 抽象类和接口的区别

Object类(简单了解,具体会在下一章讲解)


 抽象类

首先,我们要学习抽象类,尽管在构建具有某些未实现方法的类时,你的第一想法可能是创建接口,但是抽象类仍旧是用于此目的的一种重要的工具。因为你不可能总是使用纯接口

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

不同的子类可以用不同的方式表示此接口,通用接口建立起一种基本形式,以此表示所有导出类的共同部分,我们创建抽象类是希望通过这个通用接口操作一系列类,为此Java提供了一个叫抽象方法的机制,这种方法是不完整的,仅有声明没有方法体

下面是抽象方法声明采用的语法以及注意事项:(引用了abstrac关键字

abstract class 函数名{abstract void Dog();
}


1.方法被abstract修饰,包含abstract这个类也必须被abstract修饰

代码演示:

2.抽象类不能被实例化

代码演示: 

 

3.如果一个普通类继承了一个抽象类,那么此时,这个类必须重写这个抽象方法

代码演示: 

 

重写之后的代码 

 

public static void main(String[] args){Ball ball=new Basketball() ;ball.play();}

这里运用了向上转型:简单介绍一下,父类引用指向子类对象,具体在博主上一篇Java入门篇 之 多态中有详细介绍

4.抽象类和普通类的区别在于:

(1)可以个普通类一样,有成员变量和成员方法

(2)就是多了抽象方法

(3)多了不能实例化

5.什么情况下要设计为抽象类

如果这个类不能描述一个具体的对象,那么就可以描述为抽象类

对于抽象类使用的代码如下:

abstract class Ball{public String name;abstract void play();{}
}
class Basketball extends Ball{@Overridevoid play() {System.out.println("打篮球");}
}
class Football extends Ball{@Overridevoid play() {System.out.println("踢足球");}
}
class Volleyball extends Ball{@Overridevoid play() {System.out.println("打排球");}
}public static void output(Ball ball){ball.play();}public static void main(String[] args){Ball ball1=new Basketball() ;Ball ball2=new Football() ;Ball ball3=new Volleyball() ;ball1.play();ball2.play();ball3.play();//这是第二种输出方式借用output输出//注意,函数类型是静态的才可以哦,不然会报错的//如果问为什么?//博主回答,静态方法在访问本类的成员时,只允许访问静态成员//而不允许访问实例成员和实例方法Ball[] ball={ball1,ball2,ball3};for (Ball a:ball) {output(a);}}

看完这个代码,你们有没有认为这个代码与多态的代码很像呢?

没错这个就是多态,多态就是一个对象在不同条件下的表现出的不同形式

抽象类的总结

1.被abstract 修饰的方法叫做抽象方法,没有具体的实现的
2.如果一个类 包含了这个抽象方法,此时这个类也必须得用abstract修饰。此时这个类被叫做抽象类
3.抽象类当中 可以有和普通类当中一样的成员变量和成员方法
4.和普通类不一样的地方就是这个抽象类不能被实例化
5.当一个普通类继承了这个抽象类,那么这个普通类必须重写抽象方法。    abstract class Perso    
6.抽象方法不能被private修饰,final修饰,static修饰    

7抽象类当中可以包含构造方法,这个构造方法并不是在实例化这个抽象类的时候使用,因为他就不能被实例化。那么这个构造方法,主要是在子类当中让子类调用,帮助父类进行初始化。

接口

abstract关键字允许人们在类中创建一个或多个没有任何定义的的方法----提供了接口部分,但是没有提供任何相应的具体实现,这些实现是由此类的继承者创建的

interface这个关键字产生了一个完全抽象的类,他根本就没有提供任何具体实现。它允许创建者确定方法名,参数列表和返回类型,但是没有任何方法体,接口只提供了形式,而未提供任何具体实现

任何使用某特定接口的代码都知道可以调用该接口的哪些方式,而且仅需知道这些。因此接口被用来建立类与类之间的关系

要让一个类寻准某个特定接口(或者是一组接口),需要用implements关键字,他表示interface只是他的外貌,但是现在我要声明它是任何工作的,它看起来还很像继承

interface使用方法:


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

public abstract 是固定搭配,可以不写

在接口中上述写法都是抽象方法,更推荐方式4,代码更简洁

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

implements使用方法:

public class 类名称 implements 接口名称{//...
}

注意;子类和父类是extends继承关系,类与接口是implements实现关系

代码演示:

class Instrument{public String name;public Instrument(String name){this.name=name;}
}
interface Play{void play();
}
interface Knock{void knock();
}
interface Pull{void pull();
}
class Guitar extends Instrument implements Play,Knock{public Guitar(String name){super(name);// 在给实现子类的构造方法前// 先要用super()调用实现父类的构造方法// 因为父类自己定义了构造方法// 编译器不会自动给给子类构造方法中添加super();}@Overridepublic void play() {System.out.println("弹"+this.name);}@Overridepublic void knock() {System.out.println("敲"+this.name);}
}
public class demo8 {public static void main(String[] args){//实例化对象Guitar guitar=new Guitar("吉他");guitar.play();guitar.knock();}}

接口的总结

1.定义接口的时候使用关键字interface 来定义

2.接口当中的方法如果没有被实现,那么他默认就是一个抽象方法。

3.接口当中的方法不能有具体的实现

4.如果要有具体的实现,那么必须是由default修饰或者是由static修饰

5.接口当中定义成员变量默认都是public static final的

6.接口当中的抽象方法默认都是public abstract修饰的

7.接口是不可以被实例化的

8.类和接口之间的关系可以使用implements来关联

9.接口也是可以产生字节码文件的

10.一个类 可以继承一个抽象类/普通类同时还可以实现这个接口

 抽象类和接口的区别

1.抽象类当中 可以包含和普通类一样的成员变量和成员方法,但是接口当中的成员变量只能是 public static final的方法只能是public abstract的

2.一个类只能继承一个抽象类,但是能够同时实现多个接口,所以解决了java当中不能进行多继承的特性

Object类(简单了解,具体会在下一章讲解)

Object是Java默认提供的一个类(是所有类的先祖)

Java里面出来Object类,所有的类都是存在继承关系的,米热播会继承Object父类。即所有类的对象都可以使用Object的引用接收

接口间的继承

在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承,

在实例内部类当中,定义一个静态的成员变量,必须是一个常量

Public static final int date=1;

如果有解释的不对或者不清晰,如果可以从评论区指出,我一定会加以修改,万分感谢

希望对你们有所帮助

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法每日一练]-分块(保姆级教程 篇1)POJ3648

插讲一下分块 题目:(POJ 3648) 一个简单的整数问题 前缀和往往用于静态的不会修改的区间和。遇到经常修改的区间问题,就要用分块或线段树来维护了。 分块算法是优化后的暴力,分块算法有时可以维护一些线段树维护不了的…

mysql的行列互转

mysql的行列互转 多行转多列思路实现代码 多列转多行思路代码 多行转多列 多行转多列,就是数据库中存在的多条具有一定相同值的行数据,通过提取相同值在列头展示来实现行数据转为列数据,一般提取的值为枚举值。 思路 转换前表样式 -> 转…

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例

上链接: P5250 【深基17.例5】木材仓库 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P5250上题干: 题目描述 博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是…

YOLOv8改进 | 2023 | InnerIoU、InnerSIoU、InnerWIoU、FoucsIoU等损失函数

论文地址:官方Inner-IoU论文地址点击即可跳转 官方代码地址:官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址: 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其Focus变种 一、本文介绍 本文给…

LeetCode【13】罗马数字转整数

题目: 思路: 第十二题的逆运算,方法同理。需要注意的是IV、IX、XL、XC、CD、CM这六种特殊的情况。正常情况下每个字符找到对应的数值累加,这六种特殊字符都是左边的数值比右边的数值小。 这里以IV举例,IV对应数字是1和…

分享禁止Win10更新的两种方法

深恶痛绝 Windows更新简直就是毒瘤,总是在某些不需要的时候提示更新,而且关闭服务后总有办法重启。老是关不掉。 如果每次都是正常更新,好像也没啥所谓,但是总有那么一两次会蓝屏、黑屏、开不了机…… 52出品 下面是吾爱社区找…

算法之冒泡排序

算法之冒泡排序 冒泡排序Bubble Sort 交换排序相邻元素两两比较大小,有必要则交换。元素越小或越大,就会在数列中慢慢的交换并“浮”向顶端,如同水泡咕嘟咕嘟往上冒。 核心算法 排序算法,一般都实现为就地排序,输出…

《轻松入门!快速安装PyCharm,打造高效Python编程环境》

「Pycharm安装包和相关插件(Windows 64位)」https://www.aliyundrive.com/s/jByv6vjShVz 提取码: 1234 视频教程:https://www.douyin.com/video/7303106933521763596?previous_pageapp_code_link 第一步:找到一起下载的Pycharm安…

使用Docker/K8S部署项目流程

一、制作镜像: 1、创建nginx配置文件default.conf server {listen 80;server_name localhost; # 修改为docker服务宿主机的iplocation / {root /usr/share/nginx/html;index index.html index.htm;try_files $uri $uri/ /index.html 404;}error_page …

百胜杯答题系统

近期太忙了 百胜方答题活动于近期终于告一段落,这个活动周期长,参与人数多,是我这几年做答题活动的一个巅峰之作 当然项目开发难度不大,主要是参与人数突破了百万,对我而言是一次很好的历练 具体的设计方案 百胜杯答…

辅助笔记-Jupyter Notebook的安装和使用

辅助笔记-Jupyter Notebook的安装和使用 文章目录 辅助笔记-Jupyter Notebook的安装和使用1. 安装Anaconda2. conda更换清华源3. Jupter Notebooks 使用技巧 笔记主要参考B站视频“最易上手的Python环境配置——Jupyter Notebook使用精讲”。 Jupyter Notebook (此前被称为IPyt…

docker的基本使用以及使用Docker 运行D435i

1.一些基本的指令 1.1 容器 要查看正在运行的容器&#xff1a; sudo docker ps 查看所有的容器&#xff08;包括停止状态的容器&#xff09; sudo docker ps -a 重新命名容器 sudo docker rename <old_name> <new_name> <old_name> 替换为你的容器名称…