继承:多个类有共同的成员变量和成员方法,抽取到另一个类中(父类),让多个类去继承父类,多个类可以获取父类中的成员
提高编写代码的效率
extends
继承的特点:
只支持单一继承(一个儿子只有一个亲爹)
支持多层继承(一个儿子可以有一个亲爹,还可以有一个亲爷爷)
继承中成员变量的特点
子类只能获取父类的非私有成员
子父类中成员变量的名字不一致直接获取父类的成员变量
子父类中成员变量名字是一样的获取的是子类成员变量
就近原则:谁离我近我就用谁<如果有局部变量就使用局部变量
如果没有局部变量,有子类的成员变量就使用子类的成员变量
如果没有局部变量和子类的成员变量,有父类的成员变量就使用父类的成员变量
啥都没有,出错了!!!>
super:可以获取父类的成员变量和成员方法,用法和this是相似的
继承中成员方法的特点:
子类中没有这个方法,调用父类的
子类中重写了这个方法,调用子类的
方法的重写:在子父类当中,子类的方法和父类的完全一样,子类重写了父类的方法(覆盖),当子类重写了父类方法后,子类对象去调用调用的是子类的方法,super(调用父类的方法)
方法的重载:在一个类中,有多个重名的方法,但是其参数不一样(参数的个数、类型、位置)
方法重写的应用场景:当父类的方法不能完全满足子类的使用,这个时候子类重写父类的方法,并可以在方法中使用关键字super调用父类的方法这样做可以保有父类的功能也可以拥有子类特有的功能
方法重写的注意事项:
注解:@写在方法、类、变量上
1.不能重写父类私有方法
2.权限修饰符大于等于(public最大)
什么也不加(默认)
权限必须大于等于父类方法的权限
public static void main(String[] args) {
NewPhone p=new NewPhone();
p.call();
}
}
class Phone {
public void call(){
System.out.println("打电话");
}
}
class NewPhone extends Phone {
@Override
public void call() {
System.out.println("正在录音中");
super.call();
}
}
继承中构造方法的执行顺序
在有字父类继承关系的类中,创建子类的对象,调用子类的构造方法,如果子类构造方法没有调用父类的构造方法,则会默认的调用父类的无参构造
2.肯定先执行父类的构造,因为要先给父类的成员变量初始化,子类的构造中可能使用到
我们可以使用super()在子类构造方法的第一行中调用父类的构造方法
父类无参构造--------子类有参----子类无参
son s=new son();
}
}
class father{
public father(){
System.out.println("我是父类的无参构造");
}
public father(int num1) {
System.out.println("我是父类的有参构造");
}
}
class son extends father{
public son() {
//super(1);
this(2);
System.out.println("我是子类无参");
}
public son(int num) {
System.out.println("我是子类有参");
}
}
this和super的区别
this是当前对象的引用
调用子类的成员变量和方法
调用子类的构造方法第一行调用子类的其他构造方法
super是我们子类对象的父类引用
1.调用父类的成员变量
2.调用父类的成员方法
3.在子类的构造方法第一行调用父类的构造方法
继承的优缺点
优点
1.提高了代码的复用性
2.提高了代码的可维护性
缺点
1.类的耦合性增强了
2.开发的原则:高内聚低耦合
内聚:就是自己完成某件事情的能力
耦合:类与类的关系
*抽象类
abstract:关键字,用于修饰方法和类
抽象方法:不同类的方法是相似的但是具体内容又不太一样,所以我们只能抽取它的声明,没有具体的方法体,没有具体的方法就是抽象方法
抽象类:有抽象方法的类必须是抽象类
注意:一个类继承了抽象类需要重写它所有的抽象方法
非抽象方法可以不重写,否则这个类就的是抽象类
abstract class animals{
abstract public void eat();
}
class Dog extends animals{
@Override
public void eat() {
// TODO Auto-generated method stub
}
}
abstract class Cat extends animals{
}
抽象类的特点:
1.抽象方法只能在抽象类
2.抽象类和抽象方法必须被abstract修饰
3.抽象类不能创建对象(不能实例化)
4.抽象类中可以有非抽象方法
5.抽象类和类的关系也是继承
6.一个类继承了抽象类要么重写所有的抽象方法,要么他是抽象类
抽象类成员的特点:
1.可以有成员变量、常量
final 修饰类(不能继承)、成员变量(不能改)
2.可以有抽象方法和非抽象方法
3.构造方法(方法名和类名一致)创建对象调用构造方法
可以有构造方法,需要对抽象类的成员变量进行初始化
案例1:老师类
共性:
属性 姓名,年龄,性别
行为 讲课,唱歌
SimpleTeacher st=new SimpleTeacher();
st.name="林志玲";
st.teach();
JobTeacher jt=new JobTeacher();
jt.name="令狐冲";
jt.teach();
}
}
abstract class Teacher{
String name;//姓名
int age;//年龄
String sex;
public abstract void teach();
}
class SimpleTeacher extends Teacher{
@Override
public void teach() {
System.out.println(name+"讲解基础班知识");
}
}
class JobTeacher extends Teacher{
@Override
public void teach() {
System.out.println(name+"讲解就业班知识");
}
}
雇员(Employee)示例:
公司中
程序猿(programmer)姓名(name)工号(id),薪水(pay) 工作内容(work)
项目经理(Manager) 姓名(name)工号(id),薪水(pay)奖金(bonus) 工作内容(work)
Programmer p=new Programmer();
p.work();
Manager m=new Manager();
m.work();
}
}
abstract class Employee{
String name;
String id;
double pay;
public abstract void work();
}
class Programmer extends Employee{
@Override
public void work() {
System.out.println("写代码");
}
}
class Manager extends Employee{
byte bonus;
@Override
public void work() {
System.out.println("盯着程序猿写代码");
}
}
足疗店
足疗技师
其他技师
共性
属性 姓名,年龄
行为 服务
足疗技师 zl=new 足疗技师();
zl.service();
其他技师 qt=new 其他技师();
qt.service();
}
}
abstract class 技师{
String name;
int age;
public abstract void service();
}
class 足疗技师 extends 技师{
@Override
public void service() {
System.out.println("按按肩膀,按按脚");
}
}
class 其他技师 extends 技师{
@Override
public void service() {
System.out.println("其他服务");
}
}
抽象类的细节
abstract不能和哪些关键字共存
priviate final
抽象类中是否有构造函数
有构造方法
抽象类可不可以没有抽象方法(可以)
(不能实例化)
抽象类的思想
Reader Writer