静态方法中可不可以定义非静态

如题所述

使用static修饰的静态方法是属于整个类的类方法,它在内存中的代码段会随类的定义而被分配和装载;而非静态方法是属于具体对象的方法,当这个对 象创建时,在对象的内存中会拥有此方法的专用代码段。在引用静态方法时,可以使用对象名加前缀,也可以使用类名加前缀。eg. classA 实例化了一个对象objectA,
classA中定义了一个静态方法:run( ). 则可使用 classA.run( ) 或者objectA.run( )来执行。

非静态方法既可以访问静态数据成员 又可以访问非静态数据成员,而静态方法只能访问静态数据成员;同样地非静态方法既可以访问静态方法又可以访问非静态方法,而静态方法只能访问静态数据方法。特别注意的是静态方法中的main方法,它作为程序运行的入口点,在每个程序中有且只能有一个。
例如:
public class Person{
public int age;
public static double height;
public static String Address(String x){
System.out.println("address:"+x);
}
public int Birthday(int x){
System.out.println("birthday is "+x+" month");
}
public static void main(String[] args){//静态方法
age=24; //引用了非静态数据成员
height=173;
Address("xi'an");
Birthday(5); //引用了非静态方法
}
}
编译时,就会出现无法从静态上下文中引用非静态变量age和非静态方法Birthday(int)的错误。

还有一点就是静态方法不能被覆盖,有一个形象的例子引自http://blog.csdn.net/rujiao/archive/2009/01/13/3764115.aspx
首先我们提供两个类,基类为Parent,派生类为Child。在Parent中我们提供两个方法,一个是静态方法staticMethod(),一个是非静态方法nonStaticMethod()。在Child类中我们覆盖着两个方法。
class Parent
{
public void nonStaticMethod()
{
System.out.println("parent's Non-Static Method is Called");
}

public static void staticMethod()
{
System.out.println("parent's static method is called");
}
}

class Child extends Parent
{
public void nonStaticMethod()
{
System.out.println("child's non-static method is called");
}

public static void staticMethod()
{
System.out.println("child's static method is called");
}

}
在Test类中我们分别使用Parent p1 = new Parent(),Parent p2 = new Child(),Child c = new Child()得到三个实例,并分别调用静态方法和非静态方法,我们来看程序的运行结果
public class Test
{
public static void main(String args[])
{
Parent p1 = new Parent();
Parent p2 = new Child();
Child c = new Child();
System.out.print("parent.static: "); Parent.staticMethod();
System.out.print("p1.static: "); p1.staticMethod();
System.out.print("p2.static: "); p2.staticMethod();
System.out.print("p1.nonStatic: "); p1.nonStaticMethod();
System.out.print("p2.nonStatic: "); p2.nonStaticMethod();
System.out.print("Child.static: "); Child.staticMethod();
System.out.print("c.static: "); c.staticMethod();
System.out.print("c.nonStatic: "); c.nonStaticMethod();
}

}
程序的运行结果为:
Parent.static: parent's static method is called
p1.static: parent's static method is called
p2.static: parent's static method is called
p1.nonStatic: Parent's Non-Static Method is Called
p2.nonStatic: child's non-static method is called
Child.static: child's static method is called
c.static: child's static method is called
c.nonStatic: child's non-static method is called
值得注重的是p2实际上是一个Child的类型的引用,然而在调用静态方法的时候,它执行的却是父类的静态方法,而不是Child的静态方法,而调用 p2的非静态方法的时候执行的是Child的非静态方法,为什么呢?原因是静态方法是在编译的时候把静态方法和类的引用类型进行匹配,而不是在运行的时候 和类引用进行匹配。因此我们得出结论:当我们在子类中创建的静态方法,它并不会覆盖父类中相同名字的静态方法。
温馨提示:内容为网友见解,仅供参考
无其他回答

java为什么不能在静态方法中使用非静态变量
静态方法是不用创建对象就直接调用,所以在静态方法中没有this指针,不能访问所属类的非静态变量和方法,只能访问方法体内的局部变量、自己的参数和静态变量,而非静态变量是给一个类的实例化对象调用的,一个是类调用,一个是类对象调用,所有在静态方法中是不能使用非静态变量的。实例:上面出错的原因...

静态方法中不能有非静态方法?
是的,同时,静态方法也不能调用非静态方法的。因为:1、静态方法的内存分配时间与实例方法不同,当程序开始运行时,静态方法已经在内存中被分配了空间,有了入口地址,所以可以通过"类名.方法名"直接调用。2、实例方法只有在创建了该类的对象以后才分配内存。也就是说程序开始运行后静态方法已经有了入口地...

java无法从静态上下文引用非静态方法
静态方法可以在没有创建实例的情况下使用,这是因为它们与特定类相关联,而不是特定的实例。与此相反,非静态方法和非静态变量是与特定对象实例相关联的,只有在对象实例创建后才能访问。具体来说,当我们在静态方法中尝试引用非静态成员变量时,编译器会抛出错误,原因是静态方法没有对象实例可供引用非静...

静态内部类中可以定义非静态成员吗?为什么?
可以定义,因为,静态内部类也是一个类,类里面可以定义静态成员,也可以定义非静态成员。对于 在静态内部类里面的静态成员和非静态成员的区别在于:静态内部类的非静态成员可以访问外部类的静态变量,而静态成员则不可以。

JAVA中 在static方法内部能否调用非静态方法?
static方法内部不能直接调用非静态方法,可以在调用之前实例化非静态方法所在的类,再用类点方法来调用。例:非静态方法是className类里面的method();className cn=new className();cn.method();这样就可以了。希望能帮助你。

...非静态的方法,反过来非静态类中能不能有静态方法?最好举例说明。_百...
静态类不能有非静态的方法,例如Sytem.Console里面都是静态方法,非静态类可以有静态方法,例如String类有静态方法Format和Join,同时也有非静态方法IndexOf。软糖的答案满意吗,请及时采纳谢谢~

“无法从静态上下文中引用非静态方法”这个问题怎么解决?
静态方法中不能直接调用非静态方法。因为非静态方法不是独立存在的,它是依附于对象存在——即只有申明了对象,才能通过对象调用。而静态方法则可以直接通过类名调用,而不需要申明对象。因此直接引用非静态方法就会出错。比如常见的main方法都是静态的,必须由static修饰,因此在main方法里调用类的其他非静态...

错误: 无法从静态上下文中引用非静态方法
静态方法中不能引用非静态变量 静态方法中不能引用非静态变量 静态方法中不能引用非静态变量 静态方法可以通过所在类直接调用而不需要实例化对象,非静态成员变量则是一个对象的属性。它只有在有实例化对象时才存在的,所以在静态方法中是不可以调用静态变量。如果发生调用,则编译器会报出如上的错...

安卓编程:无法从静态上下文中引用非静态 方法
静态的static属于类的,可以直接用ClassName.xxx引用。类的class字节码文件一加载到内存中就可以用了,但是非静态的non-static是属于对象的,必须用类申明了对象obj,才能用对象obj引用obj.xx。你在静态方法里引用非静态的方法,当然不行了,这个时候实例对象都无,怎么引用?要么声明对象,通过对象引用;...

为什么静态方法不可以直接new 一个 非静态内部类 的 对象,还得加上外部...
非静态方法和属性是可以访问和实例化静态和非静态内部类的 静态方法和属性是不可以访问和实例化非静态内部类的,但是可以访问和实例化静态内部类 如果内部类是静态(static 修饰),那么内部类中是不能访问外部类非静态属性和方法的,反之则能访问 静态内部类:是可以被独立实例化的,而不依赖外部类实例化...

相似回答