假设:
class Parent{
public Parent(){};
//静态的方法:被测试能否覆写
public static test(){
System.out.println("Parent的静态方法");
}
}
class Child extends Parent{
public Child(){};
//静态的方法:测试能否覆写其父类的静态方法
public static test(){
System.out.println(" Child的静态方法");
}
}
我所知道的:
1.static方法在JVM类加载时便存在,先与对象存在于内存中
2.当Child对象创建时会先创建Parent对象(而此时父类中的test()方法已经存在了)
2.1 这时接着创建Child对象前,(test()方法已存在)
疑问:
1.是否static方法在类加载分配空间时,当出现了相同的方法名,或者属性名,就只存储先出现的,后面的就不进行存储了?
2.还是,都存储了,只是因为多态的关系,当父类调用test()时,只会去调用其类中的?
一,java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏.
二,原因:
1, 静态方法和属性是属于类的,调用的时候直接通过类名;方法名完成对,不需要继承机制即可以调用;
(1)如果子类里面定义了静态方法和属性,则这时候父类的静态方法或属性称之为"隐藏";
(2)如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成,至于是否继承,子类是有继承静态方法和属性,但是跟实例方法和属性不太一样,存在"隐藏"的这种情况。;
2, 多态之所以能够实现依赖于继承、接口和重写、重载(继承和重写最为关键),有了继承和重写就可以实现父类的引用指向不同子类的对象;
3,重写的功能是:"重写"后子类的优先级要高于父类的优先级,但是“隐藏”是没有这个优先级之分的。
4, 静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能被重写,因此不能实现多态,不能实现父类的引用可以指向不同子类的对象。
5,非静态方法可以被继承和重写,因此可以实现多态。
因为没有这个需求。你的理解本末倒置。如果我们需要这样的语法,就算现有的jvm有局限,jvm就不能改么?重写派生类的方法的目的是为了实现在不修改原有代码的情况下对类的功能进行扩展和自定义。
静态方法相当于全局的方法,不存在这种需要。
static跟多态没有关系
可能是我没表达清楚,不好意思(⊙﹏⊙)b
我的主要意思是:
1.static创建后会被jvm分配到哪一个空间呢?(debug发现找不到)
2.调用对象中的static方法时是直接指向了存储static空间中的方法吗?
2.1 那么不同类中的相同的static方法(类型、命名、参数完全一样)是怎么存储的呢,以至于不同对象调用时没有混淆
不会JAVA,随便答一下,有问题的话楼下请指正:
1. 不知道哪一个空间,应该是一个全局内存区;
2. 是的;
2.1 C++里面是有限定符的,比如说class A; A::static_func(); 这里的限定符应该是类似命名空间一样的东西吧。
这个和JVM加载顺序有关,静态的是类层面的,在生成对象之前加载。
而多态的核心思想是动态绑定,就是在运行时时才知道是运行哪个具体类的实例的方法。
你这样没什么意义
1.static创建后会被jvm分配到哪一个空间呢?(debug发现找不到)
2.调用对象中的static方法时是直接指向了存储static空间中的方法吗?
2.1 那么不同类中的相同的static方法(类型、命名、参数完全一样)是怎么存储的呢,以至于不同对象调用时没有混淆
==》 去看jvm原理和类加载机制。自己想是没用的
static 是个静态方法,他只能被调用一次,第二次调用时会跳过这个方法
static,静态的程序加载时执行一次