Java面向对象编程
Java的核心就是OOP(面向对象)
5、抽象类和接口
抽象类
-
抽象类的关键字是abstract
-
abstract修饰符可以用来修饰方法也可以修饰类。
- 如果修饰方法,那么该方法就是抽象方法;
//abstract 抽象类 public abstract class Action {}
- 如果修饰类,那么该类就是抽象类。
//abstract,抽象方法,只有方法名字,没有方法的实现! public abstract void say();
-
包含抽象方法的类就是抽象类,但是抽象类可以没有抽象方法。
-
抽象类:不能使用new关键字来创建对象,它是用来让子类继承的。
-
抽象方法:只有方法的声明,没有方法的实现,它是用来让子类实现的。
-
子类继承抽象类时有两种情况:
- 必须要实现抽象类没有实现的抽象方法,重写抽象类的抽象方法
- 或者该子类也声明为抽象类,那么需要子子类重写抽象类的抽象方法
下面作简单的操作:
- 抽象类
package com.oop.demo11;
//abstract 抽象类
public abstract class Action {
//有抽象方法的一定是抽象类
//约束:有人帮我们实现
//abstract,抽象方法,只有方法名字,没有方法的实现!
public abstract void say();
//抽象类可以有普通的方法
public void text(){}
}
- 子类
package com.oop.demo11;
//继承了抽象类的所有子类都必须要实现他的方法,除非他的子类也是抽象类
public class Run extends Action{
@Override
public void say() {}
}
-
抽象类可以包含抽象方法,也可以没有抽象方法。
- 没有抽象方法时,抽象类也不能实例化。
- 抽象类必须由子类覆盖定义了父类的所有抽象方法后,子类才可以实例化
- 否则这个子类还是抽象类
-
抽象类的使用条件:
- 当一个类中的一个或者多个方法是抽象方法时
- 当一个类为抽象类的子类时,并没有为所有的抽象方法提供实现或者提供方法主体时
- 当一个类实现一个接口时,并没有为接口中的所有方法提供实现细节或者提供方法体时
-
抽象类和普通类的对比:
- 抽象类不能直接实例化,只能通过子类进行实例化;普通类可以直接实例化
- 抽象类允许包含抽象成员方法;普通类中不允许包含抽象方法
- 抽象类不允许被密封。final密封类不能被继承,防止恶意的派生
抽象类常见的问题
-
抽象类是否有构造器?
答:1、有构造器,用于给子类对象进行初始化
2、new子类时,抽象父类的构造器一定会被执行
-
抽象类是否可以不定义抽象方法?
答:1、可以,但是一般都定义
2、目的就是不允许构建该类对象,只能被子类继承
3、通过子类才能构建抽象父类的对象
-
抽象类—定是父类?
答:1、是的,因为需要子类提供父类抽象方法的实现,才可以进行实例化
-
创建对象时,加载的顺序:
答:先加载静态属性和静态初始化块,后加载成员属性和初始化块
- 加载静态属性和静态初始化块:
- 先加载父类:
- 处理父类的静态属性和静态初始化块,两者地位相等,执行顺序取决于定义顺序;
- 静态代码块和静态方法一致,要求只能直接访问静态成员;
- 如果需要在静态代码块和静态方法中访问非静态成员则必须构建对象;
- 后加载子类:
- 处理子类的静态属性和静态初始化块,两者地位相等,执行顺序取决于定义顺序;
- 静态代码块和静态方法一致,要求只能直接访问静态成员;
- 如果需要在静态代码块和静态方法中访问非静态成员则必须构建对象;
- 加载成员属性和初始化块
- 加载父类:
- 成员属性和初始化块,两者地位相等,执行顺序取决于定义顺序。
- 父类构造器
- 加载子类:
- 成员属性和初始化块,两者地位相等,执行顺序取决于定义顺序
- 子类构造器
接口
-
与其他类的区别
- 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法)都有!
- 接口:只有规范!
-
接口的定义:
- 接口只有规范,自己无法写方法;
- 接口是专业的约束!
- 接口可以实现约束和实现分离!
- 接口中可以定义常量,但是一般不会这么做
- 下面定义一些接口:关键字interface
package com.oop.demo12; //interface定义接口的关键字 public interface UserService{ //可以定义常量,但是一般不推荐使用 //定义常量的时候,隐藏了public static final ~ int num = 001; //接口中的所有定义的方法其实都是抽象的 //定义方法的时候,隐藏了public abstract void add(String name);//增 void delete(String name);//删 void update(String name);//改 void query(String name);//查 }
package com.oop.demo12; public interface TimeService { void timer(); }
-
实现接口的关键字是implements
- 接口可以多继承
- 接下来创建一个类来实现上面的接口
- 实现了接口的类,就需要重写接口中的方法
//实现了接口的类,就需要重写接口中的方法 //接口可以实现多继承 public class UserServiceImpl implements UserService,TimeService { @Override public void add(String name) { } @Override public void delete(String name) { } @Override public void update(String name) { } @Override public void query(String name) { } //重写 TimeService 接口中的方法 @Override public void timer() { } }
-
接口就是规范,定义一组规则,体现了现实世界中"如果你是…则必须能…"的思想。
-
接口的本质是契约,就像我们现实生活中的法律一样。制定好以后大家都要遵守!
-
OO的精髓是对对象的抽象,最能体现这一点的就是接口。
-
声明类的关键字是class,声明接口的关键字是interface
-
总结:
- 接口可以实现约束和实现分离!
- 接口中可以定义常量,但是一般不会这么做
- 接口可以定义一些方法,让不同的人来实现
- 接口里的方法前面都隐藏了代码"public abstract"
- 接口里的常量前面都隐藏了代码"public static final"
- 接口不能被实例化,接口中没有构造方法
- 实现接口的关键字是implements,接口可以多继承
- 实现了接口的类,就需要重写接口中的方法