面向对象—09—继承、final关键字

来源:互联网 发布:淘宝店铺怎样引流量 编辑:程序博客网 时间:2024/06/05 18:12

 

 /*
继承: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的区别,他们都只能写在构造函数第一行,

注意重载和重写的区别,