Java基礎 快速學習(三)

路人暴脾氣發表於2017-06-08

注意:本系列部落格是在作者已經有一年多的C++經驗的基礎上學習Java的個人總結,可能並不適合所有看到這篇部落格的人。

一、繼承

Java繼承的話套路和c++大體是一樣的...,當然如果路過的盆友不懂繼承機制以及為什麼要有繼承的話請點選這裡->https://www.baidu.com/

直接上示例程式碼,讀者可以大致看看->然後在跟著程式碼後面的解釋 ->再次精讀

//base.java

package inherit;

public class base
{
	private int id;
	protected int math;
	protected int Chinese;
	
	public base(int id)   //有參構造器
	{
		this.id=id;   //this 用來指向自身  這裡用來區分  形參的id與類的成員id
	}
	
	public int re_id()
	{
		return id;
	}
	
	public int total_points()  //總分
	{
		return math+Chinese;
	}
	
}

//boy.java
package inherit;

public class boy extends base   //用關鍵字 extends 繼承 
{
	private int circuit;
	
	public boy(int id)    //建構函式
	{
		super( id);       //用super呼叫父類的構造器  傳入引數
	}
	
	public int total_points()
	{
		int a=super.total_points();    //用surper呼叫父類的方法
		return a+circuit;
	}
	
	public void set_cir(int g)
	{
		circuit=g;
	}
	
	public void set_math_ch(int ma,int ch)
	{
		math=ma;
		Chinese=ch;
	}
	
	public void set_math_ch(int ma)
	{
		Chinese=60;
		math=ma;
	}
	
	public static void main(String[] args)
	{
		boy b =new boy(1);
		System.out.println(b.re_id());   //使用基類的方法
		b.set_math_ch(75);   //使用只有一個引數的過載函式
		b.set_cir(80);
		System.out.println(b.total_points());  
	}
}

1.首先java中是通過關鍵字extends實現繼承的。值得注意的的是在Java中實現的繼承機制同C++中的公有繼承一樣!並且java不可以多繼承!


2.構造機制和c++略有不同,在C++中如果父類的構造器是有引數的,那麼在子類中的構造器應該通過成員初始化列表的的語法來完成引數傳遞的工作。在Java中通過super這個關鍵字在子類構造器中顯示呼叫並傳入引數!


3.Java支援成員函式過載和子類重寫父類的函式。但是不支援直接像c++中那樣進行預設引數,不過還是有對策的,可以利用過載巧妙的實現預設引數,具體可以參考上面程式碼中的set_math_ch函式!


4.this的用法同C++!不過有種很通用的技巧,用於方法內的區域性變數與物件的資料域變數同名的情況!用this可以起到表示當前物件的資料域變數的作用。可以參考程式碼中的 this.id=id;  


5.super這個關鍵字用法可以總結如下

  • 【1】呼叫父類的構造方法;
  • 【2】呼叫父類的方法(子類覆蓋了父類的方法時);
  • 【3】訪問父類的資料域(可以這樣用但沒有必要這樣用)

  • 6.final關鍵字上一篇文章中提到過他相當於c++中的const         他還有另外的用法   就是 宣告類可以把類定義為不能繼承的,即最終類;或者用於修飾方法,該方法不能被子類重寫。

  • 7.當然也支援父類指向子類  如 base b=new boy();

  • 8.最後還有一點就是java中所有類都是Object的直接或者間接之類。如果一個類沒有顯示的申明他的父類是誰,那麼他的父類就是Object。

  • 二、抽象類

  • 1.抽象類除了不能例項化物件之外,類的其它功能依然存在,成員變數、成員方法和構造方法的訪問方式和普通類一樣。由於抽象類不能例項化物件,所以抽象類必須被繼承,才能被使用。

  • 2.使用Abstract關鍵字來宣告這個類為抽象類,Abstract關鍵字同樣可以用來宣告抽象方法,抽象方法只包含一個方法名,而沒有方法體。抽象方法沒有定義,方法名後面直接跟一個分號,而不是花括號。

  • 3.抽象類的意義,這裡只簡單的總結一下,等學習完Java類的全部語法在進行系統的總結。
  • 在物件導向的程式設計中,主要思想之一就是用類來描述這個世界的任何事物。不過這個世界的事物是可以歸類的,比如貓、狗、大象。又比如我們鍵盤中的鍵  如space鍵   它既是空格鍵又是很多播放器的暫停鍵等等。我們可以按照歸類他有聯絡的事物抽象出來,寫成抽象類。抽象類並不指向特定的某個事務,他是抽象的,他代表著一類事物共有的特徵!

  • 4.下面用一個例項程式碼說明,比如某學校要收教材費,有高一到高三3個年級。教務辦發出通知讓各個年級彙總他們的教材費。那麼這個類就可以做如下抽象
  •  
    /*抽象類*/
    package abstraction;
    
    public abstract class abstraction_jw
    {
    	protected int ch;
    	protected int math;
    	protected int Eng;
    	
    	protected int ch_ma_en_money()
    	{
    		return ch+math+Eng;
    	}
    	
    	public abstract int all_money();
    	
    }
    

    /*高一類*/
    package abstraction;
    
    public class one extends abstraction_jw
    {
    
    	int history;  //高一有歷史課
    	
    	public one()
    	{
    		//高一書的定價
    		ch=50;
    		math=40;
    		Eng=70;
    		history=30;
    	}
    	
    	@Override
    	public int all_money()
    	{
    		return ch_ma_en_money()+history;
    	}
    
    }
    

    /*高二類*/
    package abstraction;
    
    public class tow extends abstraction_jw
    {
    	int physics;  //高二有物理課
    
    	public tow()
    	{
    		//高二的書的定價
    		math=80;
    		ch=70;
    		Eng=60;
    		physics=100;
    	}
    	@Override
    	public int all_money()
    	{
    		// TODO Auto-generated method stub
    		return ch_ma_en_money()+physics;
    	}
    
    }
    

  • /*入口*/
    package abstraction;
    
    public class jw_main
    {
    	public static void main(String[] args)
    	{
    		abstraction_jw one_m=new one();
    		abstraction_jw tow_m=new tow();
    		
    		System.out.println("高一:"+one_m.all_money());
    		System.out.println("高二:"+tow_m.all_money());
    	}
    }
    

----------------------------------------------------------------
本系列文章:

相關文章