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


前言

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


一、Static

1.static是什么

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

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

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

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

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

这里写一个非静态的String类型,一个静态的String属性类型

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

}

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

在这里插入图片描述
这样就改变了p3这个对象里的name值,而当你直接通过类名调用时就会报错,如下
在这里插入图片描述
报错原因是 (不能从静态上下文引用非静态的name)因为name还没有加载到内存空间里,还不能用


更改静态属性演示

首先构造一个类

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.用代码分别测试以上修饰符的访问权限

这里写一些访问修饰符修饰的属性,来逐个测试访问权限

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

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值