第四章java基礎知識
4.1基本概念
一、java優點
1.面向物件(封裝、繼承、多型)
2.可移植性,平臺無關,一次編譯,到處運行,Windows,Linux,macos等,java為解釋性語言,編譯器把java變成中間代碼然后在JVM上解釋執行,
3.提供內置類別庫,簡化開發eg:支持多執行緒、網路通信、提供垃圾回收器等
4.提供對web應用開發的支持,eg:applet、servlet、jsp等可開發web;socket、RMI可開發分布式
5.安全性+健壯性,eg:在網路環境中應用,提供防止惡意代碼攻擊的安全機制(陣列邊界檢測和bytecode校驗等);強型別機制、垃圾回收器、例外處理和安全檢查機制,
6.去除了c++語言中難以理解的東西,比如頭檔案、指標、結構、單元、運算子多載、虛擬基礎類、多重繼承等
二、java與c++/c的異同點
|
java |
C++ |
|
·解釋性語言 ·運行程序: 源代碼-java編譯器->位元組碼-JVM解釋執行 ·執行速度比C++慢,能跨平臺執行 |
·編譯性語言 ·運行程序: 源代碼-編譯、鏈接->可執行的二進制代碼 ·不能跨平臺執行 |
|
純面向物件, 1.所有代碼必須在類中實作,除基本資料型別外所有型別都是類 2.不存在全域變數或全域函式 【java中的方法屬于類中的成員x ——靜態方法屬于類成員,用static修飾;動態方法屬于實體成員】 |
兼具面向物件和面向程序的特點 可定義全域變數和全域函式 |
|
沒有指標概念,防止了C語言中操作指標可能引起的系統問題,而使程式更安全 |
|
|
不支持多重繼承,但是引入了介面概念,可以同時實作多個介面,介面具有多型性,可利用介面實作與C++語言中多重繼承類似的目的 |
|
|
提供了垃圾回收器來實作垃圾的自動回收,不需要程式顯式管理記憶體分配, 無解構式,引入了finalize()方法,當垃圾回收器要釋放無用物件的記憶體使,首先呼叫該物件的finalize()方法,因此開發人員無需關心記憶體釋放問題 |
需開發人員管理對記憶體的分配(申請、釋放等)釋放:解構式 |
|
不支持運算子多載 |
支持 |
|
沒有前處理器(頭檔案、宏定義等) 提供的import機制類似于C++的前處理器 |
支持預處理 |
|
不支持默認函式引數 |
支持 |
|
不支持goto陳述句(goto是保留關鍵字) |
支持 |
|
不支持自動強制型別轉換,必須由開發人員顯式地進行 |
支持,會導致程式的不安全 |
|
不包含結構和聯合,所有內容封裝在類里面 |
結構和聯合所有成員均為公有,會導致安全性問題 |
|
平臺無關,對每種資料型別都分配固定長度 |
同一資料型別在不同的平臺上會分配不同的位元組數 |
|
提供對注釋檔案的內建支持,原始碼檔案可包含自己的檔案,通過一個單獨的程式可提取檔案資訊,并重新格式化成html |
|
|
包含完成特定任務的標準庫,縮短開發周期 eg:JDBC庫訪問資料庫,用于實作分布式物件的RMI等 |
依靠非標準的,廠商提供的庫 |
三、public static void main(String[] args)
程式入口方法,JVM運行程式時首先查找main()方法
·public:權限修飾符,表明任何類或物件均可訪問
·static表明main是靜態方法,方法中的代碼存盤在靜態存盤區,類被加載后不需要實體化物件即可直接通過類名.main()訪問,能找到則執行,否則報錯
·void:無回傳值
·main是用來給JVM識別的特殊方法名
每個類中都可以定義main()方法,但是只有與檔案名相同的且被public修飾的類中的main()方法才能作為整個程式的入口方法

·String[] args 字串陣列引數args為開發人員在命令列狀態下與程式互動提供了手段
·javac編譯:javac
參考:https://blog.csdn.net/cunjiu9486/article/details/109077115
用命令列編譯java程式并執行
javac D:/t1.java
java D:/t1
|
1 2 3 4 5 6 7 |
public class t1 { public static void main(String[] args) {// args由JVM賦值,誰呼叫方法誰賦值 //public與static沒有先后順序關系,反過來也合理 //也可以把main定義為final:public static final void main(String[] args) //synchronized也可以修飾main:public static synchronized void main(String[] args) //不能用abstract,必須回傳值為void,且有關鍵字static和public修飾 System.out.println("sss1"); System.out.println(args.length);// args初值為0 for (int i = 0; i < args.length; i++) { System.out.println(args[i]);// 遍歷陣列,輸出陣列元素 } } } |
若賦值:

由此可知,在運行java程式時,類名 后面緊跟一個或多個字串(多個字串以空格隔開),JVM就會把這些字串一次賦值給args陣列元素,第一個引數對應第一個陣列元素,第二個引數對應第二個陣列元素,若引數本身包含空格,則應""起來,否則空格會被當成分隔符,

四、如何在main()方法執行之前輸出helloworld?
A:
1:public class Test{
static{
System.out.println("hello world");//靜態塊不管順序如何都會在main方法前執行
}
public static void main(String[] args){
System.out.println("hello my world");
}
}
2:public class Test{
public static void main(String[] args){//main方法是最先加載的,但不意味著是第一個被執行//的模塊,在java語言中,靜態塊在類被加載時,就會被呼叫
System.out.println("hello my world");
static{
System.out.println("hello world");//執行結果與1相同
}
}
}
五、java程式初始化順序
實體化物件時,物件所在類的所有成員變數首先要進行初始化,只有所有類成員完成初始化之后,才會呼叫物件所在類的建構式創建物件,
三個原則~
1.靜態>非靜態,靜態只初始化一次,非靜態可能會初始化多次
2.父類>子類
3.按照成員變數的定義順序進行
【未完待續】
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/433274.html
標籤:Java
下一篇:Java基礎語法(二)
