抽象類和接口的區(qū)別:
抽象類:
1.抽象類是一個類
2.定義抽象類時,使用abstract關(guān)鍵字修飾,繼承抽象類時,使用extends
3.只能繼承一個抽象類
4.抽象類中可以有抽象方法,也可以沒有抽象方法,抽象類中可以有具體的方法
接口:
1.接口不是一個類
2.定義接口時使用interface,實現(xiàn)接口時使用implements
3.可以實現(xiàn)多個接口
4.jdk1.8之前接口中的方法都是抽象方法,jdk1.8之后接口中可以有非抽象方法、靜態(tài)方法
抽象類和接口的相同點:
1.都不可以實例化,即不能使用new關(guān)鍵字來實例化對象
2.子類/實現(xiàn)類需要實現(xiàn)抽象類父類/要實現(xiàn)的接口中的所有抽象方法,如果沒有實現(xiàn)它們中的全部抽象方法,子類/實現(xiàn)類需要定義成抽象類
3.可以引用抽象類/接口,指向子類/實現(xiàn)類---》形成多態(tài)
抽象方法:只有方法體,沒有具體實現(xiàn)。eg:
public abstract void a();
jdk1.8之前和jdk1.8之后,接口區(qū)別:
jdk1.8之前接口中有:1.常量 2.抽象方法
jdk1.8之后接口中有:1.常量 2.抽象方法 3.非抽象方法 4.靜態(tài)方法
常量:public static final
抽象方法:public abstract
非抽象方法:public default
靜態(tài)方法:public static
注意:接口中的靜態(tài)方法不能被繼承。實現(xiàn)類實現(xiàn)接口時,重寫接口中的的非抽象方法不可以帶關(guān)鍵字default
抽象類:
abstract public class Person {
int age;
String name;
public void eat(){
System.out.println("能吃是福");
}
public abstract void sleep();
}
jdk1.8之前接口:
public interface TestInterface01 {
//常量
public static final int NUM = 10;
//抽象方法:
public abstract void a();
public abstract void b(int num);
public abstract int c(String name);
}
interface TestInterface02{
public abstract void e();
public abstract void f();
}
繼承父類、實現(xiàn)接口:
class Student extends Person implements TestInterface01, TestInterface02{
@Override
public void a() {
System.out.println("------aaa");
}
@Override
public void b(int num) {
System.out.println("------bbb");
}
@Override
public int c(String name) {
return 110;
}
@Override
public void e() {
System.out.println("--------eee");
}
@Override
public void f() {
System.out.println("-------fff");
}
@Override
public void sleep() {
System.out.println("我喜歡睡硬板床");
}
}
class Test{
//這是一個main方法,程序的入口
public static void main(String[] args) {
//10.接口不能創(chuàng)建對象:
//TestInterface02 t = new TestInterface02();
//抽象類不能創(chuàng)建對象
//Person p = new Person();
Person p = new Student(); // 父類指向子類---》多態(tài)
TestInterface02 t = new Student(); //接口指向?qū)崿F(xiàn)類---》多態(tài)
//11.接口中常量如何訪問:
System.out.println(TestInterface01.NUM);
System.out.println(Student.NUM);
Student s = new Student();
System.out.println(s.NUM);
TestInterface01 t2 = new Student();
System.out.println(t2.NUM);
}
}
jdk1.8之后接口:
package com.test12;
/**
* jdk1.8之后,除了常量,抽象方法,還新增了非抽象方法、靜態(tài)方法
* 常量:public static final
* 抽象方法:public abstract
* 非抽象方法:public default
* 靜態(tài)方法:public static
*/
public interface TestInterface {
//常量
public static final int NUM = 10;
//抽象方法
public abstract void a();
//非抽象方法
public default void b(){
System.out.println("-----TestInterface---b()---");
}
//靜態(tài)方法
public static void c(){
System.out.println("這是TestInterface的靜態(tài)方法c()");
}
}
package com.test12;
public class Demo implements TestInterface{
@Override
public void a() {
System.out.println("Demo重寫接口TestInterface的a()方法");
b();
//調(diào)用接口中的方法
TestInterface.super.b();
}
@Override
public void b() {
System.out.println("Demo重寫接口TestInterface中的b()方法");
}
public static void c(){
System.out.println("Demo中的靜態(tài)方法c()");
}
}
class TestDemo{
//這是一個main方法,程序的入口
public static void main(String[] args) {
Demo d = new Demo();
d.a();
Demo.c();
TestInterface.c();
}
}
打印結(jié)果:
Demo重寫接口TestInterface的a()方法
Demo重寫接口TestInterface中的b()方法
-----TestInterface---b()---
Demo中的靜態(tài)方法c()
這是TestInterface的靜態(tài)方法c()