1. Java静态方法为什么不能访问非静态方法
非静态方法的是可以直接访问对象的变量的,这意味着,对象的变量不一样,运行这个非静态方法的结果可能就不一样。这是很有意义的,比如我有1块钱(状态),那我就可以买辣条(操作),你有1毛钱,那你就买不到辣条。因为人买辣条的操作需要跟他的钱关联。
静态方法的意义在于不依赖对象的状态,是类所有。静态方法不能访问非静态方法,就是因为静态方法不可以跟对象的状态有关系,而非静态方法是可以跟对象状态产生关联的。
2. 为什么静态函数中不能访问非静态成员而我这代码可以
本来“静态函数中不能访问非静态成员”就是 为了让规则简单而失去了重要的细节,以至于从正确走向错误 的陈述。
缩句:本来“静态函数中不能访问非静态成员”就是错误的陈述。
非静态函数(面向对象中称为“方法”method)以 a.f(blahblah) 的方式调用,其中 a 代表一个对象,方法 f 可以用访问(读取和修改) a 的成员。静态函数通常以 Ty.f(blahblah) 的方式调用,其中 Ty 是类,因为点号的左边没有对象,所以不能访问“根本不存在”的对象的成员。
3. java中为什么静态方法不能访问非静态方法或者变量
因为静态方法是属于类的,而非静态属于对象的,当你用类的方法访问对象的,那么这个对象哪来的?所以无法访问非静态 。
4. java初学,为什么静态的方法不能访问非静态的成员
1、是一种规范啦,构造方法调用构造方法,总要跟调用方法有点区别吧,一个类里面构造方法的名称只能是类名,改变的是他的参数,所以写括号里面(等同于类名(各种参数))(且this只能写在第一行,因为构造方法执行的顺序优先方法);而方法有多个,且名字随便取,这里的this.方法名(),(不是类名哦) this代表了本类的实例对象,等同于类名.方法名();
2、你的第二个问题我回答了好多次了,静态修饰的东西,他是不依赖实例来的,就是你只需要声明了这个对象,他就会先去给静态的开辟空间并且赋值。而非静态的属性,是要依赖实例的,比如你声明了一个对象,没有去new,直接去调用他们里面的属性,一定会报空指针异常。因为你还没有给这个对象开辟空间(用new关键字开辟空间)。
静态的方法只能访问静态的成员这样理解:你声明了对象,你调用静态方法,要使用的就是已经生成的属性(只有静态属性才在声明时就生成了) 而非静态的要new了以后才能生成。这就是你老师说的,静态方法先进来,非静态的后进来(new 了之后再进来)。
非静态的可以访问静态的,因为你能调用非静态的方法,说明你已经实例化这个对象了,就是new了对象,他去调用在new之前就生成了的静态属性,有何不可呢?
5. 为什么静态方法不能访问非静态方法
简单点说:静态成员属于类,不需要生成对象就存在了.而非静态需要生成z对象才产生.
所以静态成员不能直接访问.
下面说说静态的特点:
1.随着类的加载而加载
也就是,说静态会随着类的消失而消失,说明静态的生命周期最长
2.优先于对象的存在
明确一点:静态是先存在的对象是后存在的
3.被所有对象共享
4.可以直接被类名多调用
实例变量和类变量的区别
1.存放位置类变量随着类的加载存在于方法区中,实例变量随着对象的对象的建立存在于堆内存里
2.生命周期类变量生命周期最长,随着“类”的加载而加载,随着类的消失而消失
实例变量随着“对象”的消失而消失
静态的使用注意事项:
1.静态方法只能访问静态成员(包括成员变量和成员方法)
非静态方法可以访问静态也可以访问非静态
2.静态方法中不可以定义this,super关键字
因为静态优先于对象存在,所以静态方法中不可以出现this,super关键字
3.主函数是静态的。静态的利弊利:对
对象的共享数据进行单独空间的存储,节省空间,没有必要没一个对象中都存储一份
可以直接被类名所调用弊:生命周期过长,访问出现局限性(只能访问静态)
6. 静态成员函数为什么不能访问本类中的非静态成员
和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和域运算符“∷”。如 Box∷volume( ); 实际上也允许通过对象名调用静态成员函数,如 a.volume( ); 但这并不意味着此函数是属于对象a的,而只是用a的类型而已。 静态成员函数的作用是为了能处理静态数据成员。 可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。 在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。假如在一个静态成员函数中有以下语句: cout<<height<<endl; //若height已声明为static,则引用本类中的静态成员,合法 cout<<width<<endl; //若width是非静态数据成员,不合法 但是,并不是绝对不能引用本类中的非静态成员,只是不能进行默认访问,因为无法知道应该去找哪个对象。如果一定要引用本类的非静态成员,应该加对象名和成员运算符“.”。如 cout<<a.width<<endl; //引用本类对象a中的非静态成员
7. java中静态方法里可以访问非静态变量吗
不可以的 JAVA中的对应关系为:
静态方法中 只可以访问静态变量,不可以访问非静态变量
8. 为什么静态成员不能访问非静态成员
简单点说:静态成员属于类,不需要生成对象就存在了.而非静态需要生成对象才产生. 所以静态成员不能直接访问. 下面说说静态的特点: 1.随着类的加载而加载 也就是,说静态会随着类的消失而消失,说明静态的生命周期最长 2.优先于对象的存在 明确一点:静态是先存在的对象是后存在的 3.被所有对象共享 4.可以直接被类名多调用 实例变量和类变量的区别 1.存放位置类变量随着类的加载存在于方法区中,实例变量随着对象的对象的建立存在于堆内存里 2.生命周期类变量生命周期最长,随着“类”的加载而加载,随着类的消失而消失 实例变量随着“对象”的消失而消失 静态的使用注意事项: 1.静态方法只能访问静态成员(包括成员变量和成员方法) 非静态方法可以访问静态也可以访问非静态 2.静态方法中不可以定义this,super关键字 因为静态优先于对象存在,所以静态方法中不可以出现this,super关键字 3.主函数是静态的。静态的利弊利:对 对象的共享数据进行单独空间的存储,节省空间,没有必要没一个对象中都存储一份 可以直接被类名所调用弊:生命周期过长,访问出现局限性(只能访问静态)
9. JAVA 里既然静态方法无法调用非静态方法,那主方法main 里面,为什么可以通过对像,来调用非静态方法的呢
非静态成员函数在执行前必须先构造并实例化该函数所在的类。
如果允许非静态的main,那么main函数所在的类必须先进行实例化,
那么就需要再写个函数去实例化main所在的类,再调用main,这个实例化代码又写在哪呢?如果它也是非静态的,岂不是又要写个函数去实例化它所在的类嘛?
因此,java语言就规定了main必须是静态的。