黑马程序员技术交流社区
标题:
面向对象继承以及子父类后成员的特点(重载和重写的区别)
[打印本页]
作者:
淡定..
时间:
2015-5-7 07:57
标题:
面向对象继承以及子父类后成员的特点(重载和重写的区别)
/*
继承:
1、提高代码的复用性
2、让类与类之间产生关系,有了这个关系,才有了多态的特性
注意:不能为获取其他类的功能,简化代码而继承,类与类之间必须有所属关系才可以基础。
java语言中:
1、只支持单继承,不支持多继承,
2、支持多层继承,
多继承会存在安全隐患:当多个父类定义相同的功能,但是功能的内容不一样,这样运行的时候
不知道该运行谁,但是java保留了机制用另一种方式实现就是多实现。
如何使用继承体系的功能?
想要使用体系功能,先遍越父类的功能,因为父类定义的功能是体系的共性功能,通过父类,就
可以知道该体系的基本功能,这个体系就可以基本的使用了
在具体的调用的时候,为什么要创建子类对象?
1、父类有可能不能创建对象(如抽象类)
2、创建子类对象可以使用更多的功能,包括基础功能和特有功能
简而言之:查阅父类,创建子类的功能。
子父类出现后,类成员的特点:
1、变量
2、函数
3、构造函数
一、变量
如果子类中出现非私用的同名变量时
1、子类要访问本类的变量时,用this
2、子类要访问父类中的变量时,用super
3、this和super的使用几乎是一致(this代表是本类的引用,super是父类的引用)
二、函数
子父类中的函数
重写:当子类中出现父类一样的函数时,当调用父类的时候,会执行子类里面的函数
如同父类中的函数被覆盖,这种情况就是重写(覆盖)。
当子类沿袭父类的功能时,子类也具备该功能时而且还要定义新的功能时,我们直接
可以保留父类功能定义,利用重写定义新的功能
覆盖:
1、当子类覆盖父类时,子类的权限要大于等于父类的权限,才可以覆盖,否则编译失败
2、静态只能覆盖静态
注意:
重载:只看同名函数的参数列表(个数和类型不同时,重载)
重写:子父类的方法要一模一样
三、子父类构造函数
在对子类进行初始化时,父类的构造函数也会运行,
那是因为在子类的第一行有一条隐式函数super();
super();会访问父类中空的构造函数,而且所用的子类的构造函数都有默认的super();
为什么一定要访问父类中的构造函数?
当子类继承父类时,是要继承父类中的一些数据,所以当建立子类对象时,要先看父类怎么初始化数据的
所以子类初始化时一定要先初始化父类的构造函数。
如果访问父类中指定的构造函数时,需要手动super(参数)来定义。
super一定要写在第一行。
子类的实例化过程
结论:
子类的所有构造函数都会有默认访问父类空参数的函数,因为每一个都有一个隐式super语句,
当父类没有空参数的函数时,必须手动通过super语句形式来访问父类中的构造函数,
当然子类构造函数中第一行也可以用this来访问本文本类空参数的构造函数,
子类构造函数至少有一个会访问父类构造函数
*/
//父类中的父类是Object
class Father
{
private int num=4;
public void setNum(int num)
{
this.num=num;
}
public int getNum()
{
return this.num;
}
void show()
{
System.out.println("father");
}
}
//extends关键字是继承,调用父类的方法时,要放在子类的方法里面或者,构造函数
class Son extends Father
{
private int nums;
Son()
{
//默认的super函数
}
Son(int i)
{
this();
}
void show()
{
//super();默认的父类中的空参数的构造函数
super.show();//继承父类,并定义新功能(重写)
super.setNum(5);
nums=super.getNum();
System.out.println("nums="+nums);
}
}
class ExtendsDemo
{
public static void main(String[] args)
{
Son person=new Son();
person.show();
}
}
作者:
薛慧彬
时间:
2015-5-7 13:43
不错。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2