抽象類-求圖形面積
多個類,有相同的方法,可以抽出一個父類出來,把相同的方法放到父類當(dāng)中
1.每一個圓形都有面積
不同圖形求面積的算法不一樣
每一個圖形子類,都必須覆蓋這個方法,在每個里面寫上自己的方法體
2.在這個圖形類當(dāng)中,定義了getArea方法,因為不同的圖形的算法是不一樣的
父類不知道方法體里面該怎么寫,本來不需要方法體的
子類必須得要覆蓋此方法
在定義的時候,不要方法體了{...}
class Graph {
Double getArea() {
return 0.0;
}
}
// 圓形
class Circle extends Graph {
private Integer r;
Circle(Integer r) {
this.r = r;
}
// 求面積
Double getArea() {
return 3.14 * r * r;
}
}
// 矩形
class Rectangle extends Graph {
private Double width;
private Double height;
Rectangle(Double width, Double height) {
this.width = width;
this.height = height;
}
Double getArea() {
return this.width * this.height;
}
}
// 三角形
class Triangle extends Graph {
private Integer a;
private Integer b;
private Integer c;
Triangle(Integer a, Integer b, Integer c) {
this.a = a;
this.b = b;
this.c = c;
}
}
public class Test {
// 求圓,矩形,三角形面積
public static void main(String[] args) {
Circle cir = new Circle(233);
System.out.println(cir.getArea());
Rectangle r = new Rectangle(12.5, 123.3);
System.out.println(r.getArea());
Triangle t = new Triangle(12, 22, 33);
System.out.println(t.getArea());//0.0
}
}
抽象方法
在方法前面添加了一個關(guān)鍵字abstract
特點:
1.抽象方法是沒有方法體的
2.抽象方法要定義在抽象當(dāng)中 或 接口 (在類前面添加上一個abstract 就成為了抽象類)
3.抽象方法不能是私有的private,不能使用final修飾,不能同時使用static
只要使用了抽象方法,子類必須要覆蓋此方法,抽象方法沒有方法體
abstract class Graph {
abstract Double getArea();//抽象方法
}
抽象類
其實是一個不完整的類,需要作為一個父類,子類才能完成對應(yīng)的功能
抽象類必須得要有子類才行(抽象類一般都當(dāng)作父類來繼承 )
抽象類當(dāng)中的注意點:
1.抽象類是不能直接創(chuàng)建對象的,但是抽象類有構(gòu)造器
2.抽象類中可以有抽象方法,也可以有非抽象方法(普通方法)
3.子類沒有去覆蓋抽象方法 把子類也變成抽象類
4.構(gòu)造方法不能定義為私有的(抽象方法必須得要讓子類繼承之后,才能實現(xiàn)內(nèi)部的方法體
子類繼承的話,先去調(diào)用父類的構(gòu)造方法
)
5.抽象類不能使用final來去修飾
命名:抽象類命名時,都喜歡在前面加上一個Abstract
抽象類與普通類有什么區(qū)別?
普通的類你有的(方法,字段,構(gòu)造器),抽象類都有
抽象類不能創(chuàng)建對象,抽象類可以包含抽象方法,也可以包含非抽象方法
抽象類必須得有子類才有意義
接口概念
什么是接口?
硬件接口:指的是兩個硬件設(shè)備之間的連接方式.硬件接口既包括物理上的接口,比如我們所說的usb接口
在java中,接口表示一種規(guī)范/約束/要求實現(xiàn)者必須遵守該規(guī)范:用來約束使用者應(yīng)該怎么做
在java中接口也是表示一種規(guī)范,使用抽象方法來定義一組功能
必須要實現(xiàn)者給提供方法的實現(xiàn)(誰遵守誰提供方法)
接口的定義 命名規(guī)范:在名字前面添加I 在后面添加able
例如:IUsbable
interface 接口名稱{
} //像類一樣定義,接口也會生成對應(yīng)的字節(jié)碼
接口是一個特殊的抽象類 內(nèi)部的abstract 可以省略不寫
如果沒有在方法面前添加abstract 會在編譯時自動添加上
interface IUsbable{
//接口
String name = "wzb"; //默認是 public static final 常量
void trans();
//public abstract void trans();
}
接口注意點
1.接口是沒有構(gòu)造器的,接口是不能創(chuàng)建對象的
2.接口當(dāng)中定義變量,都是全局的靜態(tài)常量
String name = "myxq";
通過反編譯工具之后查看
public static final String name;
3.接口當(dāng)中定義的方法都是公共的抽象的方法
void trans();
//public abstract void trans();
4.接口當(dāng)中可以定義內(nèi)部類,內(nèi)部類也是public abstract
5.接口是可以繼承的,他是可以多繼承的
interface 接口名稱 extends 繼承的接口名,繼承的接口名
類是不能多繼承的
接口繼承的時候,不會去覆蓋父接口的方法
//爬行動物
interface IWorkable {
// 接口
void walk();
}
// 水生動物
interface ISwimable {
void swim();
}
// 兩棲動物
interface Iamphibiousable extends ISwimable, IWorkable {
}
接口的實現(xiàn)
類名 extends 其他的類(只能繼承一個類) implements 接口(可以多個接口)
class Cat extends Animal implements IWorkable,ISwimable {}
貓類繼承了動物類實現(xiàn)了 IWorkable ,ISwimable 多個接口
在是實現(xiàn)類當(dāng)中必須得要去覆蓋接口當(dāng)中定義的方法
實現(xiàn)類的方法必須是public
Cat cat= new Cat();
cat.walk();
interface IWolkable 接口也可以稱為它的父類 父接口
多態(tài)寫法,把子類對象賦值給父類類型
IWorkable cat1 = new Cat();//面向接口編程
cat1.walk(); 多態(tài)運行時表現(xiàn)出來的還是子類的特征 (編譯時,看左邊,運行時,看右邊)
接口流程
1.創(chuàng)建接口規(guī)范
2.定義接口實現(xiàn)類
3.創(chuàng)建對象
接口與抽象類的區(qū)別
相同點:
1.都是被其他類實現(xiàn)或者被繼承的(不然沒有存在的意義)
2.都不能實例化
3.都可以定義抽象方法,定義的抽象方法必須得要覆蓋.
不同點:
1.接口是沒有構(gòu)造器的,抽象類當(dāng)中是有構(gòu)造器的(有也不能實例化對象)
2.抽象類當(dāng)中可以包含普通方法和抽象方法,接口當(dāng)中只能有抽象方法,不能有普通方法(帶有方法體)
3.接口當(dāng)中默認成員變量,public static final 變量;靜態(tài)常量 抽象類當(dāng)中 默認是包訪問權(quán)限
4.方法:接口當(dāng)中默認方法 public abstract 方法名; 抽象類當(dāng)中 默認權(quán)限
接口當(dāng)中成員變量
interface IWalkable{
String name ="wzb";
void walk();
}
反編譯之后
interface IWalkable
{
public static final String name = "wzb";
public abstract void walk();
}
面向接口編程
面向接口編程:把實現(xiàn)類對象賦值給接口類型的變量
多態(tài)的好處:屏蔽了不同類之間實現(xiàn)的差異,從而達到通用編程
//主板插入各種usb設(shè)備
interface Iusb {
(public abstract ) void swpData();
}
class MotherBoard {
void puluginIn(Iusb usb) {
usb.swpData();
}
}
class Mouse implements Iusb {
public void swpData() {
System.out.println("鼠標移動");
}
}
class KeyBoard implements Iusb {
public void swpData() {
System.out.println("打字");
}
}
public class Test {
public static void main(String[] args) {
Iusb k = new KeyBoard();
Iusb m = new Mouse();
MotherBoard b = new MotherBoard();
b.puluginIn(m);
b.puluginIn(k);
}
}