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

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

前言

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修饰的成员时,必须创建子类对象子类对象子类对象)

相关文章
|
SQL 缓存 安全
Android ORM 框架之 greenDAO
Android ORM 框架之 greenDAO
974 0
|
12月前
|
Android开发 开发者 容器
android FragmentManager 删除所有Fragment 重建
通过本文,我们详细介绍了如何使用 `FragmentManager`删除所有Fragment并重建。通过理解和应用这些步骤,可以在实际开发中更灵活地管理Fragment,满足各种应用场景的需求。希望本文能帮助开发者更好地掌握Fragment管理技巧,提高应用开发效率和代码质量。
243 8
|
5G 网络架构
Wi-Fi的工作原理详解
【8月更文挑战第31天】
4409 1
|
机器学习/深度学习 人工智能 Cloud Native
福利「Flink Forward Asia 2023 」视频合集!
2023 年 12 月 9 日,Flink Forward Asia 2023 在北京圆满结束。本届大会共有 70+ 演讲议题、30+ 一线大厂技术与实践分享。现所有专场回放视频已经出炉,并在开发者社区上线。
6584 2
福利「Flink Forward Asia 2023 」视频合集!
|
设计模式 关系型数据库 测试技术
进阶技巧:提高单元测试覆盖率与代码质量
【10月更文挑战第14天】随着软件复杂性的不断增加,确保代码质量的重要性日益凸显。单元测试作为软件开发过程中的一个重要环节,对于提高代码质量、减少bug以及加快开发速度都有着不可替代的作用。本文将探讨如何优化单元测试以达到更高的测试覆盖率,并确保代码质量。我们将从编写有效的测试用例策略入手,讨论如何避免常见的测试陷阱,使用mocking工具模拟依赖项,以及如何重构难以测试的代码。
562 4
|
人工智能 自然语言处理 程序员
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
欢迎来到工程师令狐小哥的频道。本文介绍如何利用AI工具高效刷LeetCode,通过通义灵码插件在IntelliJ IDEA中实现代码生成、优化、单元测试等功能,提升编程学习效率。
599 1
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
本文深入探讨了PHP与MySQL在动态网站开发中的应用实践,通过具体案例解析如何高效结合这两大技术构建数据驱动的Web应用。文章将涵盖环境搭建、基础语法回顾、数据库设计与操作、用户注册与登录系统实现等关键步骤,旨在为开发者提供一个从零到一的项目实战路径,展示PHP与MySQL协同工作的强大能力。 ####
|
Java 测试技术 数据库连接
@Before 和 @BeforeClass 注释的区别
【8月更文挑战第22天】
1005 0
|
监控 算法 Java
JVM 调优之 glibc 引发的内存泄露
Pmap 提供了进程的内存映射,pmap 命令用于显示一个或多个进程的内存状态。其报告进程的地址空间和内存状态信息
JVM 调优之 glibc 引发的内存泄露
|
存储 算法 Java
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)(一)
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)
682 1