java11基础(接口 static关键字)

目录

一. 接口

1. 接口的定义

2. 接口的实现

3. Comparable接口

4. 抽象类和接口的区别

 小结

二. static关键字

1. 静态成员变量

2. static 静态方法

3. static静态代码块

格式:

作用:

执行顺序:

三. 接口拓展

default 和 static


一. 接口

如果一个抽象类没有字段(成员变量),并且所有方法全部都是抽象方法。在这种场景下,就可以把该抽象类定义为interface接口。所谓interface接口,就是比抽象类还要更佳抽象的一种纯抽象的代码结构。因为它连字段(成员变量)都不能存在,只能包含常量、抽象方法、默认方法等。

1. 接口的定义

类--- class        接口--- interface

接口定义语法规则:

修饰符 interface I接口名{1.抽象方法:public abstrcat 返回值类型 方法名();其中public abstrcat可以省略2.静态常量:public static final 数据类型 常量名=值;其中public static final可以省略
}

[注]:

●接口中的所有的修饰符均是public

●常量自带 public static final

double PI = 3.14;//常量 有默认修饰符 变量不可存在

●方法自带 public abstrcat

	void draw();void aaa();

●不能有构造方法

//不能有构造方法//Interfaces cannot have constructorspublic IShape() {}

●不能存在普通的方法

	//不能存在普通的方法//Abstract methods do not specify a bodypublic void doSth() {System.out.println("doSth");}

 ●常量不能重新赋值

	System.out.println(is1.PI);
//		The final field IShape.PI cannot be assignedis1.PI=777;//常量不能重新赋值

2. 接口的实现

当一个具体的class去实现一个interface时,需要使用implements关键字。

接口实现语法规则:

//类实现接口
修饰符 class 类名 implents 接口名{}

示例:

IShape接口:

public interface IShape {double PI = 3.14;//常量 有默认修饰符 变量不可存在void draw();void aaa();
}

子类:

//实现类必须要实现接口中的所有的抽象方法,除非此类是抽象类
public class Flower implements IShape {@Overridepublic void draw() {System.out.println("❀");}@Overridepublic void aaa() {System.out.println("flower --- aaa");}}
//抽象类实现接口 可以不实现抽象方法
abstract class Star implements IShape {}

[注]:

●接口和抽象类均不能实例化

//Cannot instantiate the type IShapeIShape is = new IShape();//接口和抽象类均不能实例化

●面向抽象设计

接口 对象名= new 实现类() 
//面向抽象设计IShape is1 = new Flower();is1.draw();// ❀

3. Comparable接口

Comparable接口用于进行对象之间的比较,主要用于排序方法。

public class Student implements Comparable {private String name;private int score;public Student(String name, int score) {super();this.name = name;this.score = score;}@Overridepublic String toString() {return "[name=" + name + ",score=" + score + "]";}//实现Comparable接口的compareTo()方法// ==0 不交换// >0 如果希望当前对象排在参数后面,返回大于0的// <0 如果希望当前对象排在参数前面,返回小于0的@Overridepublic int compareTo(Object o) {if (o instanceof Student) {Student s = (Student) o;if (this.score == s.score) {return 0;} else if (this.score > s.score) {return -1;} else {return 1;}}return 0;}}

测试:

public class Demo01 {public static void main(String[] args) {Student[] students = new Student[] { new Student("zkt1", 77), new Student("zkt2", 88),new Student("zkt3", 99) };// 给学生数组排序
//		Arrays.sort(students);sort(students);System.out.println(Arrays.toString(students));}public static void sort(Comparable[] array) {for (int i = 0; i < array.length - 1; i++) {for (int j = 0; j < array.length - 1 - i; j++) {if (array[j].compareTo(array[j + 1]) > 0) {Comparable c1 = array[j];array[j] = array[j + 1];array[j + 1] = c1;}}}}
}

运行结果:

4. 抽象类和接口的区别

abstract class 抽象类

interface接口

定义

使用 abstract class关键字定义抽象类

使用 interface关键字定义接口

继承

只能extends继承一个class类

可以implements多个interface接口
并且接口之间直接允许多重extends继承

字段(成员变量)

可以定义实例字段(成员变量)

不能定义实例字段(成员变量)

常量

使用static final关键字定义常量

无需任何关键字,只能定义常量

抽象方法

可以定义抽象方法

可以定义抽象方法

非抽象方法

可以定义非抽象方法(普通方法)

可以定义default方法

构造方法

可以有构造方法

不允许有构造方法

访问修饰符

可以使用任意访问修饰符

只能使用public访问修饰符

 小结

●Java的接口(interface)用于定义纯粹的抽象行为(方法)规范。
●一个类只能extends继承自另一个类(单继承)。但是,一个类可以implements实现多个interface接口(多重实现)。
●一个interface可以继承自多个interface(接口之间允许多重继承)。
●一个类实现interface接口时,要求必须实现该接口中所有的抽象方法。
●接口也是一种“高层”的数据类型,可以用于定义“引用”的类型,也适用于"向上转型"和"向下转型"。
●接口不允许实例化。
●接口的所有方法都是抽象方法,接口不能定义实例字段(成员变量)。
●接口可以定义default方法(JDK版本 >= 1.8),default方法可以包含方法体。
●实现Comparable接口的类,该类的对象之间可以进行“比较”,用于“排序”。

二. static关键字

1. 静态成员变量

在一个class类中定义的成员变量,我们称之为实例成员变量(成员变量)。实例成员变量的特点是,每个实例都有独立的成员变量,各个实例的同名成员变量互不影响。除此以外,还有一种成员变量,是使用static关键字修饰的成员变量,称为静态成员变量:static field。

实例成员变量在每个实例中都有自己的一个独立“空间”,但是静态成员变量只有一个共享“空间”,所有实例都会共享该成员变量。

示例:

Person类:

public class Person {// 实例成员变量private String name;private int age;// 静态成员变量public static String school;public Person(String name, int age) {super();this.name = name;this.age = age;}

测试类:

Person p1 = new Person("zkt1", 21);Person p2 = new Person("zk2", 22);//静态成员变量访问方式://1.对象名.成员变量名//2.类名.静态变量名//成员变量被static修饰,此字段从对象级别提升到类级别//改类的所有的对象共享改字段的值p1.school = "清华大学";// 不推荐System.out.println(p1.school);p2.school = "浙江大学";System.out.println(p1.school);System.out.println(p2.school);System.out.println(Person.school);// 推荐

静态成员变量访问方式:

        对象名.成员变量名类名.静态变量名 --- 推荐

[注]:

●成员变量被static修饰,此字段从对象级别提升到类级别

●改类的所有的对象共享改字段的值

对于静态成员变量,无论修改哪个实例的静态成员变量,都是访问相同的内存空间:所有实例的静员态成员变量都被修改了,原因是静态成员变量并不属于实例。


内存情况:

class Person {public String name;public int age;// 定义静态成员变量number:public static int number;public Person(String name, int age) {this.name = name;this.age = age;}
}
public class Main {public static void main(String[] args) {Person ming = new Person("Xiao Ming", 12);Person hong = new Person("Xiao Hong", 15);ming.number = 88;System.out.println(hong.number);hong.number = 99;System.out.println(ming.number);}
}

2. static 静态方法

static修饰的方法称为静态方法。调用实例方法必须通过一个实例对象,而调用静态方法则不需要实例对象,通过类名就可以调用。

细节:

●如果一个方法被static所修饰,此方法为静态方法

●静态方法属于class类级别的,而不属于实例对象。因此,静态方法内部,不能访问非静态的成员变量,也不能出现this关键字

// 如果一个方法被static所修饰,此方法为静态方法// 类名.方法名()推荐    对象名.方法名()不推荐public  static void eat() {// 不能访问非静态的成员变量,也不能出现this关键字// System.out.println(name );System.out.println("你好 要吃饭了");System.out.println(school);sleep();}public static void sleep() {System.out.println("睡觉的办法");}

●普通方法可以访问静态方法和非静态方法

// 普通方法可以访问静态方法和非静态方法public void doSth() {eat();getName();}

静态方法调用:

类名.方法名()推荐    
对象名.方法名()不推荐
		Person p1 = new Person("zkt1", 21);
//静态方法调用--推荐类名.方法名()Person.eat();

3. static静态代码块

在Java类中使用static关键字和{}声明的静态代码块,静态代码块在“类被加载”的时候运行,而且只运行一次,并且优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,会按照书写顺序依次执行。

格式:

public class CodeBlock {static{System.out.println("静态代码块");}
}

作用:

如果有些代码逻辑或对象,需要在项目启动的时候就执行或创建,这时候就需要静态代码块。比如一个项目启动需要加载的很多配置文件或者数据库连接池对象等,我们就可以都放入静态代码块中。


另外,静态代码块中,只允许调用静态方法或静态的成员变量,不允许调用普通方法或普通成员变量。

class CodeBlock {// 静态成员变量public static int value;static {System.out.println("静态代码块A");register(); // 仅允许调用静态方法// sayHello(); // 不允许调用普通方法// 允许使用静态成员变量(但是,需要在这个静态代码块之前先定义,再使用)value += 10; }// 静态方法public static void register(){System.out.println("CodeBlock类的静态方法register()");}// 普通方法public void sayHello() {System.out.println("普通方法");}
}

执行顺序:

●静态代码块>构造代码块>构造方法

●先父类再子类,先静态后非静态

●父静态     子静态     父构造    父构造方法     子构造     子构造方法

Fu类:

public class Fu {public Fu() {System.out.println("这个是父类的无参构造方法");}{System.out.println("这个是父类的代码块1");}{System.out.println("这个是父类的代码块2");}static {System.out.println("这个是父类的静态代码块1");}static {System.out.println("这个是父类的静态代码块2");}
}

Zi类:

public class Zi {public Zi() {System.out.println("这个是子类的无参构造方法");}{System.out.println("这个是子类的代码块1");}{System.out.println("这个是子类的代码块2");}static {System.out.println("这个是子类的静态代码块1");}static {System.out.println("这个是子类的静态代码块2");}
}

测试:

Fu fu = new Fu();System.out.println("===============");Fu fu1 = new Fu();System.out.println("***************");Zi zi = new Zi();System.out.println("===============");Zi zi1 = new Zi();

运行结果:

●静态代码块随着类的加载而加载,只加载1次
●构造代码块随着对象的创建而调用,对象创建几次,调用几次

三. 接口拓展

default 和 static

在JDK 1.8及其更高版本中,接口中可以定义default 和 static方法。

IAAA接口:

public interface IAAA {int MAX = 2147483637;int MIN = -2147483639;//defaultdefault  void doSth() {System.out.println("1.8新出的有方法体的默认方法");}//staticpublic static  void test() {System.out.println("1.8新出的有方法体的静态方法");}
}
class Aaa implements IAAA{}

接口对常量访问方式:

接口名.静态常量

默认方法访问:

默认方法实现类的对象名.方法名()

静态方法访问:

接口名.方法名()访问接口中的静态方法
Aaa aa = new Aaa();// 不推荐System.out.println(aa.MAX);System.out.println(aa.MIN);//		推荐对静态常量访问方式:接口名.静态常量System.out.println(IAAA.MAX);System.out.println(IAAA.MIN);// 默认方法实现类的对象名.方法名()aa.doSth();//静态方法访问
//		aa.test();//实现类的对象名.方法名()不能调用
//		Aaa.test();IAAA.test();//接口名.方法名()访问接口中的静态方法

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

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

相关文章

【氮化镓】GaN功率器件在转换器设计中的挑战

I. 引言(INTRODUCTION) 宽带隙(WBG)器件的重要性: 引言部分首先强调了宽带隙(WBG)器件在高频、高效率电力电子技术中的关键作用。这些器件,包括碳化硅(SiC)和氮化镓(GaN),相较于传统的硅功率器件,具有显著的优势。宽带隙半导体材料的高击穿场强允许设计更薄的漂…

ADS基础教程汇总

目录 ADS基础教程1 - 软件简介ADS基础教程2 - S参数仿真ADS基础教程3 - Data Display WindowADS基础教程4 - Real Time TuningADS基础教程5 - OptimizationADS基础教程6-蒙特卡洛分析ADS基础教程7-Yiled AnalysisADS基础教程8-仿真库加载ADS基础教程9-理想模型和厂商模型实现及…

设计模式——建造者模式(Builder)

建造者模式&#xff08;Builder Pattern&#xff09;是一种对象构建的设计模式&#xff0c;它允许你以一种逐步构建的方式来创建复杂对象。建造者模式通常用于构建具有多个组成部分的对象&#xff0c;并且这些组成部分通常具有不同的构建和表示方式。 建造者模式主要包括以下几…

探索 Python:从初学者到编程达人

Python 是一门多用途的高级编程语言&#xff0c;它具有简单易学、功能丰富的特点&#xff0c;被广泛应用于 Web 开发、数据科学、人工智能等领域。无论你是初学者还是有一定编程经验的开发者&#xff0c;掌握 Python 的基础知识都是开启编程之旅的第一步。让我们一起来探索 Pyt…

不排斥温暖,不迎合热闹

在纷繁复杂的现代社会&#xff0c;每个人都在寻找自己的生活方式。有人热衷于社交活动&#xff0c;享受热闹的场面&#xff1b;而有人则偏爱宁静&#xff0c;寻求内心的平和。 拥抱温暖&#xff0c;珍视人际关系 温暖往往来源于人与人之间的深厚情感。无论是家庭的温馨、朋友…

Hive SQL-DML-insert插入数据

Hive SQL-DML-insert插入数据 1. 插入静态数据 可以直接插入具体的值到Hive表中&#xff1a; INSERT INTO TABLE tablename (column1, column2, column3) VALUES (value1, value2, value3),(value4, value5, value6),...;2. 插入查询结果 将一条查询的结果直接插入到另一个表中…

数据猎手:使用Java和Apache HttpComponents库下载Facebook图像

引言 在信息驱动的时代&#xff0c;互联网上的数据成为了无可比拟的宝藏。本文旨在探讨如何通过利用Java和Apache HttpComponents库&#xff0c;从全球最大的社交网络平台Facebook上获取图像数据。 作为全球最大的社交网络平台&#xff0c;Facebook聚集了数以亿计的用户&#…

uniapp——点赞、取消点赞

案例 更新点赞状态&#xff0c;而不是每次都刷新整个列表。避免页面闪烁&#xff0c;提升用户体验 代码 <view class"funcBtn zan" click"onZan(index,item.id)"><image src"/static/images/circle/zan.png" mode"aspectFill&…

Python基础学习之知识碎片

字符串可以用 运算符连接在一起&#xff0c;用 * 运算符重复。Python 中的字符串有两种索引方式&#xff0c;从左往右以 0 开始&#xff0c;从右往左以 -1 开始。“Python中的字符串不能改变”强调的是字符串的这一特性&#xff0c;即字符串对象一旦创建&#xff0c;其内容就是…

富文本编辑器CKEditor4简单使用-07(处理浏览器不支持通过工具栏粘贴问题 和 首行缩进的问题)

富文本编辑器CKEditor4简单使用-07&#xff08;处理浏览器不支持通过工具栏粘贴问题 和 首行缩进的问题&#xff09; 1. 前言——CKEditor4快速入门2. 默认情况下的粘贴2.1 先看控制粘贴的3个按钮2.1.1 工具栏粘贴按钮2.1.2 存在的问题 2.2 不解决按钮问题的情况下2.2.1 使用ct…

【QuikGraph】C#调用第三方库实现迪杰斯特拉(Dijkstra)算法功能

QuikGraph库介绍 项目地址&#xff1a;https://github.com/KeRNeLith/QuikGraph QuikGraph为.NET提供了通用的有向/无向图数据结构和算法。 QuikGraph提供了深度优先搜索、广度优先搜索、A*搜索、最短路径、k最短路径&#xff0c;最大流量、最小生成树等算法。 QuikGraph最初…

LeetCode|700. Search in Binary Search Tree

题目 You are given the root of a binary search tree (BST) and an integer val. Find the node in the BST that the node’s value equals val and return the subtree rooted with that node. If such a node does not exist, return null. Example 1: Input: root […

Go实现树莓派超声波测距

后面发现调用的两个Go的库进行测算还是没办法读到好的超声波值&#xff0c; 所以放弃 公式 距离(cm)&#xff08;(声速(m/s)时间(ms)&#xff09;/ 2&#xff09; *10 代码 ultrasonicSensor.go package mainimport ("context""errors""fmt"&…

设计模式——组合模式(Composite)

组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 特点 表示整体与部分&#xff1a;组合模式允许你将对象组合成树形结构…

MacOS miniconda安装方法

打开macos “终端” 应用 执行命令 mkdir -p ~/miniconda3curl https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o ~/miniconda3/miniconda.shbash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3rm -rf ~/miniconda3/mini…

腾讯云CVM服务器数据盘挂载

背景&#xff1a;新开腾讯云服务器挂载数据盘。 在腾讯云服务器上挂载数据盘通常涉及以下几个步骤&#xff0c;这里以Linux系统为例进行说明。如果您的服务器是Windows系统&#xff0c;操作界面会有所不同&#xff0c;但原理相似。1. 登录入腾讯云控制台首先&#xff0c;登录腾…

【35分钟掌握金融风控策略16】贷前风控策略详解-1

目录 贷前风控策略详解 贷前风控目标 精准审核申请贷款客户资质 对申请贷款客户进行合理定额 对申请贷款客户进行合理定价 推动实现利润最大化 贷前风控数据源 客户贷款时提供的数据 贷前风控策略详解 俗话说&#xff0c;良好的开端是成功的一半&#xff0c;而贷前是风…

SpringCloud面试题

SpringCloud常见组件有哪些 注册中心组件&#xff1a;Eureka、Nacos 负载均衡组件&#xff1a;Ribbon 远程调用组件&#xff1a;OpenFeign 网关组件&#xff1a;Zuul、Gateway 服务保护组件&#xff1a;Hystrix、Sentinel 服务配置管理组件&#xff1a;SpringCloudConfig、Nac…

docker 部署etcd集群

docker 部署etcd集群 往期内容 ETCD 简介 前言 上期我们对于分布式kv存储中间件有了简单的认识&#xff0c;本期简单介绍docker-compose 部署etcd集群以及可视化工具 etcd Keeper 1-etcd docker 部署 看了很多网上部署的教程&#xff0c;要么超级简陋&#xff0c;要么搞一堆…

VBScript与文件的编码

首先&#xff0c;VBScript的脚本源文件得是ANSI编码的&#xff0c;如果保存为UTF-8格式的&#xff0c;执行时可能会报错&#xff0c;比如你语法什么的都没有问题&#xff0c;不过代码中包含汉字串&#xff0c;那么可能执行时就会出现“未结束的字符串常量”之类的错误。 VBScri…