黑马程序员技术交流社区
标题:
java 继承:子父类中出现同名变量、函数时解析 含示例代码
[打印本页]
作者:
fmi110
时间:
2015-7-1 11:33
标题:
java 继承:子父类中出现同名变量、函数时解析 含示例代码
本帖最后由 fmi110 于 2015-7-1 11:37 编辑
继承的部分有关知识
/**
继承二:子父类出现后,类成员的特点:
类中的成员有:
1、变量
2、函数
3、构造函数
1、变量:
如果子类中出现非私有的同名成员变量时,
子类要访问本类的变量,用 this.变量 或 变量
子类要访问父类的变量,用 super.变量
2、函数:
当父类子类中出现一模一样的(同名?)函数时,
子类对象调用该函数时,会运行子类函数的内容
如同父类的函数被覆盖一样(其实此时子类中该函数可通过 super.函数名 调用父类函数)
这种情况时函数的另一特性:重写(覆盖)
当子类继承父类的方法,但是子类的方法包含功能内容与父类不完全一致,
这是并不需要定义新功能,而是使用覆盖特殊,保留父类的功能定义,并重写功能内容
覆盖:
1、子类覆盖父类,必须保证子类的访问权限大于或等于父类权限
2、静态只能覆盖静态
重载与重写(覆盖的区别):
重载:重在参数列表,跟其他无关
重写:子父类方法要一模一样(访问权限不算),包括返回类型,方法名,方法参数。
(1)子父类的仅返回类型不同时,编译错误:
父类为 int show();
子类为 void show();
则对象(假设能建立)同时有 int show();void show();肯定编译失败
(2)参数不一样时,其实就相当于函数重载了!??
*/
class Fu
{
// private int num = 7; //私有化后,不能被子类访问
int num = 8;
/**同名函数Demo部分,说明函数的覆盖*/
//public void speak() //子类中也有speak()方法时,子类的show访问权限要不低于父类
void speak()
{
System.out.println("speak输出的这部分来自于Fu类");
}
/**用于说明函数的重载 */
void reLoad(int num)
{
System.out.println("现在载入的是父类中的reLoad方法\n");
}
}
class Zi extends Fu
{
/**同名变量Demo部分*/
int num = 9;
void show()
{
System.out.println("this.num 输出自身变量 num = "+num);
System.out.println("super.num 输出父类中的变量 num = "+ super.num);
System.out.println();
}
/**同名函数Demo部分,说明函数的覆盖*/
void speak()
{
super.speak(); //调用了父类中的方法,相当于把父类的方法包含进来了
System.out.println("\nspeak输出的这部分,是子类中新增加的\n");
}
/**用于说明函数的重载 */
void reLoad(int num,int n)
{
System.out.println("现在载入的是子类中的reLoad方法");
}
}
class ExtendsDemo2
{
public static void main(String[] args)
{
Zi z = new Zi(); /**new 时,先加载Fu类,然后加载Zi类*/
System.out.println("\n*****************************************************\n");
z.show(); /**用于说明继承后 同名变量的特点*/
System.out.println("\n*****************************************************\n");
z.speak(); /**用于说明继承后 同名函数的覆盖(可以包含父类的功能并增加功能)*/
System.out.println("\n*****************************************************\n");
/**用于说明函数的重载 */
z.reLoad(1);
z.reLoad(1,2);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2