首页 > 编程语言 >Java中的修饰符

Java中的修饰符

时间:2024-09-10 19:51:34浏览次数:12  
标签:Java abstract 修饰符 修饰 抽象类 方法 final

1.访问权限修饰符

访问权限分四种级别:

公开级别:用public修饰,对外公开。

受保护级别:用protected修饰,向子类及同一个包中的类公开。

默认级别:没有访问权限修饰符,向同一个包中的类公开。

私有级别:用private修饰,只有类本身可以访问,不对外公开。

下图总结

访问级别访问权限修饰符同类同包子类不同的包
公开public
受保护protected
默认
私有private

2.abstract修饰符

abstract修饰符可用来修饰类和成员方法:

1)用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化,即不允许创建抽象类本身的实例。没有用abstract修饰的类称为具体类,具体类可以被实例化。

2)用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。没有用abstract修饰的方法称为具体方法,具体方法具有方法体。

  使用abstract修饰符需要遵守以下语法规则:

1)抽象类可以没有抽象方法,但包含抽象方法的类必须被定义为抽象类。如果子类没有实现父类中所有的抽象方法,那么子类也必须定义为抽象类,否则编译出错。

abstract class Base{
    abstract void method1();
    abstract void method2();
}
class Sub extends Base{//编译出错,Subject类必须定义为抽象类
    void method1(){ System.out.println("method1"); }
}

2)没有抽象静态方法,static和abstract关键字是势不两立的冤家,不能在一起使用。

abstract class Base{
    static abstract void method1();//编译出错,static和abstract修饰符不能连用
    abstract void method2();//合法,抽象类中可以有静态方法
}

3)抽象类不能被实例化,然而可以创建一个引用变量,其类型是一个抽象类,并让它引用非抽象的子类的一个实例。

abstract class Base{}
class Sub extends Base{
    public static void main(String[] args) {
        Base base1=new Base();//编译出错,不能创建抽象类Base的实例
        Base base2=new Sub();//合法,可以创建具体类Sub的实例
    }
}

4)抽象类及抽象方法不能被final修饰符修饰。abstract修饰符与final修饰符不能连用,因为抽象类只允许创建其子类,它的抽象方法才能被实现,并且只有它的具体子类才能被实例化,而用final修饰的类不允许拥有子类,用final修饰的方法不允许被子类的方法覆盖,因此把abstract修饰符与final修饰符连用,会导致自相矛盾。

abstract final class Base{}//编译出错,abstract修饰符与final修饰符不能连用
abstract class Base2{
    final abstract void method1();//编译出错,abstract修饰符与final修饰符不能连用
    final void method2(){}//合法,在抽象类中可以拥有final类型的具体方法
}

5)抽象方法不能被private修饰符修饰。因为如果方法是抽象的,表示父类只声明具备某种功能,但没有提供实现。这种方法有待于某个子类去实现它。父类中的abstract方法必须让子类是可见的。否则,在父类中声明一个永远无法实现的方法时无意义的。

3.final修饰符

  final具有“不可改变的”含义,它可以修饰非抽象类,非抽象成员方法和变量:

1)用final修饰的类不能被继承,没有子类。

2)用final修饰的方法不能被子类的方法覆盖。

3)用final修饰的变量表示常量,只能被赋一次值。

  final不能用来修饰构造方法,因为“方法覆盖”这一概念仅适用于类的成员方法,而不适用于类的构造方法,父类的构造方法和子类的构造方法之间不存在覆盖关系,因此用final修饰构造方法时无意义的。父类中用private修饰的方法不能被子类的方法覆盖,因此private类型的方法默认时final类型的。

4.static修饰符

  static修饰符可以用来修饰类的成员变量,成员方法和代码块:

1)用static修饰的成员变量表示静态变量,可以直接通过类名来访问。

2)用static修饰的成员方法表示静态方法,可以直接通过类名来访问。

3)用static修饰的程序代码块表示静态代码块,当Java虚拟机加载类时,就会执行该代码块。

  被static所修饰的成员变量和成员方法表明归某个类所有,它不依赖于类的特定实例,被的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定位到它们。

5.小结

访问权限修饰符

1)public的访问级别最高,其次是protected、默认和private。

2)成员变量和成员方法可以处于4个访问级别中的一个。

3)顶层类可以处于公开或默认级别,不能被protected和private修饰。

4)局部变量不能被方法权限修饰符修饰。

abstract修饰符

1)抽象类不能被实例化。

2)抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。

3)如果子类没有实现父类中所有的抽象方法,那么子类也必须定义为抽象类。

4)抽象类不能被定义为final和static类型。

5)抽象方法不能被定义为private、final和static类型。

6)没有抽象构造方法。

7)抽象方法没有方法体。

final修饰符

1)用final修饰的类不能被继承。

2)用final修饰的方法不能被子类的方法覆盖。

3)private类型的方法都默认为final方法,因而不能被子类的方法覆盖。

4)final类型的变量必须被显示初始化,并且只能被赋值一次。

static修饰符

1)静态变量在内存中只有一个备份,在类的所有实例中共享。

2)在静态方法中不能直接访问实例方法和实例变量。

3)静态方法中不能使用this和super关键字。

4)静态方法不能被abstract修饰。

5)静态方法和静态变量都可以通过类名直接被访问。

6)当类被加载时,静态代码块只能被执行一次。类中不同的静态代码块按它们在类中出现的顺序被依次执行。

标签:Java,abstract,修饰符,修饰,抽象类,方法,final
From: https://blog.csdn.net/xiaojinyu0116/article/details/142066159

相关文章

  • Java 反射机制
    目录一.概述二.反射的特点三.反射主要应用四.反射注意事项五.代码示例详解1.解析图:2.获取字节码对象3.通过反射获取构造函数并创建对象4.通过反射获取对象字段信息5.通过反射获取方法并执行6.通过反射获取注解信息六.总结1.获取Class字节码对象方式......
  • Java 设计模式-状态模式
    目录一.概述二.主要角色三.代码示例四.优缺点优点:缺点:五.常见应用场景一.概述        状态模式是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定的状态相关的行为放到一个类......
  • Java 设计模式-代理模式
    目录概述一.什么是代理模式1.举例说明二.代理模式作用1.保护代理2.增强功能3.代理交互4.远程代理:三.代理模式3个角色四.静态代理1.代码示例:五.JDK动态代理1.代码示例:六.CGLIB动态代理1.代码示例 七.JDK动态代理和CGLIB动态代理区别八.两种在......
  • [设计模式] Cola-StateMachine : 一个轻量实用的Java状态机框架
    1概述:状态机1.0状态机vs工作流在介绍状态机之前,先介绍一个工作流(WorkFlow),初学者通常容易将两个概念混淆。工作流(WorkFlow),大体是指业务过程(整体或者部分)在计算机应用环境下的自动化,是对工作流程及其各操作步骤之间业务规则的描述。在计算机系统中,工作流属于计算机支持的......
  • Dagger:Android 和 Java 的快速依赖注入框架
    在软件开发中,依赖注入(DI)是一种设计模式,用于实现控制反转,减少代码耦合,提高模块化。Dagger是一个由Google开发的依赖注入库,专门用于Android和Java应用程序,以其快速和高效著称。文章目录......
  • 力扣474-一和零(Java详细题解)
    题目链接:474.一和零-力扣(LeetCode)前情提要:因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。最近刚学完01背包,所以现在的题解都是以01背包问题为基础再来写的。如果大家不懂01背包的话,建议可以去学一学,01背包问题可以说是背包问题的基础。如果大家感兴趣,......
  • 06JAVA第一次考试选择
    判断正确1,不含公共类的JAVA源文件名称可以随便命名,不受任何限制。2,编译当前路径下的HelloWorld.java文件,使用的命令是:javacHelloWorld.java。3,JamesGosling是Java语言的创始人之一。4,Java语言的标识符区分大小写。5,java.lang包的Character类的isJavaIdentifierStart方......
  • Java中日期时间类的学习
    日期时间类目录日期时间类Date类(日期时间)SimpleDateFormat类(格式化)Calendar类(日历)Date类(日期时间)序号方法和描述1booleanafter(Datedate)若当调用此方法的Date对象在指定日期之后返回true,否则返回false。2booleanbefore(Datedate)若当调用此方法的Date......
  • 基于Java web社区公共安全管理系统(源码+lw+部署文档+讲解等)
    文章目录前言......
  • 基于Java技术的车辆故障管理软件的设计与实现(源码+lw+部署文档+讲解等)
    文章目录前言......