一、子类继承父类的写法
class 子类名 extends 父类名{}
二、子类与父类之间的关系
①父类可以有个子类
②子类只能有一个父类
③子类会继承父类的一些属性和方法
④子类在创建对象时,会先调用父类的构造方法6
三、四大权限修饰符
| 继承 | 非继承 | |||
| 同一个包 | 不同包 | 同一个包 | 不同包 | |
| private | ✖ | ✖ | ✖ | ✖ |
| 缺省 | ✔ | ✖ | ✔ | ✖ |
| protected | ✔ | ✔ | ✔ | ✖ |
| public | ✔ | ✔ | ✔ | ✔ |
上面的对错仅代表能否调用。
其实子类继承父类之后,创建子类对象,会对父类无法调用的属性也分配空间。但是无法调用。
四、instanceof关键字
对象 instanceof 类名
如果此对象是该类的对象,或者是该类的子类的对象,则返回true
否则返回false
如图:Person为Teacher 和 Student的父类
现在创建一个zhang为Person的对象
创建一个peng为Teacher的对象
创建一个liu为Student的对象
问:
zhang instanceof Person
zhang instanceof Teacher
peng instanceof Teacher
peng instanceof Person
liu instanceof Teacher
五条表达式结果如何?
五、this和super关键字
①this代表当前类
②super代表父类
用this()和super()可以分别调用子类和父类的空参构造器
如图:Person为Teacher 和 Student的父类
问:在Student这个类中,this.id 代表的是?super.id代表的是?
六、成员变量的隐藏和方法的重写
1、成员变量的隐藏
public class Person{
int age;
}
public class Student extends Person{
int age;//String age;
}
2、方法的重写(区别于方法的重载)
public class Person{
public void walk() { System.out.println("人走路!");}
}
public class Student extends Person{
public void walk(){ System.out.println("学生走路");}
}
注意:子类重写的方法的权限修饰符的权限大小不能小于父类。
如:Person的walk方法是public,那么子类Student的walk方法只能是public,而不能是其他。
七、final关键字
1、final类
public final class Student{}
问:Student能否被继承?
2、final方法
public final void walk(){}
问:walk方法可以被继承吗?
walk方法可以被重写吗?
3、final变量(常量)
public final double PI = 3.1415926;
问:PI可以被修改吗?
八、上转型对象
1、上转型对象不能操作子类新增的成员变量,不能调用子类新增方法
2、上转型对象可以调用被继承的变量,以及被隐藏的变量。也可以调用被继承的方法和被重写的方法。
如图:Person是Student的父类。
Person p;
//p = new Person();
p = new Student();
问:
p.id调用的是哪个类的id?
p.walk()调用的是哪个类的walk?
九、abstract关键字(抽象)
1、abstract类
abstract class A{}
2、abstract方法
abstract void walk();//只有声明,没有方法体
3、注意点:
①abstract 类中可以有abstract方法,也可以有非abstract方法
②abstract方法一定存在于abstract类中,且abstract方法没有方法体。即没有花括号{},这一部分
③如果一个非abstrac类继承了abstract类,那么就需要重写abstract类中的abstract方法,并加上方法体。如果是一个abstract类继承了abstract类,那其中的abstract方法可重写可不重写。
④abstract类不能用于声明对象。
⑤abstract类可以声明上转型对象。
问:
1、为什么非抽象类继承抽象类一定要重写抽象方法?
2、abstract class A{}
abstract class B extends B{}
A a = new B();//对吗?
3、abstract可以和final一起使用吗?
十、多态
public abstract class Animal{
abstract public void yell();
}
public class Dog extends Animal{
public void yell() { System.out.println("汪");}
}
public class Cat extends Animal{
public void yell() { System.out.println("喵");}
}