Java的接口、类、属性、方法的修饰符使用总结

本文涉及的产品
访问控制,不限时长
简介: Java的接口、类、属性、方法的修饰符使用总结

前言知识,在一些资料中default又被称之为friendly。

【1】接口

① 接口的修饰符

接口的修饰符只有:public和缺省修饰符default。


接口中的方法都为抽象方法,实例子类必须实现这些方法,抽象子类则不必。抽象子类不一定拥有抽象方法,但是拥有抽象方法的类肯定是抽象类。

[public] interface MyInterface{
    [abstract]void myMethod();//abstract is redundant
}


接口中的属性的默认是public static final 、方法默认是public abstract !


JDK1.8后接口中的方法被允许为“默认方法”和静态方法,即jdk1.8下接口中方法可以被如下修饰符/关键字修饰:public, abstract, default, static 和 strictfp

public interface MyInterface {
  default String getName(){
    return "呵呵呵";
  }
  //public, abstract, default, static and strictfp are permitted
  strictfp  static void show(){
    System.out.println("接口中的静态方法");
  }
}


② 接口的特性


接口不能用于实例化对象;

接口没有构造方法;

接口中的所用方法都是抽象方法,方法会被隐式指定为public abstract;

接口中不能包含成员变量,除了static和final变量,变量会被隐式指定为public static final变量;

接口被类实现,接口支持多继承;

接口中的变量不能用private/protected修饰。


③ 接口中变量的隐式指定

如下所示,idea会提示public static final is redundant:

public interface E {
    public static final int z=2;
    static final int z2=2;
    int z3=2;
}

class文件如下(你会发现三个变量编译后效果是一样的):

public interface E {
    int z = 2;
    int z2 = 2;
    int z3 = 2;
}


但是不能使用private/protected修饰,直接提示错误。


④ 接口和类的变量重名

实例如下:

public class ClassC extends ClassB implements A {
    public void printX(){
        System.out.println(x);
    }
    public static void main(String[] args){
        new ClassC().printX();
    }
}
class  ClassB{
    int x=1;
}
interface A{
    int x=1;
}


上面代码的错误之处在于A和B中都有一个同名变量x,A和B都是C的超类,那么C继承自哪个超类的变量呢?

答案是不知道!也就是C也不知道获取哪个超类的变量。


【2】类的修饰符

类的修饰符分为:可访问控制符和非访问控制符两种。

可访问控制符是:公共类修饰符 public

非访问控制符有:抽象类修饰符 abstract ;最终类修饰符 final

① 公共类修饰符 public


Java 语言中类 的可访问控制符只有一个: public 即公共的。

每个 Java 程序的主类都必须是 public 类,作为公共工具供其它类和程序使用的应定义为 public 类。


② 抽象类修饰符 abstract

凡是用 abstract 修饰符修饰的类,被称为抽象类。所谓抽象类是指这种类没有具体对象的一种概念类。这样的类就是 Java 语言的 abstract 类。


③ 最终类修饰符 final

当一个类不可能有子类时可用修饰符 final 把它说明为最终类,也就是说被final修饰的类不能被继承。被定义为 final 的类通常是一些有固定作用、用来完成某种标准功能的类。


④ 类缺省访问控制符

如果一个类没有访问控制符,说明它具有缺省的访问控制符特性。此时,这个类只能被同一个包中的类访问或引用。这一访问特性又称为包访问性

[public] [abstract|final] class MyClass implements MyInterface {
    @Override
    public void myMethod() {
    }
}

④ 类缺省访问控制符

如果一个类没有访问控制符,说明它具有缺省的访问控制符特性。此时,这个类只能被同一个包中的类访问或引用。这一访问特性又称为包访问性

[public] [abstract|final] class MyClass implements MyInterface {
    @Override
    public void myMethod() {
    }
}


⑤ 内部类

如果一个类为内部类,则可以使用public,protected、default、private、abstract、static、final等修饰 。即,可以把内部类理解为外部类的"成员变量",那么自然可以用这些关键字修饰符修饰。


【3】属性的修饰符

属性的修饰符也分为:可访问控制符和非访问控制符两类。

可访问控制符有 4 种:


  • 公共访问控制符: public ;
  • 私有访问控制符: private ;
  • 保护访问控制符: protected ;
  • 缺省访问控制符 : default


非访问控制符有 4 种:



  • 静态域修饰符: static ;
  • 最终域修饰符: final ;
  • 易失 ( 共享 ) 域修饰符: volatile ;
  • 暂时性域修饰符: transient


① 公共访问控制符 public

用 public 修饰的域称为公共域。如果公共域属于一个公共类,则可以被所有其它类所引用。由于 public 修饰符会降低运行的安全性和数据的封装性,所以一般应减少 public 域的使用。


② 私有访问控制符 private

用 private 修饰的成员变量 ( 域 ) 只能被该类自身所访问,而不能被任何其它类 ( 包括子类 ) 所引用。


③ 保护访问控制符 protected

用 protected 修饰的成员变量可以被三种类所引用:


  • 该类自身;
  • 与它在同一个包中的其它类;
  • 在其它包中的该类的子类。

使用修饰符 protected 的主要作用是允许其它包中它的子类来访问父类的特定属性。

④ 缺省访问控制符default

用 default修饰的成员变量可以被在同一个包中的其它类引用。


⑤ 静态域修饰符 static


  • 用 static 修饰的成员变量仅属于类的变量,而不属于任何一个具体的对象。
  • 静态成员变量的值是保存在类的内存区域的公共存储单元,而不是保存在某一个对象的内存区间。
  • 任何一个类的对象访问它时取到的都是相同的数据。
  • 任何一个类的对象修改它时 , 也都是对同一个内存单元进行操作。


⑥ 最终域修饰符 final

最终域修饰符 final 通常是用来定义符号常量的。一个类的域 ( 成员变量 ) 如果被修饰符 final 说明,则它的取值在程序的整个执行过程中都是不变的。也就是说final定义的变量是最终常量不可改变。


⑦ 易失 ( 共享 ) 域修饰符 volatile


易失 ( 共享 ) 域修饰符 volatile 是用来说明这个成员变量可能被几个线程所控制和修改。也就是说在程序运行过程中,这个成员变量有可能被其它的程序影响或改变它的取值。因此,在使用中要注意这种成员变量取值的变化。通常 volatile 用来修饰接受外部输入的域。


⑧ 暂时性域修饰符 transient

暂时性域修饰符 transient 用来定义一个暂时性变量。


其特点是:用修饰符 transient 限定的暂时性变量,将指定 Java 虚拟机认定该暂时性变量不属于永久状态,以实现不同对象的存档功能。否则,类中所有变量都是对象的永久状态的一部分,存储对象时必须同时保存这些变量。


私有保护访问控制符 private protected

有的地方提到组合体,private protected。其释义为:用修饰符 private protected 修饰的成员变量可以被该类本身或该类的子类两种类访问和引用。

但是已经不再可用,故无需理会


【4】方法的修饰符


方法的修饰符也分为:可访问控制符和非访问控制符两类。

可访问控制符有 4 种


  • 公共访问控制符: public ;
  • 私有访问控制符: private ;
  • 保护访问控制符: protected ;
  • 缺省访问控制符:default

同样无需理会组合体,private protected。


非访问控制符有 5 种

  • 抽象方法控制符: abstract ;
  • 静态方法控制符: static ;
  • 最终方法控制符: final ;
  • 本地方法控制符: native ;
  • 同步方法控制符: synchronized


可访问控制符参考属性中的可访问控制符介绍,下面介绍非访问控制符的五种。

① 抽象方法控制符 abstract

用修饰符 abstract 修饰的方法称为抽象方法。抽象方法是一种仅有方法头,没有方法体和操作实现的一种方法。通常需要被子类实现。


② 静态方法控制符 static

用修饰符 static 修饰的方法称为静态方法。静态方法是属于整个类的类方法,而不使用 static 修饰、限定的方法是属于某个具体类对象的方法。


由于 static 方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,即 static 方法只能处理 static 的域。


③ 最终方法控制符 final

用修饰符 final 修饰的方法称为最终方法。


最终方法是功能和内部语句不能更改的方法,即最终方法不能重写(覆盖),但是可以被重载。


这样,就固定了这个方法所具有的功能和操作,防止当前类的子类对父类关键方法的错误定义,保证了程序的安全性和正确性。所有被 private 修饰符限定为私有的方法,以及所有包含在 final 类 ( 最终类 ) 中的方法,都被认为是最终方法。


④ 本地方法控制符 native

用修饰符 native 修饰的方法称为本地方法。为了提高程序的运行速度,需要用其它的高级语言书写程序的方法体,那么该方法可定义为本地方法用修饰符 native 来修饰;


⑤ 同步方法控制符 synchronized

该修饰符主要用于多线程共存的程序中的协调和同步。

【5】抽象类与接口

抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

相同点


  • 接口和抽象类都不能实例化
  • 都位于继承的顶端,用于被其他实现或继承
  • 都包含抽象方法,其子类都必须覆写这些抽象方法


参数 抽象类 接口
声明 抽象类使用abstract关键字声明 接口使用interface关键字声明
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现 子类使用implements关键字来实现接口。它需要提供接口中所有声明的方法的实现
构造器 抽象类可以有构造器 接口不能有构造器
访问修饰符 抽象类中的方法可以是任意访问修饰符 接口方法默认修饰符是public。并且不允许定义为 private 或者protected
多继承 一个类最多只能继承一个抽象类 一个类可以实现多个接口
字段声明 抽象类的字段声明可以是任意的 接口的字段默认都是 static 和 final

备注: Java8中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间 的差异。


现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。 接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样一个原则:


行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量 少用抽象类。

选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用 的功能。

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


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

抽象类不能直接实例化,普通类可以直接实例化。


抽象类能使用 final 修饰吗?


不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承, 这样彼此就会产生矛盾,所以 final 不能修饰抽象类。

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
目录
相关文章
|
4天前
|
存储 安全 算法
Java容器及其常用方法汇总
Java Collections框架提供了丰富的接口和实现类,用于管理和操作集合数据。
Java容器及其常用方法汇总
|
6天前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
26 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
6天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
31 5
|
4天前
|
Java API
java.time常用方法汇总
`java.time` API 是从 Java 8 开始引入的时间日期处理库,旨在替代老旧的 `java.util.Date` 和 `Calendar`。它提供了更简洁、强大和灵活的方式处理日期、时间、时区及时间间隔,支持全球化和时间计算需求。API 包含获取当前时间、创建指定时间、解析和格式化字符串、进行加减运算、比较时间、获取年月日时分秒、计算时间间隔、时区转换以及判断闰年等功能。示例代码展示了如何使用这些功能,极大简化了开发中的时间处理任务。
|
7天前
|
安全 Java 编译器
JAVA泛型类的使用(二)
接上一篇继续介绍Java泛型的高级特性。3. **编译时类型检查**:尽管运行时发生类型擦除,编译器会在编译阶段进行严格类型检查,并允许通过`extends`关键字对类型参数进行约束,确保类型安全。4. **桥方法**:为保证多态性,编译器会生成桥方法以处理类型擦除带来的问题。5. **运行时获取泛型信息**:虽然泛型信息在运行时被擦除,但可通过反射机制部分恢复这些信息,例如使用`ParameterizedType`来获取泛型参数的实际类型。
|
7天前
|
安全 Java 编译器
JAVA泛型类的使用(一)
Java 泛型类是 JDK 5.0 引入的重要特性,提供编译时类型安全检测,增强代码可读性和可维护性。通过定义泛型类如 `Box<T>`,允许使用类型参数。其核心原理是类型擦除,即编译时将泛型类型替换为边界类型(通常是 Object),确保与旧版本兼容并优化性能。例如,`Box<T>` 编译后变为 `Box<Object>`,从而实现无缝交互和减少内存开销。
|
3天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
39 14
|
6天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
36 13
|
7天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
1月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
109 17