A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

假设有两个类A与B。B没有继承A。
A中有主函数。是不是A中如果再定义其他的方法,因为主函数是静态的,所以其他方法就必须是static修饰的?



B类中的方法可以用static修饰,也可以不用吗?


如果B类中的方法没有用static修饰
A类想要使用B类的方法就是:  B b = new B();    B.方法名();   么?
还是说B类中没有被static修饰的方法,A无法使用?

很多时候定义方法不知道该不该用static。。。。

只知道static可以理解为共享,但不清楚共享是怎么一个共法。。。。

求支援!
谢了!!

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 火速前来技术分+1支援

查看全部评分

8 个回复

倒序浏览
static的话,在程序运行状态,全局只有一个内存空间,大家都可以用,这就是共享
回复 使用道具 举报
本帖最后由 Weix1992 于 2013-11-16 23:08 编辑

答1:主函数是静态的,如果你想不new对象,而直接调用某个属性或者方法,那么调用的属性和方法就必须是静态的,至于为什么是:被static修饰的属性和方法在类一加载的时候就进入了方法区(共享区)内存,这样main方法才能直接调用,如果没有被修饰那么那个方法就在加载类的时候就不在方法去(共享区)内存,main方法不能直接调用。

答2:你的想法是正确的,只要你new B()了自然可以用b里面的方法。如果不new b()那就不能直接用b里面的方法,这是里所当然的,因为你又没继承,从哪找那个方法去呢。如果你想不new b()并且还能调用a中的方法,那么a中的那个方法必须是静态的,就用:类名.方法()这样来调用

评分

参与人数 1技术分 +1 收起 理由
FFF + 1

查看全部评分

回复 使用道具 举报
是不是A中如果再定义其他的方法,因为主函数是静态的,所以其他方法就必须是static修饰的?
答:不是,在A类中,主函数如果调用其他不是static的方法可以  new A().方法名(); 调用。

B类中的方法可以用static修饰,也可以不用吗?
答:在语句中一般不建议使用static,因为它是随着类存在而存在,就是占用内存时间太长。使用时,一般是这个属性或者方法是每个对象都共有的。

如果B类中的方法没有用static修饰 A类想要使用B类的方法就是:  B b = new B();    B.方法名();   么?
答:是的。

B类中没有被static修饰的方法,A无法使用?
答:建立B的对象,利用对象调用非静态方法。

只知道static可以理解为共享,但不清楚共享是怎么一个共法。
答:共享的理解就是........ 这个东西可以被每个 建立的对象都使用。
例如:每个新生儿都有一个共享的方法“哭”
哭这个东西可以被每个 新出生的儿童都使用,那么这个哭就可以用static修饰
每个新生儿都应该有名字
名字这个东西可以被每个 新出生的儿童都使用么?答案是不可以的,一个新生儿叫李四,别的新生儿童能都叫李四么,显然是不能的,所以就不可以被static修饰。就是这么道理。

具体还是多看两遍毕姥爷视频就OK了。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
首先要搞懂先后顺序,static是随着类的加载而加载的并被放在了方法区(共享区)。而实例变量是在new出来一个对象时才被存放在对内存中。根据先来后到,被static修饰的方法或变量,比实例变量或方法早出现。所以先出现的不能调用后出现的,因为后边的还没有出现相当于没有这个变量或方法会报错,后出现的可以调用前面的,因为后面的都存在了前面的更不用说。只要该方法中没有调用实例变量都可以加上static。
关于共享可以理解为,所有的对象所拥有的共性把它抽取出来,单独放在一个区域(共享区),都可以调用共享如,我们的国籍用静态修饰,黑马每一期的学员的学校用静态修饰,属于黑马程序员。你自己慢慢理解一下,再看看视频估计就没问题了。。。。
回复 使用道具 举报
本帖最后由 com_heima 于 2013-11-16 23:41 编辑

你理解的不对。static 随着类的加载而加载,类在了static就在了,但其他方法没有加载到内存。所以不能掉其他方法,并不是说主函数有main方法,所以主函数的其他方法也必须是static的,而是因为调用方便,主函数的其他方法也可以是非static的。只需要用该类对象调用即可。
class MainDemo{
    public static void main(String[] args){
        new MainDemo().show();
    }
    void show(){}
}

这样就可以。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
你可以这样理解,static在类加载的同时也加载,静态方法不用new就可以直接调用,如果是实例方法,则必须要new一个对象才能进行调用。
给个例子
static调用
  1. class A {
  2.     int x = 1;         
  3.     class B {
  4.             int x = 2;         
  5.             void func() {
  6.             int x = 3;
  7.             System.out.println(A.this.x+ "," + B.this.x + "," + x);
  8.             //内部非静态类中可以随意访问外部类的各个成员变量或成员函数。通过创建类的对象来访问实例变量
  9.             //如果内部类B为静态,则输出语句应为“System.out.println(new A().x+ "," + new B().x + "," + x);”
  10.         }
  11.     }//内部类
  12. }//外边类
复制代码

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 例子都带上了,不给技术分也不行啊!.

查看全部评分

回复 使用道具 举报
public class Object_Static {
                public static void main(String[] args) {
                        Person p=new Person();
                        Person d=new Person();
                        p.name="小李";
                        d.name="小王";//可以打印看到小李和小王后面都有带美国,这就叫共享
                        p.show();       
                       
                        System.out.println(Person.country);        //直接被类名调用
                }
}
class Person2{
        String name;                //成员变量,实例变量
        static        String country="美国";                //静态的成员变量,类变量
        public  void show(){
                System.out.println(name+"来自"+country);
        }
}

写得很清楚了 主要2个功能一定要记得 共享数据 直接类名调用 红字标出了

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 先森、您的技术分堵车。现在才到~.

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马