我是靠谱客的博主 活泼大树,最近开发中收集的这篇文章主要介绍【05】java | 修饰符详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Java 修饰符

Java语言提供了很多修饰符,主要分为以下两类:

  • 访问修饰符

  • 非访问修饰符


访问控制修饰符

ava中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

  • public : 对所有类可见。pubilc修饰符可可修饰:类、接口、变量、方法中,且意义相同。
    使用的对象:
    • 修饰类或接口: 由public修饰符修饰的类或接口,在其他所有的范围内都可见,但是所谓可见,意思是别的类可以使用该类来创建该类的实例或继承该类。但是要注意,java语言中,每一个类都有一个绝对的目录,即类是目录下的文件,如果类1要使用类2,且类2为public修饰的,在使用时有两种情况:
    1. 类1类2在同一目录下(即在同一包下),则类2相对类1正真可见,类1可以 直接使用类2
    2. 类1类2不在同一目录下(即不在同一目录下),则类2相对类1不是真正可见,不能直接使用类1要使用类2,必须先将将类2所在的包导入 类1所在的程序开头:import (类2的目录)。
    • 修饰变量或方法: 由public修饰的变量或方法,只要有该对象实例存在的地方,该变量或方法就可以直接在类外通过对象引用。

  • protected : 对同一包内的类和所有子类可见。protected 修饰符可可修饰:变量、方法。 注意:不能修饰类(外部类)。请见下图:
    • 在这里插入图片描述
    • 这里的所谓可见性,就是能不能在类外,即另一个类的方法中是否可以通过对象(如果是类变量,则是通过类)名直接使用。
    • 只要是在同一包中的类可见其实就是只要给类的对象能在别的类定义,那么,别的类只有是在同一包(而不是通过import导入才能创建)就可以通过对象名来使用该变量或者方法,即不用通过对象本身的方法来间接操作。所有,变量的可见性是在类的可见性基础上的
    • 接口及接口的成员变量和成员方法不能声明为 protected。

  • private : 在同一类内可见。private 修饰符可修饰:变量、方法。 注意:**不能修饰类(外部类)**请看下图
    • 在这里插入图片描述
    • 同一类可见就是说该数据成员只能在类的内部使用,即通过类的方法类使用他

  • default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
    • 我们都知道一个java源程序文件中,必须有一个且仅有一个public类,但是可以有多个非public类,而非public类其实也就是缺省类,即没有修饰符的
    • 没有修饰符的类Class1和public类Class2:public类Class2的实例可以用在任何地方,对该实例的操作只要符合规范就可,而缺省的类Class1,只能在同一包可以创建并使用实例,如果不在同一包 ,就算import正确导入也是不能创建Class1实例的,而即使Class1的实例是同一包下public类Class2的一个数据成员,而public类Class2的实例如果是另一包的类Class3的数据成员,那么在Class中也不能通过Class2的该数据成员来操作Class1的对象空间,即此时这个````Class3```的该数据成员是无意义的。

在包com.text01中

package com.text01;

public class Text01 {//public类
    int num01 = 1;  
    public Text04 t1 = new Text04();
    public static void main(String[] args){
    }
    public void fun01(){
			t1.num04 = 5; //正确
    }
}

class Text04{
    public int num04 = 4;
}
//这是

在这里插入图片描述

在包com.text02

package com.text02;

import com.text01.Text01;

public class Text02 {
    //Text04 t1 = new Text04(); //error:Text04是缺省访问控制类,只对同一包可见,Text04所在包是com.text02
    Text01 t2 = new Text01();  // Text01 是public类,对所有类可见,所以,可以创建Text01的实例t2
    void func02(){
        t2.num01 = 6;  //num01 在Text01中不是public的,所以t2.num01出错
        t2.t1.num04 = 5;    //error: 即使在t2的实例中,t1成员是public的,所以t2.t1正确,但num04不可见,
        // 原因是t1只是对象Text04对象的引用,不是Text04对象本身,而Text04对象本身的操作仅限于同一包,
        // 而如果在Text01中t1不是public的,此时t1也不可见,原因与t2.num01一样。
    }
}

在这里插入图片描述
如果在com.text01中新建一个Text03的public类,执行Text02一样的逻辑则:

package com.text01;

public class Text03 {
   Text01 t2 = new Text01();
   void func03(){
       t2.num01 = 6;
       t2.t1.num04 = 5;
       //显然此时都正确
   }
}

在这里插入图片描述


修饰符用法总结:

  • 类的访问控制方式只有两种:有public修饰和无public修饰。
  • 类成员中: public,protected,和缺省方式这三种在使用上类似只是可见程度不一样,都有两种用法,第一:在类本身中都可以自由使用,第二:在类外,只要在类的可见范围及成员本身的可见范围之内,都可以通过 对象.成员名的方式使用。 而private修饰的成员,只有第一种用法,只能在类本身使用,同时不能继承都父类中使用
  • 对于类成员使用(可见性),需要结合类的可见性,成员类型的可见性和性质考虑
  • 不同包的模块,尽量不要相互关联,如果一定要相互关联,则所有相关的部分一定要public修饰,否则可能出错(可能是因为有些数据可能相关但不直接操作);
  • 只有private修饰符才能正真保护数据,实现封装性

访问控制符与继承

  • 父类中声明为 public 的方法在子类中也必须为 public
  • 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
  • 父类中声明为 private 的方法,不能够被继承。

非访问控制符

static 修饰符

静态变量:
static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。

静态方法:
static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。


final 修饰符

final 变量:
final 表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值,及该变量是常量被 final 修饰的实例变量必须显式指定初始值。final 修饰符通常和 static 修饰符一起使用来创建类常量。

final 方法
类中的 final 方法可以被子类继承,但是不能被子类修改,即不能重写。声明 final 方法的主要目的是防止该方法的内容被修改。

final 类
final 类不能被继承,没有类能够继承 final 类的任何特性。


abstract 修饰符

抽象类:
抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。所以一个类不能同时被 abstract 和 final 修饰如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误抽象类可以包含抽象方法和非抽象方法,而且,不一定需要包含抽象方法。

抽象方法
抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。所以抽象方法不能被声明成 final 和 static(因为用static修饰的方法不能被重写)。任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。抽象方法的声明以分号结尾,例如:public abstract sample();


synchronized 修饰符

synchronized
关键字声明的方法同一时间只能被一个线程访问,作用是为了保证线程的数据同步。synchronized 修饰符可以应用于四个访问修饰符。


transient 修饰符
序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。


volatile 修饰符
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。一个 volatile 对象引用可能是 null。

最后

以上就是活泼大树为你收集整理的【05】java | 修饰符详解的全部内容,希望文章能够帮你解决【05】java | 修饰符详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部