/*
继承:is a
1,提高了代码的复用性
2,让类与类之间产生了关系,有了这个关系才有了多态的特性
注意:千万不要为了获取其他类的功能,简化代码而继承。
必须是类与类之间有所属关系才可以继承,
Java语言中:java只支持单继承,不支持多继承。
因为多继承容易带来安全隐患:当多个父类中定义了相同
功能,当功能不同时,不确定要运行哪一个。
例:
class A
{
void show()
{
System.out.println("a");
}
}
class B
{
void show()
{
System.out.println("b");
}
}
class C extend A, B
{ }
C c = new C();
c.show();//不知道运行哪个show
java支持多层继承,也就是一个继承体系
如何使用一个继承体系中的功能呢?
想要使用体系,先查阅体系父类的描述,因为父类中定义的
是该体系*性功能。通过了解共性功能,就可以知道
该体系的基本功能。
那么这个体系已经基本可以使用了。
那么在具体调用时,要创建最子类的对象,为什么呢?
1,因为有可能父类不能创建对象
2,创建子类对象可以使用更多功能,包括基本的,也包括特有的
简单一句话:查阅父类功能,创建子类对象使用功能。
聚集:has a
聚合:球队的球员
组合(更紧密):手是人的一部分
*/
------------------------------------------------------------------------------------------------------
/*
子父类出现后,类成员的特点:
类中的成员:
1,变量
如果子类中出现非私有的同名成员变量时,
子类要访问本类中的变量,用this
子类要访问父类中的同名变量,用super
2,函数
3,构造函数
*/
class Fu
{
int num = 4;
}
class Zi extends Fu
{
int num = 5;
public void show()
{
System.out.println(super.num);//输出父类
}
}
class ExtendsDemo2
{
public static void main(String[] args)
{
Zi z = new Zi();
z.show();
System.out.println(z.num+"..."+z.num);
}
}
----------------------------------------------------------------------------------------------
/*
记住:
重载:只看同名函数的参数列表
重写:子父类方法要一模一样
*/
class Fu
{
void show()
{
System.out.println("fu show");
}
private void speak()
{
System.out.println("vb");
}
}
class Zi extends Fu
{
void show()
{
System.out.println("zi show");
}
void speak()
{
System.out.println("java");
}
}
class ExtendsDemo3
{
public static void main(String[] args)
{
Zi z = new Zi();
z.show();
z.speak();
}
}
---------------------------------------------------------------------------------------------------------
/*
3,子父类中的构造函数。
在对子类对象进行初始化时,父类的构造函数也会运行。
那是因为子类的构造函数默认第一行有一条隐式的语句super();
super():
1,会访问父类中空参数的构造函数。而且子类中所有的构造函数默认第一行都是super();
2,如果父类没有空参数的构造函数,那么子类必须在第一行写上super(参数);
为什么子类一定要访问父类中的构造函数?
因为父类中的数据子类可以直接获取,所以子类对象在建立时
,需要先查看父类是如何对这些数据进行初始化的。所以
子类在对象初始化时,要先访问一下父类中的构造函数。
如果要访问父类中指定的构造函数,可以通过手动定义super
语句的方式来指定。
注意:super语句一定定义在子类构造函数的第一行。
子类的实例化过程。
结论:子类的所有的构造函数,默认都会访问父类中空参数的
构造函数。因为子类每一个构造函数内的第一行都有一句隐式super();
当父类中没有空参数的构造函数时,子类必须手动通过super语句形式
来指定要访问父类中的构造函数。
当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的
构造函数。子类中至少要有一个构造函数会访问父类中的构造函数。
*/
class Fu //extends Object
{
/*
Fu()
{
//super();
System.out.println("fu run");
}
*/
Fu(int x)
{
//super();
System.out.println("fu run");
}
}
class Zi extends Fu
{
Zi()
{
//super(); //隐含此语句
super(2);
System.out.println("zi run");
}
Zi(int x)
{
//super(); //默认此语句
super(3);
System.out.println("zi..."+x);
}
}
class ExtendsDemo3
{
public static void main(String[] args)
{
Zi z = new Zi();
Zi z1 = new Zi(4);
}
}
--------------------------------------------------------------------------------------------------
/*
final : 最终。作为一个修饰符
当在描述事物时,一些数据的出现值是固定的,那么这时为了
增强阅读性,都给这些值起个名字,方便于阅读,而这个值不
需要改变,所以加上final修饰。
作为常量:常量的书写规范是所有字母都大写,如果有多个单词
组成。单词间通过_连接。例:final MY_PI
为了共享 public static final double PI = 3.14(即全局变量)
内部类定义在类中的局部位置上时,只能访问该局部被final修饰
的局部变量。
*/
--------------------------------------------------------------------------------------------------
个人总结:注意this和super的区别,他们都只能写在构造函数第一行,
注意重载和重写的区别,