关键字static与格式访问修饰符详解(代码解释版)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 关键字static与格式访问修饰符详解(代码解释版)

@TOC


前言

static是修饰类,属性,方法,让他们只有存在一份,随着类的加载而加载,被所有对象共享,优先于对象的存在;
Java中用来确定访问范围的叫做 格式访问修饰符,随范围大到小分别是public,protected,default,private,下面通过代码详细解释


一、Static

1.static是什么

static是用来修饰类(内部类),属性,方法的关键字,使得他们静态化也就是模板化,在内存中只存在一份,每一次修改都会影响下一次调用时的值改变

让他修饰的有以下几个特点

●随着类的加载而加载
●优先于对象存在
●修饰的成员被所有对象共享
●可以不创建对象,直接调用

1.用static修饰的内容-->代码演示

⑴用static修饰的成员变量的演示
赋值演示

这里写一个非静态的String类型,一个静态的String属性类型
```java
public class Static {
//静态修饰举例
String name;
static String country = "中国";

}

>在main方法里通过测试,更改上面的两个属性来演示

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/0083f7be2e32404aab32f8b54f937a27.png)
这样就改变了p3这个对象里的name值,而当你直接通过类名调用时就会**报错**,如下
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/ef9d655d82464f8cbbaa00092e0527aa.png)
报错原因是 (不能从静态上下文引用非静态的name)因为name还没有加载到内存空间里,还不能用

---
*更改静态属性演示*
>首先构造一个类

```java
public class Static {
    //静态修饰举例
    String name;                           //非静态
    static String country = "中国";        //静态

}

构造一个测试类

public class TestStatic{
   
   

    public static void main(String[] args) {
   
   
        //通过类名直接调用
        System.out.println(Static.country);//输出中国人
        //通过对象调用
        Static p1 = new Static();
        System.out.println(p1.country);//静态也可以通过创建对象来调用
        //通过对象来更改类中的静态属性
        p1.country = "中国人";
        Static p2 = new Static();
        System.out.println(p2.country);//输出中国人
        //通过类名调取后更改
        Static.country = "阿根廷";
        /*
             此时由于通过类名更改后,只有一份的country值改变
             成阿根廷 ,所以任何对象调用时候都是更改后的值
        */
        System.out.println(p2.country);//输出阿根廷

    }
}

⑵用static修饰的成员方法的演示
●static修饰的方法可以过类名直接调用
●static修饰的方法和不用static修饰的方法都可以通过创建对象调用

构造一个类

public class Static {
   
   
    //静态修饰举例
    String name;
    static String country = "中国";
    //静态方法调用静态
    public static void test(){
   
   
        System.out.println("国籍:"+country);
    }
    //非静态方法调用静态和非静态
    public void test1(){
   
   
        System.out.println("姓名 :"+name+"   国籍 :"+country);
    }
}

写一个测试类

public class TestStatic{
   
   

    public static void main(String[] args) {
   
   
        //通过类名调用静态方法
        Static.test();
        //通过对象可以调用非静态方法也可以调用静态方法
        Static p3 = new Static();
        p3.test1();//调用非静态
        p3.test();//调用静态
    }
}

⑶用static修饰内部类的演示
(注意:普通类是不能被static修饰,只有内部类才可以)
●被static修饰的内不类可以直接作为一个普通类来使用,不需要实例一个外部类使用

代码演示(先写一个静态内部类与非静态的内部类)

public class Test1 {
   
   
    //这是一个静态修饰的内部类
    public static class TestStatic{
   
   
        void inner(){
   
   
            System.out.println("---我是一个静态的内部类---");
        }
    }
    //这是一个非静态修饰的内部类
    public class TestNoStatic{
   
   
        void inner(){
   
   
            System.out.println("---我是一个非静态的内部类---");
        }
    }

测试类

public class Test {
   
   
    public static void main(String[] args) {
   
   

    /*
           调用静态内部类
           调用时不需要new一个Static对象,直接newTestStatic对象即可
     */
        Test1.TestStatic Static = new Test1.TestStatic();
        Static.inner();
    /*
            调用非静态内部类
            调用时必须先构造一个Static的对象sta,再通过sta.new构造一个内部对象
     */
                Test1 sta = new Test1();
                Test1.TestNoStatic noStatic = sta.new TestNoStatic();
    }
}

二、格式访问修饰符

在想要区分 格式访问修饰符之间的访问范围的区别,要先知道包的概念
可以看
-->包的概念

1.public

public 用来修饰类,属性,方法,表明该变量或者方法是公共的,在任何类中都可以调用

2.protected

protected用来属性,方法,表明该变量或者方法是受保护的,在本包下的任何类,以及其他包中该类的子类可以调用(注意要创建子类对象调用)

2.default

default 用来修饰类,属性,方法,表明该变量或者方法是默认的,在本包下的任何类可以调用

4.private

>private 用来修饰属性,方法,表明该变量或者方法是私有化的,只能在本类中使用

5.用代码分别测试以上修饰符的访问权限

这里写一些访问修饰符修饰的属性,来逐个测试访问权限
```java
public class XShFu {
public int pub = 10;
protected int pro = 20;
int daf = 30;
private int pri = 40;
/
public 修饰 类,属性,方法 各个类都可以访问
protected 修饰 属性,方法 同包里访问,不同包的子类,通过创建子类对象来调用
default 修饰 类,属性,方法 同包不同类
private 修饰 属性.方法 本类
/

}
```

示例1

代码演示如下图
在这里插入图片描述
●由图知:同包不同类--->不能访问到private修饰的成员

示例2
在这里插入图片描述
●由上图可以知道不同包--->只能访问public的成员

示例3

在这里插入图片描述
●由上图知,不同包下的类,但是该类是继承了类xiushifu,所以xiushifu里的protected修饰的成员该类可以调用,而defaul与private修饰的成员不能访问

(注意:当要调用父类里的protected修饰的成员时,必须创建子类对象子类对象子类对象)

相关文章
|
2天前
|
算法 安全 编译器
【C++ 关键字 override】C++ 重写关键字override(强制编译器检查该函数是否覆盖已存在的虚函数)
【C++ 关键字 override】C++ 重写关键字override(强制编译器检查该函数是否覆盖已存在的虚函数)
29 0
|
2天前
|
Java 数据库连接 数据库
static关键字的用法和作用
static关键字的用法和作用
27 0
|
2天前
|
存储 算法 C++
【C/C++ 关键字 存储类说明符】 深入理解C/C++中的static关键字:它的作用、限制和使用技巧
【C/C++ 关键字 存储类说明符】 深入理解C/C++中的static关键字:它的作用、限制和使用技巧
16 0
|
2天前
|
编译器 程序员 数据安全/隐私保护
C++类成员解析:编译器如何识别和处理声明与定义(C++ 类的作用域以及查找顺序)
C++类成员解析:编译器如何识别和处理声明与定义(C++ 类的作用域以及查找顺序)
14 0
|
2天前
|
存储 C语言 C++
C/C++静态static属性/用法
C/C++静态static属性/用法
11 0
|
7月前
|
druid Java 编译器
Java的第七篇文章——面向对象接口(包含了接口、static修饰符、final修饰符、main方法、内部类等知识点)
Java的第七篇文章——面向对象接口(包含了接口、static修饰符、final修饰符、main方法、内部类等知识点)
|
7月前
|
Java 编译器
serialVersionUID 不是被 static 变量修饰了吗?为什么还会被“序列化”?
serialVersionUID 不是被 static 变量修饰了吗?为什么还会被“序列化”?
|
8月前
|
Java
final 类,常量,方法的解释
final 类,常量,方法的解释
57 1
|
8月前
|
程序员 Ruby
“茴” 字的六种写法---l 类方法的七种定义方式
“茴” 字的六种写法---l 类方法的七种定义方式
|
9月前
|
存储 Java 编译器
【C语言】静态关键字static的用法(详解)
不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。这篇文章主要介绍了C语言中静态关键字static的作用,对大家学习C语言非常有帮助。
103 0