博客主页:GGood_Name的博客
博主介绍:一位只会wawa的acmer 和 写bug的后端选手!
专栏地址:Java学习专栏
期待各位朋友的互动,欢迎大家点评学习
抽象类
抽象类介绍
- 抽象类使用abstract修饰类
- 抽象类当中可以包含普通类所能包含的成员
- 抽象类和普通类
不一样
的是,抽象类当中可以包含抽象方法。
abstract class Color{
String name;
int cnt;
public abstract void red();
public void green();
}
抽象类使用的注意事项和细节讨论
- 抽象类
不能被实例化
public class AbstractDetail01 {
public static void main(String[] args) {
//抽象类,不能被实例化
Color p = new Color ();//错误用法
}
}
- 抽象类不一定要包含abstract方法,即抽象类
可以没有abstract方法
//抽象类可以没有abstract方法,还可以有实现的方法。
abstract class A {
public void hi() {
System.out.println("hi");
}
}
- 一旦类包含了abstract方法,则这个类必须为抽象类
//错误
class B {
public abstract void hi();
}
- 抽象类可以拥有任意成员(抽象类的
本质还是一个类
),比如:非抽象方法、构造器、静态属性等等
//抽象类的本质还是类,所以可以有类的各种成员
abstract class hi {
public int a = 10;//属性
public static String name = "hello";//静态属性
public void hi() {//方法
System.out.println("hi");
}
public abstract void hello();//抽象方法
public static void ok() {//静态方法
System.out.println("ok");
}
}
- 抽象方法不能有主体(方法体)
- 如果一个类继承了一个抽象类,则它必须实现那个抽象类的
所有抽象方法
,除非它自己也声明为abstract类 - 抽象方法
不能使用private、final 和 static 来修饰
,因为这些关键字和重写是相违背的
abstract class hi {
public /*这里不能使用private/final/static*/ abstract void hi();//抽象方法
}
接口
接口介绍
在Java中,接口可以看成是:多个类的公共规范 (一些没有实现的方法,封装到一起)
- 使用interface来修饰接口
- 接口当中的成员方法不能有具体的实现
interface Hi{
int name;
public void hello();
}
class SayHi implements Hi{
@Override
public void hello() {
}
}
接口是更加抽象的抽象的类;
抽象类里的方法可以有方法体;
接口里的所有方法都没有方法体(JDK7.0之前)。接口体现了程序设计的多态和高内聚低耦合的设计思想。
接口使用的注意事项和细节讨论
- 接口
不能实例化
- 接口中
所有的方法
是public方法,接口中的抽象方法,可以不用abstract修饰
interface IA{
void a();//实际上是public abstract void a();
}
- 一个普通类实现接口,就必须将该接口的
所有方法都实现
- 一个抽象类实现接口,可以不用实现接口的方法
- 接口中的属性,
只能是 final
的,而且是 public static final 修饰符 - 一个类同时可以实现
多个接口
(理解为接口是对于Java单继承机制的一种补充)
interface B {
int n = 10;
void b();
}
interface C {
void c();
}
class A implements B,C {//Pig类同时实现了接口IB和IC
@Override
public void b() {
}
@Override
public void c() {
}
}
接口和抽象类使用对比
接口实现场景
- 实现类和它的抽象类之前具有 “is-a” 的关系, 接口只需要满足 like - a 的关系
继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。
抽象类实现场景
- 父类只知道其子类应该包含怎样的方法,不能准确知道这些子类如何实现这些方法的情况下,使用抽象类
区别对比
文末结束!!