至此已經學習了一個學期的Java,我在這里總結一下學習內容,過程,和感悟。
從面向過程到面向對象,這是從學習C語言到學習Java最大的不同。面向過程就是分析出解決問題所需要的步驟,然后調用函數把這些步驟一一實現,使用的時候一個一個依次調用就可以了;而面向對象是把構成問題的事物分解成各個對象,建立對象來描敘某個事物在整個問題的步驟中的行為。這個本質區別相信大家早已有所體會。而Java的單一職責原則,開閉原則,封裝和繼承,多態思想則是學好Java所必須掌握的。(1)單一職責是應該有且只有一個原因引起類的變更,即一個職責一個接口,但是划分職責時並沒有一個標准,最終都是需要從實際的項目去考慮。因此我們在設計的時候,盡量單一,然后對於其實現類就要多方面的考慮。如果死套單一職責原則,則會增加很多類,給維護帶來不便。(2)開閉原則就是說對擴展開放,對修改關閉。在程序需要進行拓展的時候,盡量不去修改原有的代碼,實現一個熱插拔的效果,為了使程序的擴展性好,易於維護和升級。(3)封裝是指將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問。它能隱藏類的實例細節,方便修改代碼和實現功能。將實例變量標記為私有private變量,提供共有的getter與setter來控制存取動作,這樣能維持安全性(4)繼承則是子類繼承父類,子類擁有父類的所有屬性和方法(除了private修飾的屬性不能擁有),在父類中只定義一些通用的屬性和方法。子類自動繼承父類的屬性和方法,子類中可以定義特定的屬性和方法。或子類重新定義父類的屬性、重寫父類的方法可以獲得與父類不同的功能。從而實現了實現代碼的復用,使程序看起來更加簡潔。(5)多態就是對象的多種形態,父類的引用可以指向本類的對象,父類的引用可以指向子類的對象。創建本類對象時,調用的方法為本類方法;創建子類對象時,調用的方法為子類重寫的方法或者繼承的方法;且可向上或向下類型轉換。
學習的內容由淺入深,過程也越發困難。從一開始的掌握輸入輸出:Scannner sc=new Scanner(System.in); double a=sc.nextdoulbe();System.out.println(“a=”+a);完成簡單的java程序的編寫;到數據類型轉換,再到一些簡單方法的編寫:
double area(double r1) {
double S1=Math.PI*Math.pow(r1, 2);
return S1;
}這個很像C語言,也不難
再到類的調用:Cirle cirle=new Cirle();
double S1=cirle.area(a1);
System.out.println("該圓的面積為:"+S1);
class Cirle{
double area(double r1) {
double S1=Math.PI*Math.pow(r1, 2);
return S1;
}
double girth(double r1) {
double C=2*Math.PI*r1;
return C;
}
}本質上也很像C語言的函數調用
再到類的繼承:
abstract class Shape{
public Shape() {
}
public abstract double getArea();
public abstract boolean validate();
public String toString() {
return String.format("%.2f",getArea()).toString()+" ";
}
}
class Circle extends Shape{
private double radius;
public Circle() {
}
public Circle(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea() {
return Math.PI*Math.pow(radius, 2);
}
public boolean validate() {
if(radius<0)
return false;
else
return true;
}
}父類一般是abstract抽象類,子類要有關鍵字extends 繼承父類,使用super 關鍵字繼承父類屬性,訪問父類變量
再到多態:
public class Goods {
String name;
boolean p;
public void crossRiver() {
p=!p;
System.out.println(name+"在過河");
}
}
public class Vegetable extends Goods{
boolean p;
Vegetable(){
super.name="vegetable";
}
}
public static void main(String[] args) {
Farmer farmer=new Farmer();
Goods vegetable=new Vegetable();
farmer.crossRiver();
crossRiver(farmer,vegetable);
}一個類定義總的方法和屬性,其他的類再根據需要進行細化
再到字符串的相關使用:
StringBuffer sb = new StringBuffer();
sb.append("haha"); //添加字符串
sb.insert(2, "it");//在指定位置插入
sb.delete(1, 4);//刪除
sb.replace(1, 4, "cast");//替換指定范圍內的內容
String str = sb.toString();
再到正則表達式的相關使用:
1.[abc] : 表示可能是a,可能是b,也可能是c。
2.[^abc]: 表示不是a,b,c中的任意一個
3.[a-zA-Z]: 表示是英文字母
4.[0-9]:表示是數字
簡潔的字符表示
.:匹配任意的字符
\d:表示數字
\D:表示非數字
\s:表示由空字符組成,[ \t\n\r\x\f]
\S:表示由非空字符組成,[^\s]
\w:表示字母、數字、下划線,[a-zA-Z0-9_]
\W:表示不是由字母、數字、下划線組成
數量表達式
1.?: 表示出現0次或1次
2.+: 表示出現1次或多次
3.*: 表示出現0次、1次或多次
4.{n}:表示出現n次
5.{n,m}:表示出現n~m次
6.{n,}:表示出現n次或n次以上
使用Pattern p = Pattern.compile("a*b");進行實例化
Matcher類的實例化依賴Pattern類的對象Matcher m = p.matcher("aaaaab");按我的感受來說,正則表達式這一類的題目是最難的,因為往往涉及到很多類,計算,還要分很多情況,不僅僅是寫一個表達式,為了完成一項功能你還要去做很多別的添加。
再到界面基礎設計:
public void start(Stage stg) throws Exception{//Stage舞台
Button ok=new Button("OK");
Scene scene=new Scene(ok,200,200);//scene場景
stg.setTitle("My java Fx");
stg.setScene(scene);
stg.show();
stage.setTitle("new stage");
stage.setScene(newScene(newButton("cancle"),100,100));
stage.show();
}這些都不難,有點像規定死板的東西,你按照需要去設定就好了
再到在界面的基礎上設置動畫:
Button b1=new Button("roll");
Button b2=new Button("pause");
Button b3=new Button("stop");
b1.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent args) {
t.setCycleCount(Timeline.INDEFINITE);
t.play();
}
});
b2.setOnAction(e->{
if(t.getStatus()==Animation.Status.PAUSED) {
t.play();
}else {
t.pause();
}
});
b3.setOnAction(e->{
t.stop();
});
簡單動畫設計也很難,你要事先想好動畫的每一步,例如偏轉的角度,移動范圍,形狀,顏色,位置等,需要較嚴謹的數學思維。
總的來說,java語言的優點有簡單性、面向對象、分布式、解釋型、可靠、安全、平台無關、可移植、高性能、多線程、動態性等。但學起來Java比C語言難的多,功能也更強大,在學習Java的語法時發現Java的語法是類似c語言的,所以語法學習的比較輕松。但有幾個不容易搞清楚的關鍵字的用法,public,protected,private,static,什么時候用,為什么要用,怎么用一直都是個問題。編程時還有很多細節需要注意,那種少打了括號,符合中英文的問題還算小事,如果犯了邏輯錯誤則要花費大量時間調試。在學習的過程中,最好不是僅僅停留在java表層,不是抄書上的例子運行出結果就可以。要注意,即便對一個簡單的例子也要有耐心去琢磨、調試、改動。在學習的過程中一定要動手做、試着寫代碼,而不是抱一本書看看就行。很多東西和體會必須自己動手才能真正屬於自己。