首页 > 代码库 > 面向对象(子父类中变量、函数、构造函数的特点)
面向对象(子父类中变量、函数、构造函数的特点)
/**
* Created by 刘朋程 博客园 on 2014-07-15.
*/
class fu
{
int num = 4 ; //定义父类的变量num = 4
fu() //定义父类的构造函数
{
System.out.println("fu run");
}
void speak() //定义父类的方法
{
System.out.println("fu hanshu run");
}
}
/**
* Created by 刘朋程 博客园 on 2014-07-15.
*/
class zi extends fu //定义子类并继承父类
{
//super(); 隐式super空参数的构造函数
int num = 5; //定义子类的变量num = 5
zi() //定义子类的构造函数
{
System.out.println("zi run");
}
void speak() /*定义子类的方法 子类继承父类的方法并进行覆盖。
*保留父类原有的功能定义,并重写功能内容,对于以后的
* 功能扩展方便进行
*
* 覆盖的注意事项
* 1、子类覆盖父类,必须保证子类权限大于等于父类权限
* 2、静态只能覆盖静态
*/
{
System.out.println(this.num); //this代表引用的是本类的变量
System.out.println(super.num); //super代表引用的是父类的变量
System.out.println("zi hanshu run");
}
}
/**
* Created by 刘朋程 博客园 on 2014-07-15.
*/
public class ExtendsDemo {
public static void main(String [] args)
{
zi z = new zi();
z.speak();
/* 输出结果
* fu run 首先运行父类的构造函数
* zi run 然后运行子类的构造函数
* 5 this代表引用的是本类的变量,所以结果是 5
* 4 super代表引用的是父类的变量,所以结果是 5
* zi hanshu run 同名的speak方法存在是,运行子类的函数
*
*
* 子类函数的实例化过程
*
* 在对子类对象初始化时,父类的构造函数也会运行,并且首先运行
* 因为子类的构造函数默认第一行有一条隐式super空参数的构造函数
* 而且所有子类的构造函数默认第一行都有一条隐式super空参数的构造函数
*
* 为什么子类一定要访问父类的构造函数呢?
* 以为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先
* 查看父类是如何对这些数据进行初始化的。
*
* 如果要访问父类中指定的构造函数,可以通过手动指定super语句的方式
* 去指定
* 比如说
* class fu
* fu(int x)
* {}
* class zi extends fu
* super(6);
* {}
*
* 注意 super语句一定定义在子类构造函数的第一行
*
*结论
* 子类的所有的构造函数,默认都会访问父类中的空参数的构造函数。
* 因为子类的每一个构造函数的第一行都有一句隐式super();
*
* 当父类中没有空参数的构造函数时,子类必须手动通过super或者this
* 语句形式来指定要访问的构造函数
**/
}
}
/**
* Created by 刘朋程 博客园 on 2014-07-15.
*/