Java变量与方法的调用:同类操作中与跨类操作中的对比

变量与方法的调用

很多同志对Java中同一类和跨类的变量与方法调用不甚理解。今天让我们通过代码实例学习一下。


先上结论

在一个类中操作时

  1. 静态方法可以直接调用静态变量、静态方法。
  2. 初始化对象Object后在静态方法中可以通过Object.name调用非静态变量、非静态方法
  3. 非静态方法可以直接调用静态变量、静态方法和非静态变量、非静态方法。

跨类操作时

  1. 静态方法可以通过类名.变量名或者类名.方法名调用静态变量、静态方法。
  2. 初始化对象后静态方法可以通过对象名.变量名或者对象名.方法名调用非静态变量、非静态方法
  3. 非静态方法可以通过类名.变量名或者类名.方法名用静态变量、静态方法。
  4. 初始化对象后非静态方法可以通过对象名.变量名或者对象名.方法名调用非静态变量、非静态方法

合并总结

  1. 无论什么情况下,静态方法调用非静态成分都需要先初始化对象,用对象操作类;
  2. 无论什么情况下,静态方法和非静态方法都可以通过类名.变量名(调用变量)或类名.方法名(调用方法)调用静态成分;
  3. 原因:静态成员是属于类的,和类一起加载(等于说类存在时static静态方法就已然存在)。非静态成员属于对象,在对象初始化以后才存在。因此静态方法调用非静态成员相当于一个已经存在的事物调用一个不存在事物,因此会报错。只有对象初始化以后才可通过对象去调用。

下列代码创建了两个类Demo01和Demo02用来测试同类中内部静态方法、非静态方法对于静态变量、非静态变量的调用 以及跨类操作时Demo02类对Demo01类中的静态变量、非静态变量的调用。

/**
 * @ClassName demo01
 * @Description 主要是验证Demo01类内部静态方法、非静态方法对于静态变量、非静态变量的调用。
 * @Author ${17368877923}
 * @Date 2021/5/26 21:01
 * @Version 1.0
 **/
public class Demo01 {
    /**静态变量a */
    static String a = "静态变量a";
    /**非静态变量c */
    String c = "非静态变量c";
    /**main静态方法*/
    public static void main(String[] args) {
        String b = "静态变量b";
        method1();
        /*main静态方法调用非静态方法method2 */
        //method2()报错,未初始化;
        /*初始化后main方法可以调用同类中的非静态方法method2*/
        Demo01 demo01 = new Demo01();
        //已初始化对象demo01
        demo01.method2();
        /*静态方法main调用同类中的静态方法method01 */
        method1();        //直接method();即可调用
        Demo01.method1(); //Class.method()也可调用
        /*静态方法main调用同类中的非静态方法method02 */
        //method2();报错
        demo01.method2();//初始化后object.method即可调用

    }
    /**静态方法method1*/
    public static void method1(){
        /*静态方法method1调用同类中的静态变量a */
        System.out.println("静态方法method1调用同类中的静态变量a:"+ a);
        System.out.println("静态方法method1调用同类中的静态变量a:"+ Demo01.a);
        /*静态方法method1调用同类中的非静态变量c */
        //System.out.println(c)报错,未初始化;
        //System.out.println(Demo01.c)也报错,未初始化;
        /*初始化后静态方法可以调用同类中的非静态变量c*/
        Demo01 demo01 = new Demo01();
        System.out.println("初始化后静态方法method1可以调用同类中的非静态变量c:"+ demo01.c);
    }
    /**非静态方法method2 */
    public void method2(){
        /*非静态方法method2调用同类中的静态变量a */
        System.out.println("非静态方法method2调用同类中的静态变量a:" + a);
        System.out.println("非静态方法method2调用同类中的静态变量a:" + Demo01.a);
        /*非静态方法method2调用同类中的非静态变量c *///可以直接调用非静态变量名
        System.out.println("非静态方法method2调用同类中的非静态变量c:" + c);
        /** System.out.println("非静态方法method2调用同类中的非静态变量c:" + Demo01.c);报错 因为静态方法是属于类的,
        动态方法属于实例对象,在类加载的时候就会分配内存,可以 通过类名直接去访问,
        非静态成员(变量和方法)属于类的对象,所以只有该对象初始化之后才存在,然后通过类的对象去访问。
        System.out.println("非静态方法method2调用同类中的非静态变量c:" + demo01.c);*/
        /*非静态方法method2调用同类中的静态方法method1 */
        method1(); //直接methodName()即可调用
        Demo01.method1(); //Class.method()也可调用
        /*非静态方法method2调用同类中的非静态方法method3 */
        method3();//同类中非静态方法调用非静态方法直接methodName();即可

    }
    /**非静态方法method3 */
    public void method3(){
        System.out.println(c);
        System.out.println("/**非静态方法method3 */");


    }
}
/**
 * @ClassName demo01
 * @Description 第二个类Demo02 用于进行跨类调用操作。主要是验证Demo02类对Demo01类中的静态变量、非静态变量的调用。 
 * @Author ${17368877923}
 * @Date 2021/5/26 21:01
 * @Version 1.0
 **/
class Demo02{
    /**非静态变量d */
    String d = "Demo02的非静态变量d";
    /**静态变量e */
    static String e = "Demo02中的静态变量e";
    public static void main(String[] args) {
        /*Demo02类中静态方法调用Demo01类中的静态变量a */
        System.out.println(Demo01.a);
        /*Demo02类中静态方法调用Demo01类中的非静态变量c */
        //System.out.println(Demo01.c);报错
        /*初始化后静态方法通过初始化的对象可以调用类Demo01中的非静态变量c*/
        Demo01 demo01two = new Demo01();
        System.out.println(demo01two.c);

        /*类Demo02中静态方法调用类Demo01的静态方法method01 */
        Demo01.method1();//可见不同类中静态方法互相调用可以直接 class.method调用;
        /*类Demo02中静态方法调用类Demo01的非静态方法method02 */
        //demo01.method02();报错因为跨类以后要重新初始化
        /*前面已经初始化了对象demo01two*/
        demo01two.method2();//重新初始化以后object.className()即可;

    }
    /**非静态方法methodOne */
    public void methodOne(){
        /*Demo02类中非静态方法methodOne调用Demo01类中的静态变量a */
        System.out.println(Demo01.a);
        /*Demo02类中非静态方法methodOne调用Demo01类中的非静态变量c*/
        //System.out.println(c)报错
        /*初始化后非静态方法通过初始化的对象可以调用类Demo01中的非静态变量c*/
        Demo01 demo01three = new Demo01();
        System.out.println(demo01three.c);

        /*类Demo02中非静态方法调用类Demo01的静态方法method01 */
        Demo01.method1();//Class.methodName()即可
        /*类Demo02中非静态方法调用类Demo01的非静态方法method03 */
        //Demo01.method3()报错
        demo01three.method3();//初始化后object.methodName可以调用

    }
}

运行结果为:

静态方法method1调用同类中的静态变量a:静态变量a
静态方法method1调用同类中的静态变量a:静态变量a
初始化后静态方法method1可以调用同类中的非静态变量c:非静态变量c
非静态方法method2调用同类中的静态变量a:静态变量a
非静态方法method2调用同类中的静态变量a:静态变量a
非静态方法method2调用同类中的非静态变量c:非静态变量c
静态方法method1调用同类中的静态变量a:静态变量a
静态方法method1调用同类中的静态变量a:静态变量a
初始化后静态方法method1可以调用同类中的非静态变量c:非静态变量c
静态方法method1调用同类中的静态变量a:静态变量a
静态方法method1调用同类中的静态变量a:静态变量a
初始化后静态方法method1可以调用同类中的非静态变量c:非静态变量c
非静态变量c
/**非静态方法method3 */
静态方法method1调用同类中的静态变量a:静态变量a
静态方法method1调用同类中的静态变量a:静态变量a
初始化后静态方法method1可以调用同类中的非静态变量c:非静态变量c
静态方法method1调用同类中的静态变量a:静态变量a
静态方法method1调用同类中的静态变量a:静态变量a
初始化后静态方法method1可以调用同类中的非静态变量c:非静态变量c
非静态方法method2调用同类中的静态变量a:静态变量a
非静态方法method2调用同类中的静态变量a:静态变量a
非静态方法method2调用同类中的非静态变量c:非静态变量c
静态方法method1调用同类中的静态变量a:静态变量a
静态方法method1调用同类中的静态变量a:静态变量a
初始化后静态方法method1可以调用同类中的非静态变量c:非静态变量c
静态方法method1调用同类中的静态变量a:静态变量a
静态方法method1调用同类中的静态变量a:静态变量a
初始化后静态方法method1可以调用同类中的非静态变量c:非静态变量c
非静态变量c
/**非静态方法method3 */

你可能感兴趣的:(Java从零学起,java,面向对象编程,类,intellij,idea,算法)