目錄
第九章、抽象類
一、抽象方法和抽象類
1.抽象類
2.抽象方法
3.使用抽象類
4.抽象類繼承關系
5.避免沖突final不能和abstract同時修飾同一個類
二、案例:面積和周長
第十章、接口(重點)
一、接口的定義
1.表現
二、接口的實作
三、接口的繼承
四、接口和抽象類的差別
1.相同點:
2.不同點:
五、1.8新特性,可以存在方法體
1.default,必須有方法體
2.static 修飾的方法可以有方法體
六、練習
第九章、抽象類
一、抽象方法和抽象類
抽象:abstract修飾,沒有實體,其實作内容交給子類完成
1.抽象類
- -由abstract修飾的類,有抽象方法的類就是抽象類
- - 有抽象方法的類,一定是抽象類
- - 抽象類可以有非抽象方法
- -一個類沒有抽象方法也可以修飾為抽象類
- - 抽象類不能被執行個體化
//抽象類
public abstract class Shape {
}
public class TestShape {
public static void main(String[] args) {
new Shape();//錯誤
}
}
2.抽象方法
- - 沒有方法體的方法,稱為抽象方法
- -不需要實作功能,隻需要給出定義的方法
public abstract class Shape {
//抽象方法
public abstract void area();//由子類實作内容
public abstract void perimeter();//由子類實作内容
}
3.使用抽象類
- 通過繼承關系實作定義在抽象類中的所有抽象方法
public abstract class Shape {
public abstract void area();//由子類實作内容
public abstract void perimeter();//由子類實作内容
}
public class Circle extend Shape {
@Override
public void area() {
System.out.println("圓的面積:"+4*4*3.14);
}
}
public class Square extend Shape {
@Override
public void area() {
System.out.println("正方形的面積:"+4*4);
}
}
4.抽象類繼承關系
- -一個抽象類可以繼承另一個抽象類
- -子類必須實作所有繼承關系中沒有被實作的方法
5.避免沖突final不能和abstract同時修飾同一個類
public class Circle extend Shape {
//報錯,Circle必須聲明為抽象類,并完成抽象方法
}
解決1:目前類變成抽象類
public abstract class Circle extend Shape {
}
解決2:實作父類中的抽象方法
public class Circle extend Shape {
@Override
public void area() {
System.out.println("圓的面積:"+4*4*3.14);
}
}
二、案例:面積和周長
public abstract class Shape {
public abstract void area();//由子類實作内容
public abstract void perimeter();//由子類實作内容
}
public abstract class Circle extends Shape {
public abstract void show();//由子類實作内容
}
public class Square extends Shape{
@Override
public void area() {
System.out.println("正方形的面積:"+4*4);
}
@Override
public void perimeter() {
System.out.println("正方形的周長:"+4*4);
}
}
public class CircleImpl extends Circle {
@Override
public void area() {
System.out.println("圓的面積:"+4*4*3.14);
}
@Override
public void perimeter() {
System.out.println("圓的周長:"+4*2*3.14);
}
@Override
public void show() {
System.out.println("show.....");
}
}
public class TestShape {
public static void main(String[] args) {
CircleImpl circle = new CircleImpl();
circle.area();
circle.perimeter();
Square square = new Square();
square.area();
square.perimeter();
}
}
第十章、接口(重點)
一、接口的定義
- 用interface修飾的為接口
- 接口中的方法沒有方法體---->預設為public abstrace修飾
- 接口是一種特殊的抽象類,它的功能性更加“純粹”
- 接口中的屬性都為常量,預設為public static final修飾
- 接口不能執行個體化
1.表現
- 用interface修飾的為接口
public interface Shape {
}
- 接口中的方法沒有方法體---->預設為public abstrace修飾
public interface Shape { public void area(); public void perimeter(); }
- 接口是一種特殊的抽象類,它的功能性更加“純粹”
public interface Shape {
public void area();
public void perimeter();
public void addUser();
public void delUser();
public void queryUser();
public void updUser();
}
- 接口中的屬性都為常量,預設為public static final修飾
public interface Shape {
public static final int USERNAME = 10; //必須初始化,斜體
public void area();
public void perimeter();
}
二、接口的實作
- 通過實作類采用implement關鍵字實作定義在接口中的方法
- 實作類實作接口時必須實作接口中定義的所有方法
- 接口與接口之間存在繼承關系,同樣實作類在實作時必須實作其所有關系中的方法
- 一個實作類可以實作多個接口
public interface SuperShape {
void show();
}
}
public interface Shape extend SuperShape{
void area();
void perimeter();
}
public class Circle implement Shape,SuperShape {
@Override
public void area() {
System.out.println("area");
}
@Override
public void perimeter() {
System.out.println("perimeter");
}
@Override
public void show() {
System.out.println("show....");
}
}
三、接口的繼承
- 接口之間可以有繼承關系,但實作類實作某一接口時,必須實作所有繼承關系中的抽象方法。
- 一個類可以實作多個接口,同樣也必須實作多個接口中定義的抽象方法
class UserImp implements UserDao,UserMpper{ }
四、接口和抽象類的差別
1.相同點:
- (1)都不能被執行個體化
- (2)接口的實作類或抽象類的子類都隻有實作了接口或抽象類中的方法後才能執行個體化。
2.不同點:
- (1)接口隻有定義,不能有方法的實作,java 1.8中可以定義default方法體,而抽象類可以有定義與實作,方法可在抽象類中實作。
- (2)實作接口的關鍵字為implements,繼承抽象類的關鍵字為extends。一個類可以實作多個接口,但一個類隻能繼承一個抽象類。是以,使用接口可以間接地實作多重繼承。
- (3)接口強調特定功能的實作,而抽象類強調所屬關系。
- (4)接口成員變量預設為public static final,必須賦初值,不能被修改;其所有的成員方法都是public、abstract的。抽象類中成員變量°預設default,可在子類中被重新定義,也可被重新指派;抽象方法被abstract修飾,不能被private、static.synchronized和native等修飾,必須以分号結尾,不帶花括号。
五、1.8新特性,可以存在方法體
1.default,必須有方法體
default void show() {
}
2.static 修飾的方法可以有方法體
static void show() {
}