本週學習了抽象類、繼承、多態、接口的相關知識。java
編寫一個類時,會給該類定義一些方法,這些方法是用來描述功能和具體實現的方式,這些方法都有方法體
例如:一個圖形類應該有周長的方法,可是不一樣的圖形求周長方法不同。分析事物,發現共性,就出現了向上抽取。
方法的聲名相同,可是方法功能主體不一樣,這樣就能夠向上抽取,但只是抽取方法聲名,但不抽取方法主體,稱這個方法就是抽象方法
抽象函數類必須被abstract關鍵字修飾,被abstract關鍵字修飾的類就是抽象類
抽象方法定義格式:
public abstract 返回值類型 方法名(參數);
抽象類定義的格式:編程
abstract class 類名{ }
抽象類和抽象方法都要被abstract修飾,抽象方法必定要定義在抽象類中
抽象類不能夠直接建立對象
只有覆蓋了抽象類中全部的抽象方法後,其子類才能夠建立對象。不然該子類仍是一個抽象類
抽象類中是能夠不定義抽象方法,不讓該類建立對象,方法能夠直接讓子類去使用
Private :私有的方法子類是沒法繼承的,也不存在覆蓋
Abstract和private也是不能夠一塊兒使用的數組
Java接口(Interface),是一系列方法的聲明,是一些方法特徵的集合,一個接口只有方法的特徵沒有方法的實現,所以這些方法能夠在不一樣的地方被不一樣的類實現,而這些實現能夠具備不一樣的行爲(功能)。
接口定義的通常形式爲:
[訪問控制符]interface <接口名> {
類型標識符final 符號常量名n = 常數;
返回值類型 方法名([參數列表]);
…
}
一、Java接口中的成員變量默認都是public,static,final類型的(均可省略),必須被顯示初始化,即接口中的成員變量爲常量(大寫,單詞之間用"_"分隔)
二、Java接口中的方法默認都是public,abstract類型的(均可省略),沒有方法體,不能被實例化
三、Java接口中只能包含public,static,final類型的成員變量和public,abstract類型的成員方法
四、接口中沒有構造方法,不能被實例化
五、一個接口不能實現(implements)另外一個接口,但它能夠繼承多個其它的接口
六、Java接口必須經過類來實現它的抽象方法
七、當類實現了某個Java接口時,它必須實現接口中的全部抽象方法,不然這個類必須聲明爲抽象類
八、不容許建立接口的實例(實例化),但容許定義接口類型的引用變量,該引用變量引用實現了這個接口的類的實例
九、一個類只能繼承一個直接的父類,但能夠實現多個接口,間接的實現了多繼承. ide
實驗四 類的繼承
實驗目的
理解抽象類與接口的使用;
瞭解包的做用,掌握包的設計方法。
實驗要求
掌握使用抽象類的方法。
掌握使用系統接口的技術和建立自定義接口的方法。
瞭解 Java 系統包的結構。
掌握建立自定義包的方法。函數
實驗內容
(一)抽象類的使用
設計一個類層次,定義一個抽象類--形狀,其中包括有求形狀的面積的抽象方法。 繼承該抽象類定義三角型、矩形、圓。 分別建立一個三角形、矩形、圓存對象,將各種圖形的面積輸出。
注:三角形面積s=sqrt(p(p-a)(p-b)*(p-c)) 其中,a,b,c爲三條邊,p=(a+b+c)/2
2.編程技巧學習
(1) 抽象類定義的方法在具體類要實現;this
(2) 使用抽象類的引用變量可引用子類的對象;設計
(3) 經過父類引用子類對象,經過該引用訪問對象方法時實際用的是子類的方法。可將全部對象存入到父類定義的數組中。
(二)使用接口技術
1定義接口Shape,其中包括一個方法size(),設計「直線」、「圓」、類實現Shape接口。分別建立一個「直線」、「圓」對象,將各種圖形的大小輸出。
編程技巧code
(1) 接口中定義的方法在實現接口的具體類中要重寫實現;對象
(2) 利用接口類型的變量可引用實現該接口的類建立的對象。
1、
源代碼
package test; import java.util.Scanner; abstract class Shape { public abstract double getArea(); } class Triangle extends Shape{ private double a; private double b; private double c; public Triangle(double a,double b,double c){ this.setLenth1(a); this.setLenth2(b); this.setLenth3(c); } private void setLenth3( double a) { // TODO 自動生成的方法存根 this.a=a; } public double getLenth1() { return a; } private void setLenth2( double b) { // TODO 自動生成的方法存根 this.b=b; } public double getLenth2() { return b; } private void setLenth1( double c) { // TODO 自動生成的方法存根 this.c=c; } public double getLenth3() { return c; } public double getArea() { return Math.sqrt((a+b+c)/2*((a+b+c)/2-a)*((a+b+c)/2-b)*((a+b+c)/2-c)); } } class Rectangle extends Shape{ double h; double l; public Rectangle(double h,double l) { this.setHeight(h); this.setLenth(l); } private void setLenth( double h) { // TODO 自動生成的方法存根 this.h=h; } public double getHeight() { return h; } private void setHeight(double l) { // TODO 自動生成的方法存根 this.l=l; } public double getLenth() { return l; } public double getArea() { return h*l; } } class Circle extends Shape{ double r; public Circle(double r) { this.setRadius(r); } public void setRadius(double r) { this.r=r; } public double getRadius() { return r; } public double getArea() { return Math.PI*Math.pow(r,2); } } public class text{ public static void main(String[] args) { Shape rec = new Rectangle(30,50); Shape tri = new Triangle(4,4,5); Shape cir = new Circle(5); System.out.println("矩形面積:"+rec.getArea()); System.out.println("三角形面積:"+tri.getArea()); System.out.println("圓面積:"+cir.getArea()); } }
實驗截圖:
2、
源代碼
package test; import java.util.Scanner; interface Shape1{ public void size(); public abstract double getArea(); public abstract double getPerimeter(); } class Line implements Shape1{ private double Lenth; public Line(double Lenth) { this.setLenth(Lenth); } public double getLenth() { return Lenth; } public void setLenth(double Lenth) { this.Lenth = Lenth; } public double getPerimeter() { return this.Lenth; } public double getArea() { return 0; } @Override public void size() { // TODO 自動生成的方法存根 System.out.println("直線的周長:" + getPerimeter()); System.out.println("直線的面積:" + getArea()); } } class Circle1 implements Shape1{ private double r; public Circle1(double r) { this.setR(r); } public double getR() { return r; } public void setR(double r) { this.r = r; } public double getArea() { return Math.PI*Math.pow(r, 2); } public double getPerimeter() { return Math.PI*r*2; } public void size() { System.out.println("圓的周長:" + getPerimeter()); System.out.println("圓的面積:" + getArea()); } } public class test1{ public static void main(String[] args) { Shape1 sha1=new Circle1(5); Shape1 sha2=new Line(9); sha1.size(); sha2.size(); } }
實驗截圖
實驗遇到的問題:這個抽象類的構建與調用和接口定義和實現仍是容易弄混的,這個代碼敲了很久,總是出現代碼出現錯誤,要麼就返回類型異常,要麼就查找不到主類。一開始我用shape作主類,可是運行下一個程序的時候總是出現這個程序的運行結果。後來我就把test做爲公共實驗類就正常了。對這類知識仍是不熟悉,但對着書上的一些例子仍是能打出來的。