java继承 java中继承是如何实现的,当创建子类对象时,也就隐含创建了从父类继承过来的属性和方法的吗?还有静态方法又有什么特殊的吗?大家能谈谈JAVA的继承机制那就更好了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看看 Thinking in JAVA 吧 里边讲的比较详细。 算了,我写点C代码吧,看得懂就看。struct Method{};struct Class{ struct Class* superClass; Method** memberMethodArray; Method** staticMethodArray;};struct Instance{ struct Class* clazz;};Class Object;Class String;String->superClass = &Object;Instance a;a->clazz = &String;... ... 发现怎么都爱钻牛角尖啊。。学Java先学会概念,表老是追究那么深层次实现级别虚拟机的操作那个等吃透J2SE后当兴趣看看也不迟。 继承:定义一个模板,模板包括公有方法和属性,而它的子类只需要继承它,就拥有了父类的方法和属性,而不必重写相同的代码,然后可扩充自己的特殊功能,加入相应方法和属性继承父类的方法和属性,但私有方法和属性除外,extends关键字,子类只能继承一个父类还有就是接口(只声明方法,不实现,也声明final static 变量),用implements关键字实现接口,可以实现多个接口静态方法的特殊性在于调用机制不同,类名.方法名()就可调用普通调用机,new 类名().方法名就可调用 package p1;public class Protected1{ static private Character c = 'a'; static protected void show(){ System.out.println('a'); }}//这是子类package p2;import p1.*;class Protected2 extends Protected1//测试静态的protected方法{ public static void show(){ System.out.println(111); } public static void main(String...args){ Protected1 p1 = new Protected1(); Protected2 p2 = new Protected2(); Protected1.show();//可以访问 Protected2.show();//也可以访问 p2.show();//可以 p1.show();//当show()方法为static protected时就可以这么访问了,如果只是protected类型的就只能用子类对象去访问。 //System.out.println(Protected2.c);私有的成员域无法继承 show(); p2.f(p2);//结果是a p2.f(p1);//结果还是a } public void f(Protected1 p){ p.show();//说明了对于重写了静态方法没有实现多态,不管传进来的p是父类还是子类都会调用参数引用类型的静态方法。 }//所以静态方法在编译时就已经确定了,在运行期不能动态确定调用哪个方法。}//此例子说明了,静态成员可以被继承,但不能重写(上面那个show方法不算是重写,只是从新定义了一个方法。静态方法是编译时就确定的,没有多态)。 你怎么把这发到帖子上来还要让大家给你详细解释下吗?以后有问题了先在群里问问,也就不用浪费你100分了,嘿嘿!package p1;public class Protected1{ static private Character c = 'a'; static protected void show(){ System.out.println('a'); }}//这是子类package p2;import p1.*;class Protected2 extends Protected1//测试静态的protected方法{ public static void show(){ System.out.println(111); } public static void main(String...args){ Protected1 p1 = new Protected1(); Protected2 p2 = new Protected2(); Protected1.show();//可以访问 Protected2.show();//也可以访问 p2.show();//可以 p1.show();//当show()方法为static protected时就可以这么访问了,如果只是protected类型的就只能用子类对象去访问。 //System.out.println(Protected2.c);私有的成员域无法继承 show(); p2.f(p2);//结果是a p2.f(p1);//结果还是a } public void f(Protected1 p){ p.show();//对于重写了静态方法没有实现多态,不管传进来的p是父类还是子类都会调用参数引用类型的静态方法。 }//静态方法在编译时就已经确定了,在运行期不能动态确定调用哪个方法。} 静态方法和class榜定,非静态方法和object绑定 http://lin.wenye1985.blog.163.com/blog/static/786402182009112810133331/看看这个吧。 子类通过关键字extends来继承父类,继承之后子类便拥有父类的方法和属性,当然私有的除外。而静态方法是绑定类的,而普通的方法是需要实例化后的对象才能调用的。 java中继承是使用extends关键字,当子类继承父类时,也就继承了父类的属性和方法。在继承关系中要符合is-a的关系。静态方法可以被继承但是不能覆盖 原因是这样的,静态方法跟其他非静态方法不一样的区别在于静态方法不用NEW一个实例就可以调用的,即它的调用是根据他的类型来判断的,所以我总结一句话就是:静态方法的继承和覆盖是跟着引用类型的,而非静态方法是跟着实例本身的。只要使用this关键字调用就可以了,如果子类继承父类的构造函数和方法,则使用supper关键子,如果父类提供的方法不能实现子类的需求,则子类可以重写父类方法(如果在子类中定义了一个方法,其名称、返回类型、参数列表都与父类中的某个方法的名称、返回类型、参数列表相同,就叫做方法重写),方法重载是方法名相同,参数列表不同(参数的个数,参数的类型不同,与返回值无关)。 静态方法和非静态方法的处理方式其实是一样的,在同一个命名空间中都只有一个方法,方法放在方法区,非静态方法只是比静态方法多一个this的参数而已。不要被java表面的语义所迷惑。对于java的继承机制,其实继承只是类的问题,跟对象没关系,在生产一个类的对象的时候,虚拟机会依次搜索继承树,为对象建立成员属性,即使是私有属性也会建立。而对于方法调用,其实就是直接用对象关联到类再调用方法的,任何方法都是如此,因为方法只有一个,前面说了,非静态方法只是比动态方法多了一个this参数而已。 某一个类中,包含另一个类中的所有属性和方法。父类:含有共用的行为属性和方法。父类中的私有数据和方法不能被子类调用。子类可以定义与父类同名的变量,实现对父类方法的隐藏(也就是说,子类隐藏父类的成员变量只是使之不可见,父类的同名成员变量在子类对象中仍然占有自己独立的内存空间)。子类可以定义与父类同名的方法,实现对父类方法的覆盖(而子类方法对父类同名方法的覆盖将清除父类方法占用的内存,从而使父类方法在子类对象中不存在)。方法的覆盖与成员变量的隐藏的意义:将父类行为和状态改为自身的行为和状态,对外仍保持统一的接口和名字,不失继承性。对于static,需实例化本类的对象,可直接通过类名来调用此方法。静态的代码块:当Java虚拟机加载类时,就会执行该代码块。切记哦,在static中不能使用this和super关键字的。在静态方法中只能直接调用静态成员,不能直接访问非静态成员。不管new多少个对象,static变量在内存中只有一份。 sorry 是无需实例化 少打个字 JAVA Stack问题,求大神解决 字符串问题 怎样解决protected类型的问题? 简单的一个JSP程序怎么在别人电脑(当服务器)发布 请问如何在Eclipse中生成javadoc帮助文档? menu效果 在编译应用程序时有这样一下提示 unix下java编译环境的配置问题 请问如何将double型转换为Object型? 关于 ObjectInputStream 和 ObjectOutputStream 在网络的问题 ? 急急 ! 循环加多个控件 二叉树已知前序序列,后序序列能画出二叉树不??
{
};struct Class
{
struct Class* superClass;
Method** memberMethodArray;
Method** staticMethodArray;
};
struct Instance
{
struct Class* clazz;
};Class Object;
Class String;
String->superClass = &Object;Instance a;
a->clazz = &String;... ...
而不必重写相同的代码,然后可扩充自己的特殊功能,加入相应方法和属性继承父类的方法和属性,但私有方法和属性除外,extends关键字,子类只能继承一个父类
还有就是接口(只声明方法,不实现,也声明final static 变量),用implements关键字实现接口,可以实现多个接口静态方法的特殊性在于调用机制不同,类名.方法名()就可调用
普通调用机,new 类名().方法名就可调用
public class Protected1
{
static private Character c = 'a';
static protected void show(){
System.out.println('a');
}
}//这是子类
package p2;
import p1.*;class Protected2 extends Protected1//测试静态的protected方法
{
public static void show(){
System.out.println(111);
}
public static void main(String...args){
Protected1 p1 = new Protected1();
Protected2 p2 = new Protected2();
Protected1.show();//可以访问
Protected2.show();//也可以访问
p2.show();//可以
p1.show();//当show()方法为static protected时就可以这么访问了,如果只是protected类型的就只能用子类对象去访问。
//System.out.println(Protected2.c);私有的成员域无法继承
show();
p2.f(p2);//结果是a
p2.f(p1);//结果还是a
}
public void f(Protected1 p){
p.show();//说明了对于重写了静态方法没有实现多态,不管传进来的p是父类还是子类都会调用参数引用类型的静态方法。
}//所以静态方法在编译时就已经确定了,在运行期不能动态确定调用哪个方法。
}
//此例子说明了,静态成员可以被继承,但不能重写(上面那个show方法不算是重写,只是从新定义了一个方法。静态方法是编译时就确定的,没有多态)。
以后有问题了先在群里问问,也就不用浪费你100分了,嘿嘿!
package p1;
public class Protected1
{
static private Character c = 'a';
static protected void show(){
System.out.println('a');
}
}//这是子类
package p2;
import p1.*;class Protected2 extends Protected1//测试静态的protected方法
{
public static void show(){
System.out.println(111);
}
public static void main(String...args){
Protected1 p1 = new Protected1();
Protected2 p2 = new Protected2();
Protected1.show();//可以访问
Protected2.show();//也可以访问
p2.show();//可以
p1.show();//当show()方法为static protected时就可以这么访问了,如果只是protected类型的就只能用子类对象去访问。
//System.out.println(Protected2.c);私有的成员域无法继承
show();
p2.f(p2);//结果是a
p2.f(p1);//结果还是a
}
public void f(Protected1 p){
p.show();//对于重写了静态方法没有实现多态,不管传进来的p是父类还是子类都会调用参数引用类型的静态方法。
}//静态方法在编译时就已经确定了,在运行期不能动态确定调用哪个方法。
}
看看这个吧。
静态方法可以被继承但是不能覆盖
原因是这样的,静态方法跟其他非静态方法不一样的区别在于静态方法不用NEW一个实例就可以调用的,即它的调用是根据他的类型来判断的,所以我总结一句话就是:静态方法的继承和覆盖是跟着引用类型的,而非静态方法是跟着实例本身的。只要使用this关键字调用就可以了,如果子类继承父类的构造函数和方法,则使用supper关键子,如果父类提供的方法不能实现子类的需求,则子类可以重写父类方法(如果在子类中定义了一个方法,其名称、返回类型、参数列表都与父类中的某个方法的名称、返回类型、参数列表相同,就叫做方法重写),方法重载是方法名相同,参数列表不同(参数的个数,参数的类型不同,与返回值无关)。
而对于方法调用,其实就是直接用对象关联到类再调用方法的,任何方法都是如此,因为方法只有一个,前面说了,非静态方法只是比动态方法多了一个this参数而已。