您的位置:首页 > 编程语言

继承(代码体现)

2015-07-10 20:59 204 查看
子父类出现后类中成员的特点;

类中成员:

1:变量

如果子类中出现非私有的同名成员变量时

子类要访问本类中的变量,用this

子类要访问父类中的同名变量,用super

super和this的使用几乎一致;

this代表的是本类对象的引用,super代表的是父类对象的引用

2:函数

当子类出现和父类一模一样的函数时

当子类对象调用该函数,会运行子类函数的内容

如同父类的函数被覆盖一样

这种情况是函数的另一个特性:重写(覆盖)

覆盖:

1.子类覆盖父类,必须保证子类的权限大于等于父类,才可以覆盖

2.静态覆盖静态;

记住!!

重载:只看同名函数的参数列表

重写:子父类方法要一模一样

当子类继承父类,沿袭了父类的而功能到子类中,但子类虽具备该功能,但是功能的内容不一致,这时,没有必要新定义功能,而是使用覆盖特殊,保留父类的功能定义,并重写功能内容。

3:构造函数

1:在对子类对象进行初始化时,父类的构造函数也会运行。

那是因为子类的构造函数默认第一行有一天隐式的语句 super();

super();:会访问父类中空参数的构造函数,而且子类中所有的构造函数默认的第一行都是super();

2:为什么子类一定要访问父类中构造函数(也就是说当父类没有空构造函数时,我们在子类的每个构造函数中,必须写上语句,去访问父类构造函数,否则编译不通过)

因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。

所以子类在对象初始化时,要先访问一下父类中的构造函数。

如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。

注意:

super语句一定在子类的第一行,若有this()语句那么就不会有super()省略,二者择其一;

变量

class Fu
{
int num1=4;
}
class Zi extends Fu
{
int num2=5;
}

class ExtendsDemo
{
public static void main(String[] args)
{
Zi z=new Zi();
System.out.println("num1="+z.num1+"...num2="+z.num2);
}
}




但如果子父类的有相同的变量呢

class Fu
{
int num=4;
}
class Zi extends Fu
{
int num=5;
void show()
{
System.out.println(num);
}
}

class ExtendsDemo
{
public static void main(String[] args)
{
Zi z=new Zi();
System.out.println("num="+z.num);
z.show();
}
}




可以看到第一行打印的是num是子类变量的值;

而第二行show()打印的是子类的是因为show(this.num),省略了this;如果想打印父类的值,这时应用一个关键字 super;

..........
class Zi extends Fu
{
int num=5;
void show()
{
System.out.println(super.num);
}
}
.....

这样就打印的是父类的值

子父类中有相同名的函数

class Fu
{
void speak()
{
System.out.println("vb");
}
}
class Zi extends Fu
{
void speak()
{
System.out.println("java");
}
}

class ExtendsDemo
{
public static void main(String[] args)
{
Zi z=new Zi();
z.speak();
}
}




look!!!显示的是子类功能内容

子父类的构造函数

class Fu
{
Fu()
{
System.out.println("fun run");
}
}
class Zi extends Fu
{
Zi()
{
System.out.println("zi run");
}
}

class ExtendsDemo
{
public static void main(String[] args)
{
Zi z=new Zi();
}
}




可以看到确实继承父类,而且先走父类;

再看一个

class Fu
{
Fu()
{
System.out.println("fu run");
}
Fu(int x)
{
System.out.println("fu..."+x);
}
}
class Zi extends Fu
{
Zi()
{
//super();
System.out.println("zi run");
}
Zi(int x)
{
//super();
System.out.println("zi..."+x);
}
}

class ExtendsDemo
{
public static void main(String[] args)
{
Zi z=new Zi();
Zi z1=new Zi(4);
}
}




每个构造函数中都有super(),所以有俩fu run;

super()调用的是Fu()而不是Fu(Int x);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: