求大佬!这实现了静态方法访问普通成员方法吗?

来源:8-9 Java 中的 static 使用之静态方法

IEwuIL7

2019-11-19 15:38

public class Staticlearn {

    static int score1 = 66;                //定义静态变量

    static int score2 = 99; 

    public static int sum(){                //定义静态方法

        int sum = score1 + score2;

        return sum; //返回值

    }

    public int show(){

        //System.out.println(sum);  普通成员方法需要会报错

        int show = sum();

        System.out.println(score1);      //普通成员方法可以直接访问静态变量或非静态变量

        return show;

    }

    public static void main(String[] args){

        Staticlearn object = new Staticlearn();        //创建类的对象

        int allScore = object.show();                        //静态方法访问普通成员方法???

        System.out.println(allScore);

    }

}


我梳理了一份序列,求大佬帮我看看是不是对的~

static静态方法

        -静态变量      (直接访问)

        -非静态变量   (创建类的对象访问)

        -静态方法      (直接调用)

        -非静态方法   (创建类的对象访问)

普通成员方法

        -静态变量        (直接访问)

        -非静态变量     (直接访问)

        -静态方法        (通过对象调用)

        -非静态方法    (直接访问)

写回答 关注

3回答

  • IEwuIL7
    2019-11-25 08:57:24

    这是我的测试流程,如果有问题欢迎指出,谢谢大家的帮助( •̀ ω •́ )y

    public class Test{
        static int s1 = 7;
        static int s2 = 9;                    //定义两个静态变量
        int n1 = 5;
        int n2 = 6;                        //定义两个普通变量
        
        public static int Ssum(){
            Smethod();                        //静态方法 直接访问 静态方法 OK
            Ssum();                           //静态方法 直接访问 普通方法 [失败]报错
            int sum1 = s1 + s2;           //静态方法 直接调用 静态变量 OK
            int sum2 = n1 + n2;           //静态方法 直接调用 非静态变量[失败}报错
        }
        
        public static void Smethod(){
            Test smd = new Test();             //创建类的对象
            smd.Nsum();                        //静态方法 通过对象访问 普通方法 OK
            int sum6 = smd.n1 + smd.n2;        //静态方法 通过对象调用 普通变量 OK
        }
        
        public void Nsum(){
            Ssum();                             //普通方法 直接访问 静态方法 OK
            Nmethod();                          //普通方法 直接访问 非静态方法OK
            int sum3 = s1 + s2;                 //普通方法 直接调用 静态变量 OK
            int sum4 = n1 + n2;                 //普通方法 直接调用 非静态变量 OK
        }
        
        public void Nmethod(){
        }
        
        public static void main(String[] args){
        }
    }

    我得出的结论是:

    因为程序优先加载静态,所以静态互相访问和调用OK,此时普通成员还未加载 ,所以报错。

    通过创建类的对象,把普通成员方法加载出来,此时静态访问和调用OK。

    普通成员最后加载,场上所有成员都已出现,所以直接访问OK

  • 慕工程1436538
    2019-11-23 19:40:33

    题主你就没有定义静态方法啊,main函数不算

    IEwuIL...

    原来main函数不算啊,谢谢Thanks♪(・ω・)ノ

    2019-11-25 08:30:20

    共 1 条回复 >

  • qq_书香呃_0
    2019-11-20 12:16:30

    我也是刚入门,对于你所提的,不知我下面的笔记是否能解答! 

    普通成员方法:

    静态变量        (直接访问)

    -非静态变量     (直接访问)

     -静态方法        (直接调用)

     -非静态方法    (通过对象访问)



    /静态方法:

    public static void print() {

    System.out.println("静态方法调用执行==");

    //静态方法可以直接调用同类中的静态成员:

    System.out.println("调用同类中的静态成员:"+ hello);

    //不能直接调用非静态成员:

    //System.out.println("调用静态成员"+ vae);

    //通过对象来调用非静态成员,对象必须是在方法体内创建才有效调用,在方法体外创建的类对象调用非静态成员是无效的

    tesedemo tesed = new tesedemo();

    System.out.println("通过对象调用非静态成员:" + tesed.vae);


    //==================================================================================

    //普通成员的方法中,可以直接访问同类中的  非静态变量与 静态变量:

    public void pel() {

    String huy = "方法体中的非静态变量";

     

    // 普通方法体内调用静态方法是允许的

    print();

    //普通方法可以直接访问同类中的 静态变量

    System.out.println("普通方法访问 静态变量:"+ hello);

    //调用普通方法须通过类的对象调用,在方法体内可直接访问非静态变量

    System.out.println("普通方法访问非 静态变量:"+ huy);

    //调用普通方法须通过类的对象调用

    System.out.println("调用普通方法须通过类的对象调用");

    // 注: 因程序入口"main" 是静态方法,在调用普通方法时必须是对象调用。而定义的静态方法可直接访问方法名


    IEwuIL...

    谢谢回答Thanks♪(・ω・)ノ 我测试了好久,也看了您的代码,我测出来:普通成员方法访问静态方法和非静态方法都是直接访问Ok的

    2019-11-25 08:36:02

    共 1 条回复 >

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530556 学习 · 6091 问题

查看课程

相似问题