Java中的类继承到底继承了什么?(2)

public class Test { public static void main(String[] args) { Derive d = new Derive(); d.print("hello", 2); d.print("world");

/* output
hello
hello
world
world
world
world
world

*/

} }
class Base { public void print(String msg) { for(int i=0;i<5;++i) { System.out.println(msg); } } } class Derive extends Base { public void print(String msg,int times) //在子类中重载父类方法 { for(int i=0;i<times;++i) { System.out.println(msg); } } }

对于C++

#include<iostream> #include<string> using namespace std; class Base { public : void print(const string& msg) const { for(int i=0;i<5;++i) { std::cout<<msg<<std::endl; } } }; class Derive:public Base { public : /* *需要使用using Base::print将父类中的版本引如到子类的作用域中,这样才能形成跨类重载,否则子类在使用一个参数版本的print函数时,会出现以下编译错误: * * error: no matching function for call to ‘Derive::print(const char [6])’ *意思是编译器在Derive类中找不到print(const char [6])版本的函数 * */ using Base::print; void print(const string& msg,const int times) const { for(int i=0;i<times;++i) { std::cout<<msg<<std::endl; } } }; int main() { Derive d ; d.print("hello",2); d.print("world"); }

实例字段

实例字段没有什么要说的,要说的就是实例字段的隐藏了:在子类中定义一个和父类同名的字段,那么子类中的名称将会隐藏父类中的同名字段。

几乎没有人使用这个技术,如果用到了,那么说明代码设计有问题(bad code)

class Base { protected int i = 100; } class Derive extends Base { private int i = 1000; //隐藏了父类字段 i public void foo() { System.out.println(i); //代表this.i System.out.println(this.i); System.out.println(super.i); //使用父类被隐藏的i } } 

也可以使用cast,这是最终极的手段。因为super只能引用直接父类的成员,而不能引用父类的父类的成员。但使用cast可以做到。

class A { protected int i = 100; } class B extends A { protected int i = 1000; } class C extends B { private int i = 10000; public void foo() { System.out.println("this.i:"+this.i); //10000 System.out.println("B.this.i:"+ ((B)this).i ); //1000 System.out.println("A.this.i:"+ ((A)this).i ); //100 } }

static成员

static会被子类继承吗?答案是会。他们会被继承为子类的static成员,而不是子类实例的成员。

同样,private static成员不会被继承,只有 包访问 权限 ,protected public 成员才会被继承。

父类的private成员不会被子类继承,子类不能访问。

父类的 包访问成员 继承为子类的包访问成员。就好像他们直接定义在子类中一样。

父类的 protected 成员继承为子类的protected 成员。就好像他们直接定义在子类中一样。

父类的 public 成员继承为子类的public 成员,就好像他们直接定义在子类中一样。

 

 

static 成员同样也可以使用实例成员的访问修饰符 public ,包访问,protected , priavcte。

static方法

static方法不能被override,只能被隐藏。

static字段

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6a06a38bd9b14346e7f843db4140217f.html