這一篇部落格主要是對軟工前一階段學習的總結,主要是對Java的學習總結,包括三部分:Java的繼承、多型和介面
Java的繼承
繼承是物件導向的三大特性之一,能夠實現軟體的複用。
Java子類繼承父類的語法格式如下
class SubClass extends SuperClass
{
//類定義部分
}
Java繼承的特點:
- Java只有單繼承,即每個子類都只有一個直接父類。
- 子類繼承父類,可以獲得父類全部成員變數和方法
- 子類不能獲得父類的構造器
子類重寫父類的方法
- 子類和父類的方法名,形參列一樣
- 方法的重寫遵循“兩小一大”的原則,即子類返回值型別應比父類返回值型別更小或相等;子類方法宣告丟擲的異常應比父類方法宣告丟擲的異常更小或相等;子類方法的訪問許可權應比父類方法的訪問許可權更大或相等
- 當子類覆蓋了父類方法後,子類的物件無法訪問父類中被覆蓋的方法,但可以在子類方法中呼叫父類中被覆蓋的方法,使用super.方法名(被覆蓋的如果是類方法, 則用父類類名)
呼叫父類構造器
- 子類構造器呼叫父類構造器用super呼叫來完成,且必須出現在子類構造器執行體中的第一行
- 父類構造器總是在子類構造器之前執行
下面是一個Java繼承的簡單例子,該例子中包含,類的繼承、子類重寫父類方法、super的使用
package example;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age=age;
}
public int getAge() {
return age;
}
public void sayHello() {
System.out.println("Hello,I am "+name);
}
}
class Student extends Person{
private int number;
private String school;
public void SetNumber(int number) {
this.number=number;
}
public int getNumber() {
return number;
}
public void setSchool(String school) {
this.school=school;
}
public String getSchool() {
return school;
}
public Student(String name,int age,int number,String school) {
super(name,age);
this.number=number;
this.school=school;
}
public void sayHello() {
System.out.println("I am a student of "+school+"and my name is "+getName());
}
}
public class ExampleOfExtend {
public static void main(String[] args) {
Student stu=new Student("Xiao wang", 19, 123, "Fzu");
System.out.println(stu.getName());
System.out.println(stu.getAge());
System.out.println(stu.getNumber());
System.out.println(stu.getSchool());
stu.sayHello();
}
}
以上是我在學習Java繼承中總結出來的一些知識點,還包括了自己寫的一個例子。
Java的多型
Java允許把一個子類物件直接賦給父類引用變數,無需任何型別轉換。如果子類物件賦給父類的引用變數,當執行呼叫該引用變數的方法時,其方法行為總是表現出子類方法的行為特徵,而不是父類方法的特徵,這就可能出現:相同型別的變數、呼叫同一個方法時呈現出不同的行為特徵,這就是多型。
下面將結合一個例子來講解多型
class BaseClass
{
public int book = 6;
public void base()
{
System.out.println("父類的普通方法");
}
public void test()
{
System.out.println("父類的被覆蓋的方法");
}
}
class SubClass extends BaseClass
{
public String book = "Java";
public void sub()
{
System.out.println("子類的普通方法");
}
public void test()
{
System.out.println("子類的覆蓋父類的方法");
}
}
public class ExampleOfPolymorphism {
public static void main(String[] args)
{
BaseClass pl= new SubClass(); //將子類物件賦給父類變數,可能發生多型
System.out.println(pl.book); //訪問的是父類物件的例項變數
pl.base(); //將執行從父類繼承到的base()方法
pl.test(); //將執行從子類的test()方法
// pl.sub();這一行程式碼編譯時將會出現錯誤,因為pl的編譯型別是BaseClass,BaseClass類沒有提供sub方法
}
}
上面程式定義了一個BaseClass類,有一個變數book,兩個方法:base和test;一個子類SubClass,有一個同名變數book,兩個方法:sub、改寫父類方法的test。在主函式中宣告瞭BaseClass型別的po,但實際賦給這個變數的是SubClass型別。通過pl.book呼叫的是父類的變數,表明物件的例項變數不具有多型性。其他執行時所呼叫的方法已經寫在程式碼註釋上,不再贅述。
還有一點要提的是引用型別的轉換。子類的物件可以直接賦給父類的引用變數,無需經過任何轉型(向上轉型)。如果要將一個父類物件轉換成子類型別,則這個物件必須實際上是子類例項才行。
以上就是我在學習Java多型時的總結和自己寫的一個例子。
java介面
介面裡不能包含普通方法,介面裡的所有方法都是抽象方法,介面是從多個相似類中抽象出來的規範。Java8對介面進行了改進,允許在介面中定義預設方法,預設方法可以提供方法實現。
Java中介面的定義
[修飾符] interface 介面名 extends 父介面1,父介面2...{
零到多個常量定義...
零到多個抽象方法定義...
零到多個內部類、介面、枚定義...
零到多個預設方法或類方法定義...//Only in java8
}
對比類定義,介面定義少了初始化塊和構造器,且介面成員變數只能是靜態常量(成員變數總是是public static final
來修飾,可以省略),介面方法只能是抽象方法、類方法或預設方法(方法總是用public abstract
來修飾,可以省略)。介面裡的變數都必須指定初始值,介面裡普通方法不能有方法體實現,類方法和預設方法必須有方法體實現。一個Java檔案最多隻能有一個public修飾的介面,如果定義了一個public介面,需與主檔名一致。
下面是一個簡單的介面定義和繼承的例子
interface interfaceA{
int a=5;
void testA();
}
interface interfaceB extends interfaceA{ //interfaceB繼承了interfaceA
int b=6;
void testB();
}
public class ExampleOfPolymorphism {
public static void main(String[] args)
{
System.out.println(interfaceB.a);
System.out.println(interfaceB.b);
}
}
以上是我學習Java介面中的一些總結和一個簡單的例子。
總結
通過《軟工》,自己在以前的基礎上學習了Java,但是還是隻停留在一個很淺的水平上,像Java的AWT程式設計和Swing程式設計還沒學習,希望在接下去的半學期,自己能多多少少再學一些。