Java子类继承父类时也继承父类的静态函数吗 5
现在的问题是,如果子类与父类有一个同名同参同返回值的静态函数,那么这时Java会认为是重写(override),可是,静态函数是不允许重写的,那么这岂不是矛盾了吗???代...
现在的问题是,如果子类与父类有一个同名同参同返回值的静态函数,那么这时Java会认为是重写(override),可是,静态函数是不允许重写的,那么这岂不是矛盾了吗???
代码实例:
public class A
{
public static void print()
{
System.out.println(">>>>>>>>>>>>A");
}
public void f()
{
System.out.println(">>>>>>>>>>>>f");
}
}
public class B extends A
{
//这个函数不算覆盖吗, 从形式上看是覆盖了父类的print()
//如果不算覆盖的话,那么子类与父类拥有相同的函数算什么?
//如果B继承A的静态函数print.自己又定义了一个相同的,不矛盾吗?
//如果算覆盖的话,而静态函数是不允许覆盖的,这不矛盾了吗?
public static void print()
{
System.out.println(">>>>>>>>>>>>B");
}
public void f() //这个是正宗的对父类函数的覆盖,与上面的函数只差一个static
{
System.out.println(">>>>>>>>>>>>ff");
}
} 展开
代码实例:
public class A
{
public static void print()
{
System.out.println(">>>>>>>>>>>>A");
}
public void f()
{
System.out.println(">>>>>>>>>>>>f");
}
}
public class B extends A
{
//这个函数不算覆盖吗, 从形式上看是覆盖了父类的print()
//如果不算覆盖的话,那么子类与父类拥有相同的函数算什么?
//如果B继承A的静态函数print.自己又定义了一个相同的,不矛盾吗?
//如果算覆盖的话,而静态函数是不允许覆盖的,这不矛盾了吗?
public static void print()
{
System.out.println(">>>>>>>>>>>>B");
}
public void f() //这个是正宗的对父类函数的覆盖,与上面的函数只差一个static
{
System.out.println(">>>>>>>>>>>>ff");
}
} 展开
展开全部
其实楼主只要理解static修饰的成员在内存中的分配情况就能理解;
以楼主代码为例:
1.首先声明一点: Static修饰的变量/函数优行于该类对象存在; 随着类的加载而加载,而这时还不需要对象; 这也是静态代码可用类名. 出来的原来;
2.理解以上就可推断出很多;eg:
2.1 假设有B b=new B();
则这时因为继承的关系,会一直调用到A的构造方法。这样就会把A,B中两个print()都加入进方法区, 但A的print()方法在A对应的区域,B的print方法在B中对应的区域;
此时我们用b,print()调用的是B中的print();
2.2 假设有A a=new B();
此时因为编译器在编译时认为a的类型是A,所以调用的是A中的print();
//这也是父类对象不能调用子类对象的特有方法的原因.。
而在运行时, jvm会发现a的真实类型是B,所以a可向下转型为B类型;这时就可以调用子类特有方法
//这也是为什么可以向下转型,
但对没握告于静态成员,不管在编译时还是运行时,父类对象都不能调用子类特有的静态方法;
而子类可以继承父类非private的static成员,子类也有自己特有静态枯明方法,但这个名字和父类一样.也就是说其实子类同时有两个静态方法;但这两个方法不在同一区域内,所以不存在同名的冲突。只是子皮塌类的静态方法屏蔽了父类的静态方法;你可以把静态方法看成子类对象特有的方法。
其实B对象中也可访问A类中的print(),修改代码即可;
以楼主代码为例:
1.首先声明一点: Static修饰的变量/函数优行于该类对象存在; 随着类的加载而加载,而这时还不需要对象; 这也是静态代码可用类名. 出来的原来;
2.理解以上就可推断出很多;eg:
2.1 假设有B b=new B();
则这时因为继承的关系,会一直调用到A的构造方法。这样就会把A,B中两个print()都加入进方法区, 但A的print()方法在A对应的区域,B的print方法在B中对应的区域;
此时我们用b,print()调用的是B中的print();
2.2 假设有A a=new B();
此时因为编译器在编译时认为a的类型是A,所以调用的是A中的print();
//这也是父类对象不能调用子类对象的特有方法的原因.。
而在运行时, jvm会发现a的真实类型是B,所以a可向下转型为B类型;这时就可以调用子类特有方法
//这也是为什么可以向下转型,
但对没握告于静态成员,不管在编译时还是运行时,父类对象都不能调用子类特有的静态方法;
而子类可以继承父类非private的static成员,子类也有自己特有静态枯明方法,但这个名字和父类一样.也就是说其实子类同时有两个静态方法;但这两个方法不在同一区域内,所以不存在同名的冲突。只是子皮塌类的静态方法屏蔽了父类的静态方法;你可以把静态方法看成子类对象特有的方法。
其实B对象中也可访问A类中的print(),修改代码即可;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
除了private方法和对象不继承,其他的都能给子类继承
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那个不叫覆盖,叫做隐藏,屏蔽.一个新的方法把父类的方法隐藏掉了。但新方法是属于子类的,败灶
跟父类中同名方法没关系。比如你这个类如果Dog dog= new
LittleDog();,那么调用dog.bark()的话调庆枯指用的会是Dog.bark()而非LittleDog.bark(),因为不是动态绑誉配定的。
跟父类中同名方法没关系。比如你这个类如果Dog dog= new
LittleDog();,那么调用dog.bark()的话调庆枯指用的会是Dog.bark()而非LittleDog.bark(),因为不是动态绑誉配定的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询