我觉得楼主换个角度去想一下可能会更容易接受!
A.method()跟他的子类B.method()你看调用上就知道了!
是用类名去调用!因为静态的方法是属于类的!所以继承当然无法覆盖呀!
至于继承静态方法这句话是有点问题!
具体怎么去理解就看各人的角度啦!
只要理解就行,如果要知道个所以然的话,那你可得把java去仔细研究一下!
说不定到时候一个系统级人物就旦生啦!
呵呵!
A.method()跟他的子类B.method()你看调用上就知道了!
是用类名去调用!因为静态的方法是属于类的!所以继承当然无法覆盖呀!
至于继承静态方法这句话是有点问题!
具体怎么去理解就看各人的角度啦!
只要理解就行,如果要知道个所以然的话,那你可得把java去仔细研究一下!
说不定到时候一个系统级人物就旦生啦!
呵呵!
也是因为他是属于一个类的.子类不能覆盖static方法,在调用的时候也是调用父类的static的方法.
呵呵.看你的理解了
class UpClass
{
private static void hello(String input)
{
System.out.println("UpClass: "+input);
}
public static void main(String[] args)
{
//StaticExtends se = new StaticExtends();
UpClass.hello("ni hao");
}
}
#########################################################这样可以编译运行public class StaticExtends extends UpClass
{
/*
static void hello(String input)
{
System.out.println("subClass: "+input);
}
*/
public static void main(String[] args)
{
//StaticExtends se = new StaticExtends();
//StaticExtends.hello("ni hao");
UpClass upclass = new UpClass();
upclass.hello("ni hao");
}
}###############################################
编译报错,称该方法的访控制声明为private,但是我用的是父类的实例对象阿??WHY
子类只能访问父类中声明为public和protected成员,这是java机制了
UpClass upclass = new UpClass();
然后用它来调用hello()
upclass.hello("ni hao");我的理解是:
这就好我是一家连锁银号的老板(UpClass),现在我印制了一种银号专用的支票(hello是private),我在自己的总行(UpClass内)用这个支票(在UpClass里用hello()),没问题,系统给钱了(输出信息),
接着我开了另一家银号(在StaticExtends类的main方法里new 一个UpClass),
我靠,他说:这是UpClass银号专用支票,可是他TMD就是我的分号阿,不认我了现在我问的是,JAVA规定的这家银号的机制是什么,为什么自己的实例对象访问自己的方法(就算是私有的),都不能编译通过
为什么自己的实例对象访问自己的方法(就算是私有的),都不能编译通过?
原因就是因为它是私有的啊!!!就像你的例子,你是在StaticExtends调用,这就是在外部了,当然不能通过了
还有,类方法(static声明)跟实例对象没有关系,它是这个类的所有对象共享的,在内存中占同一个位置
也就是说,如果你写了一个private方法,在类中不使用它,就和没有写这个方法一样(在外界反正不能用),区别大概就是你真的调用了,会报错而已??
Right??
也就是说,如果你写了一个private方法,在类中不使用它,就和没有写这个方法一样(在外界反正不能用),区别大概就是你真的调用了,会报错而已??
Right??-----------------------------
对了,当然,你写一个不使用的private方法是没有任何意义的,建议还是找本介绍OOP的书认真看看
——没覆盖也没继承,子类存有指向父类的引用对于private
——该方法或属性只能在该类内使用
你最后说的很对,在写java程序的时候只在类内部调用的方法定义为
private的是个很好的编程习惯。另外子类的static方法和父类有同名、
同参数的static方法,但他们之间没什么覆盖、继承的关系,你调用的
时候看是用那个类名引用了,用子类的类名就调用子类的static方法,
用父类类名就调用父类的static方法。
用StaticExtends se = new StaticExtends();来子类对象调用的结果
StaticExtends.java:28: hello(java.lang.String) has private access in person.fane
.test.UpClass
se.hello("ni hao");
^
1 error
事实证明,子类在调用方法的时候找不到方法都会上朔到父类去找方法哈哈,StarCraft去先,private的假设待续.....
public class StaticExtends extends UpClass
{
private static void hello(String input)
{
System.out.println("subClass: "+input);
}
public static void main(String[] args)
{
StaticExtends.hello("ni hao");
UpClass.hello("ni hao");
}
}class UpClass
{
static void hello(String input)
{
System.out.println("UpClass: "+input);
}
}
cannot override hello(java.lang.String) in person.fane.test.UpClass; attempting
to assign weaker access privileges; was package
private static void hello(String input)
^呵呵,如果没有继承的话,那么即使写了也因该没错的,StaticExtends和UpClass各自调用自己的方法只能说这里的继承还是有待研究
static是静态的。特点是在类被装载时最先开辟内存空间,而且无论类被实例化多少次都只开辟一次内存空间。他本身与能否继承没有关系。就是说static的成员与其他成员一样被继承或重写。
如果父类先被实例化,子类后被实例化的话。在父类被实例化时会按照父类的static成员开辟内存空间。而子类被实例化的时候会按照子类的static成员开辟内存空间。无论是否被覆盖,过程都是一样的。
private只要记住他只能在类内使用就可以了。任何被定义为private的成员都只能在所在类内部使用。还要记得class只能用public和默认的来修饰,不能用private修饰(这个好象没必要说)
希望能再看到高人的指点。
static方法是不能被继承的,子类就算覆写了本质上还是使用父类的
static方法一样可以被继承的。
public class Test extends SupTest
{
static void hello(String msg){
System.out.println("sub :"+msg);
}
public static void main(String[] args){
Test test=new Test();
test.hello("sub instance Hello");
Test.hello("sub class hello");
SupTest.hello("parent Hello");
}
};class SupTest
{
static void hello(String msg){
System.out.println("sup:"+msg);
}
};
以上代码在jdk1.4.1下编译通过,没有任何问题。
运行结果:
sub:sub instance Hello
sub:sub class hello
sup:parent Hello
当然,超类的静态方法如果是私有当然就不能继承了。
在非private时,这个比较好理解,
但是碰到private方法的时候,子类中其实有这个方法,只是访问时会报错,提示private访问控制(上文已提到),如果子类重写了该方法,由于在父类中该方法为private,所以无论用什么修饰符都不会出错,因为父类中已经是private了,我重写为public或其他不会有影响,也就是表现出了子类没有继承到private方法的现象,java中不允许子类降低父类方法的访问控制(把父类的public方法该为protected或更低),估计就是由于这种机制的原因。
代码区:存放程序指令
全局数据区:存放全局和static之类的静态变量。他在程序运行生命期内都存在
栈:存放局部变量,如方法内部声明的变量
堆:用new 分配的内存。如创建一个类的实例。2,static只能说明方法的内存位置。3,OOP的重要思想就是继承。如果基类有这个方法,不管是static或是其它类型的,子类都拥有。但子类能否调用该方法,要看这个方法所处的是 private,public,protected,或是程序语言的其具体规范。
父类的静态方法。这个嘛,可以说是继承得来,也可以说是不是继承,关键看
继承的定义了。所以不用太关心是否是继承,要关心的在于,使用子类类名或者实例变量
调用时会有什么影响。
假设原先程序里用子类类名或者实例变量调用了父类的静态方法。
后来子类里声明了一个同名静态方法,那么程序的行为就有可能变化。另外关于十年等待的那个银行的例子。如果声明成private,当然那个支票
连分行都不能使用。但是,别忘了还有protected关键字,如果需要分行也能
使用,当然应该将private改成protected。
绝对私有也是有必要的。所以那个例子不好啦。
不同于其他实例变量和方法,static 修饰,是不可以覆盖的,个用个的!
public class Hello extends test
{
public static void main(String augs[])
{
Hello a = new Hello();
a.method();
} //static void method()
//{
// System.out.println("sub's method!");
// }
}
class test
{
static void method()
{
System.out.println("super's method!");
}
}
编译通过,result:super's method! 去掉sub class里的注释,result:sub's method!
结论:子类可以继承父类的static方法,覆盖亦可!
class a extends b{....} 如果a中未定义的方法x()在b中定义了,并且可通过a的引用调用x(),那么就说明a继承了b的x()。
如果这么说的话,static方法的确可被继承。
那么static方法可被覆写吗?
class UpClass
{
static void hello(String input)
{
System.out.println("UpClass: "+input);
}
}public class StaticExtends extends UpClass
{
static void hello(String input)
{
System.out.println("subClass: "+input);
}
public static void main(String[] args)
{
StaticExtends.hello("ni hao");
UpClass.hello("ni hao");
UpClass up=new StaticExtends(); //向上转型至父类接口
up.hello("??"); //调用父类static void hello(); //向下转型为子类接口
((StaticExtends)up).hello("??");//调用子类static void hello();
}
}结果证明,static并没有后期绑定,只是单纯的根据类引用来判断执行哪个类中的方法。所以,static无法被覆写。
http://www.54bk.com/more.asp?name=yanguang&id=3064