------
1.继承
类与类之间的关系:依赖,聚合,继承
继承的由来:
将多个类中公共的内容向上抽取抽取产生了父类(基类 超类)
这个被抽取的类叫子类.
通过继承:我们可以节省代码.
继承的格式:
class 子类 extends 父类 { }
******************************************************************************************
通过继承,子类自动拥有父类的所有非private成员.
也可以说private成员子类可以继承,但是不能使用.因为private限定使用的范围.
******************************************************************************************
继承的好处:
集成的出现提高了代码的复用性.
继承的出现让类与类之间产生了关系,提供了多态的前提.
Java中只支持单继承,一个父类可以派生多个子类.
为什么只支持单继承? -----为了避免 混淆
class Father{
void fun(){}
void method(){}
}
class AFather{
void fun(){}
}
class ASon extends Father,AFather{
//当前ASon有两个父类 Father ,AFather,那么对于ASon子类来说
它里面存在fun方法,这个方法是从哪一个父类继承?为了避免这种
情况的存在,java中只允许单继承
}
class BSon extends Father{
}
我们可以理解为: 一个儿子只能有一个爹,一个爹可以有多个儿子.
Java支持多重继承
class GradeFather{
void fun(){}
}
class Father extends GradeFather{
void fun(){} //这个方法是从GradeFather中继承的
}
class Son extends Father{
//当前Son这个类也可以看成是GradeFather的间接子类.
void fun(){} 这个方法是从Father继承的。
}
通过多重继承产生了一个继承的体系
上层的类中定义的行为对于这个体系来说,所有下层的类中都包括.
因此,我们在了解一个体系时,一般从上层来观察,通过上层能了解整个体系的基本行为.
在使用时,使用的是最下层的类.
上层:表示的是整个体系的功能
下层:标识的是特性的功能(根据具体的要求来选择)
怎样去使用继承:
不要为了继承而继承(不要为了使用某个属性或方法去继承)
我们什么时候使用继承,要进行具体的分析.继承其实是一种is关系
class 动物{
}
class 哺乳动物{
void eat();
}
class 犬科 extends 哺乳动物{
}
class 猫科 extends 哺乳动物{
}
class 狗 extends 犬科{}
class 狼 extends 犬科{}
class 猫 extends 猫科{}
class 虎 extends 猫科{}
class 蝙蝠 extends 哺乳动物{}
class 跳蚤{
//如果它也有一个吃的行为,就不应该继承犬科,猫科,也不能继承哺乳动物。
}
继承中的构造方法:
构造方法不能被继承
通过下面代码发现,当子类对象实例化时Son son=new Son(),父类构造先执行了,然后执行的是子类构造.
//父类
class Father
{
String name;
Father(String name){
super();//执行Object父类的无参构造方法
System.out.println("father构造");
}
Father(int age){
}
Father(){}
}
//子类
class Son extends Father
{
String sex;
Son(){
//super(); //执行Father父类的无参构造方法
super("tom"); //执行Father父类的字符串参数的构造方法
System.out.println("son 构造");
}
}
为什么出现这种情况:
因为所有的构造方法中默认执行的第一句话都是super();
super();它代表的意思是执行父类的无参构造方法.
java中的所有类都有一个默认的父类 Object类,它是所有java类的父类.
父类的构造方法的目的是为了帮助子类对象实例化.
继承中的成员属性:
如果子类中存在与父类中重名的成员属性
在子类中有一个方法,它显示这个重名的属性
this存在成员方法中作用:用来区*部与成员属性
super存在成员方法中作用:用来区分子类与父类中重名的成员.
class Father
{
String name="tom";//父类成员变量
}
class Son extends Father
{
String name="james"; //子类成员变量
public void show(){
String name="tony"; //局部变量
System.out.println(name); //局部变量name
System.out.println(this.name);//本类中的name 属性
//要得到被子类隐藏的父类中的name属性
System.out.println(super.name); //通过super可以得到父类中的name属性
}
}
继承中的成员方法:
重写:子类中存在一个与父类中一样的方法
一样的意思是返回值类型,方法名,参数列表都一样.
重写的作用:通过重写可以将父类中的方法进行功能扩展.
重写的注意事项:
①.静态只能覆盖静态
②.重写的方法的权限修饰符要大于等于被重写的方法
③.私有的方法不能被重写.
关于多态的两种表现形式:重写与重载
重写与重载的区别:
重载:一个类中具有相同的方法名,参数类型,个数,排列顺序不同产生了重载
重写:子类中有一个与父类一样的方法,方法的返回值类型,方法名,参数列表一样.
重写的作用:可以在子类中对父类的功能进行功能扩展.
在重写的方法中对父类的方法可以使用super调用.
------