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