第十二天
继承关系的使用情况
不要为了使用部分的功能而就去继承一个类,这样不仅继承了所需要使用的功能,还继承了很多别的不需要的功能,继承关系是存在局限性的.仅在以下的情况中我们可以比较正确地使用继承关系,a类是b类的一种,或者b类是a类的一种时,继承关系能较好的使用来表达二者之间的关系,用人类的话语来说就是xxx是一个sss的时候使用继承关系,比如学生是一个人,呢么学生和人之间就可以继承,学生继承人这个类.
class person{
String name;
int age;
String gender;
public person() {
}
public person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public void say(){
System.out.println("My name is : "+this.name+"\n"+"I'm "+this.age+"\n"+"My gender is :"+this.gender);
}
}
class Student extends person{
public Student(String name, int age, String gender) {
super(name, age, gender);
}
@Override
public void say() {
super.say();
}
}
public class Test8 {
public static void main(String[] args) {
Student p1 = new Student("wang",15,"male");
p1.say();
}
}
//输出
//My name is : wang
//I'm 15
//My gender is :male
向上转型
多态本身就是一种向上转型,父类引用指向子类对象,向上转型之后父类引用变量可以访问子类中属于父类的属性和方法,但是不能访问子类独有的属性和方法.(因为被向上转型了么,所以下的方法你咋访问,除非上也有).
向上转型的格式为: 父类 对象名 = new 子类();
多态的弊端就是不能访问子类的特有功能原因就是向上转型后父类中没有子类的特有功能.(这时候就需要请出我们的向下转型.)
因为多态的弊端,所以我们要使用向下转型,还原成子类类型.
变量的强制类型转换格式是:目标类型 变量名 = (目标类型) 初始化值;
class Father2{
public void show(){
System.out.println("show father...");
}
}
//子类
class Son2 extends Father2{
public void show(){
System.out.println("show son...");
}
//特有功能:
public void playGame(String gameName){
System.out.println("会玩"+gameName+"游戏");
}
}
//测试类
public class DuoTaiDemo4 {
public static void main(String[] args) {
//父类指向子类对象
Father2 father2 = new Son2() ;
father2.show(); //编译看左,运行看右,存在重写
//father2.playGame( "lol");//父类没有方法
System.out.println("------------------------------");
//方案1:创建具体的子类对象
Son2 son2 = new Son2() ;
son2.playGame("lol");
System.out.println("------------------------------");
/**
* "向下转型"
* Zi z = (Zi)f ; 还原成子类型
*/
Son2 s = (Son2) father2;
s.playGame("csgo");
}
}
向下转型时务必注意,前提条件是父类引用指向子类对象 Fu f = new zi();
遵循向下转型的格式:
zi z = (zi) f;若是向下转型使用不当就会返回java.lang.ClassCastException;类转换异常:(属于运行时期异常),若是当前对内存中的实例不是该类型时,就会出现此问题.
抽象类
现实世界中,某个事物是比较概括性的(人/水果/动物),描述的就是抽象的事物,而不是具体的李四,或者一个苹果,一只兔子这种具体的对象,我们把这种宽泛的描述成为抽象.
抽象方法只用给出方法的声明,不写出方法体,而存在这种方法的类我们称之为抽象类.
比如喝水,大象和人类都喝水,它们用鼻子喝水,我们用手拿杯子喝水,抽象类定义时我们仅需定义一下喝水这个方法,但是我们不去细致描述具体咋喝水.
抽象的关键字是 abstra,我们使用这个关键字来修饰类和类中成员
抽象类的特点
- 有抽象方法的类一定是抽象类.
- 抽象类中不一定只有抽象方法,还可以存在非抽象方法(有方法体的方法)
- 抽象类不可以进行实例化,不能够创建对象,只能通过让具体的子类继承这个抽象类,然后再去用这个子类创建对象,间接实例化这个抽象类.
- 抽象类的子类有两种情况,一种是抽象类的子类也是抽象类的时候,这种情况毫无意义,因为你一个抽象类又继承一个抽象类,俩都不能实例化,就这么一直抽着,玩呢?顶啥用你告诉我,第二种情况就是子类不是个抽象类,是个具体的类,这样能实例化了才有意义,第一个情况第二个抽象的类后面跟一个具体的类再去继承它也行,不过这部机成第二种情况了?
抽象类的核心宗旨就是强制子类去重写抽象类中的抽象方法,不写你就等着报错吧.
抽象类的成员特点
- 成员变量既可以定义变量,也可以定义常量,被final修饰.
- 成员方法既可以定义为抽象方法,也可以定义为非抽象方法.若果定位抽象方法必须给出abstract关键字.
- 构造方法可以存在有参构造也可以存在无参构造,为的就是让子类间接实例化自己,分层初始化.