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字段