Java 教程 在线

1302Java 修饰符

JAVA 的类(外部类)有 2 种访问权限: public、default。

而方法和变量有 4 种:public、default、protected、private。

其中默认访问权限和 protected 很相似,有着细微的差别。

  • public 意味着任何地方的其他类都能访问。
  • default 则是同一个包的类可以访问。
  • protected 表示同一个包的类可以访问,其他的包的该类的子类也可以访问。
  • private 表示只有自己类能访问。

修饰符:abstract、static、final

  • abstract: 表示是抽象类。 使用对象:类、接口、方法
  • static: 可以当做普通类使用,而不用先实例化一个外部类。(用他修饰后,就成了静态内部类了)。 使用对象:类、变量、方法、初始化函数(注意:修饰类时只能修饰 内部类 )
  • final: 表示类不可以被继承。 使用对象:类、变量、方法

1301Java 变量类型

Java语言支持的变量类型有:

  • 类变量:独立于方法之外的变量,用 static 修饰。
  • 实例变量:独立于方法之外的变量,不过没有 static 修饰。
  • 局部变量:类的方法中的变量
public calls Student{
    static String schoolName ="清华小学"; //类变量
    String classNane ="中班";  //实例变量
    public void show(){
        /*局部变量*/
        int age =7;

        String name ="张华";
    }
}

1300Java 变量类型

package hello;

//首先要知道变量应该是赋值以后才能使用的,但是有些不必人为赋值就有默认初始值,但是有些要人为定义初始值
//所以有些直接使用的并不是没有赋值,而是系统自定义了初始值,所以不会报错

public class Variable {
    public String instance = "实例变量";
    public static String variable = "静态变量";    //静态变量的定义方式
    public static String CONST = "静态常量";    //静态常量的定义方式 
    public static void main(String[] args) {
        String local = "局部变量";    //类似这个就是局部变量,不可用访问修饰符修饰,没有默认初始值
        System.out.println(local);    //局部变量就是在方法或语句块中的变量
        Global global = new Global();    //类似这个就是实例变量,也称全局变量
        System.out.println(global.instance);    //实例变量就必须先把类new一个出来才能使用,因为他是在类中,方法外的
        System.out.println(variable);    //来瞅瞅静态变量,也叫类变量,静态变量的访问方式1(在自己类的时候)
        System.out.println(Global.variable);    //静态变量的访问方法2(不在自己类的时候)
    }
}

class Global{
    public String instance = "实例变量";    //实例变量在一个类的里面,语句块的外面
    public static String variable = "静态变量";
    Global(){    //在类的内部使用自己的实例变量:要么老老实实new一个出来,就像上面那个
        //第二种方法就是在函数里面使用实例变量,注意,如果方法是静态方法参照方法1
        System.out.println(instance);
        System.out.println(variable);
    }
    public void Instance() {
        System.out.println(instance);    //静态变量访问方法1(在自己类的时候),静态常量和静态变量访问相同
        System.out.println(Variable.CONST);
    }
}

1299Java 变量类型

是否可以从一个static方法内部无法对非static方法的调用?

public class Xix {
    // 静态成员 
    public static String string="static成员";
    // 普通成员
    public String string2="非static成员";
    // 静态方法
    public static void method(){
        string="sss";
        //string2="sss";编译报错,因为静态方法里面只能调用静态方法或静态成员
        //method2();
        System.out.println("这是static方法,static方法与对象无关");
    }

    // 普通方法 
    public void method2(){
        string ="string1";
        string2="string2";
        method(); //非静态方法里面可以发出对static方法的调用
        System.out.println("这是非static方法,此方法必须和指定的对象关联起来才起作用");
    }
    public static void main(String[] args) {
        Xix x=new Xix();
        x.method2();// 引用调用普通方法 
        x.method();// 引用调用静态方法
    }
}

运行结果:

这是static方法,static方法与对象无关
这是非static方法,此方法必须和指定的对象关联起来才起作用
这是static方法,static方法与对象无关

结论:

不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部无法对非static方法的调用。

1298Java 变量类型

public class Test {
    public static int staticVar=0;//静态变量,加static关键字
    public int instanceVar=0;//实例变量
    public void VariantTest(){
           staticVar++;
           instanceVar++;
           System.out.println("staticVar"+staticVar+",instanceVar="+instanceVar);
    }
    public static void main(String[] args) {
        for(int k=0;k<6;k++){
            Test p=new Test();
            p.VariantTest();
        }
    }
}

输出结果

staticVar1,instanceVar=1
staticVar2,instanceVar=1
staticVar3,instanceVar=1
staticVar4,instanceVar=1
staticVar5,instanceVar=1
staticVar6,instanceVar=1

结论: 每次创建一个新对象就会分配一个实例变量,而始终只会分配一个静态变量