一.抽象类
1.抽象类的定义
如果一个类中存在抽象方法,那么该类就必须声明为抽象类
2.抽象类的注意事项
1,抽象类不能实例化(不能创建对象)
2,抽象类中不一定有抽象方法,也可以有实例方法。但有抽象方法的类一定是抽象类
3,可以有构造方法
3.有关抽象类的说明
1.抽象方法不能包含在非抽象类中,在实现抽象类的子类中,必须实现所有的抽象方法,而且要注意的是抽象方法是非静态的。
2.抽象类是不能使用new操作来初始化的,但是仍然可以有构造方法,这个构造方法在它的子类的构造方法中调用。
3.包含抽象方法的类必须是抽象的,但是可以定义一个不含抽象方法的抽象类。
4.子类可以覆盖父类的方法并将它定义为abstract。
5.即使子类的父类是具体的,这个子类也可以是抽象的。
4.代码示例
1.定义抽象类
/**
* @author WXF
* @data
* @description 定义合法的抽象类
*/
/** 文件名 A.class */
public abstract class A {
}
/** 文件名 A.class */
public abstract class A {
public abstract void unfinished();
}
/** 文件名 xxx.class */
abstract class A {
}
/** 文件名 xxx.class */
abstract class A {
abstract void unfinished();
}
/** 文件名 xxx.class */
abstract class A {
public void unfinished(){
}
}
/** 文件名 xxx.class */
abstract class A {
protected void unfinished(){
}
}
2.继承抽象类
/**
* @author WXF
* @data
* @description 继承抽象类
*/
/** 文件名 Debug.class */
public class Debug {
/** Main method */
public static void main(String[] args) {
Children child = new Children();
child.print(); // 调用子类重写方法
child.test(); // 调用父类的方法
}
}
/** 抽象类 */
abstract class Parent {
/* 抽象方法 */
abstract void print();
/* 非抽象方法 */
public void test() {
System.out.println("Parent\'s method");
}
}
/** 实现抽象类的子类 */
class Children extends Parent {
/* 重写父类的抽象方法 */
@Override
public void print() {
System.out.println("Hello World!");
}
}
二.接口
1.接口的定义
当一个类中的所有方法都是抽象方法的时候,我们就可以将其定义为接口。接口也是一种引用数据类型,它比抽象类还要抽象。
2.接口特性
1.接口中每一个方法也是隐式抽象的,接口中的方法也会被隐式的指定为public abstract。
2.接口中可以含有变量,但是接口中的变量会被隐式的指定为public static final 变量。
3.接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
4.当类实现接口的时候,类要实现接口中所有的方法,否则类必须声明为抽象类。
3.代码示例
1.定义接口
/**
* @author WXF
* @data
* @description 接口定义
*/
/** 文件名 A.class */
public interface A {
/* 变量 */
public static final int a = 0;
/* 方法 */
public abstract void method();
}
/** 上下两个接口的定义是等价的 */
public interface A {
/* 变量 */
int a = 0;
/* 方法 */
void method();
}
2.接口的实现
/**
* @author WXF
* @data
* @description 接口实现
*/
/** 文件名 Debug.class */
public class Debug {
/** Main method */
public static void main(String[] args) {
Pen pen = new Pen(); // 调用实现接口的类
pen.yellow(); // 调用改类方法
}
}
/** 接口 */
interface Color {
/* 抽象方法 */
void yellow();
}
/** 实现接口 */
class Pen implements Color {
/* 实现抽象方法 */
@Override
public void yellow() {
System.out.println("My pen color is yellow");
}
}
三.抽象类和接口的区别
尽管抽象类和接口之间存在较大的相同点,甚至有时候还可以互换,但他们直接仍具有差异之处。下面将从语法层次和设计层次两个方面对抽象类和接口进行阐述。