Java入門01
技術標籤:java學習
Java入門
安裝好jdk檔案後,使用java -version (cmd中檢視Java版本)
新建一個TXT檔案,輸入以下程式碼,改字尾為.java
class Demo{
public static void main(String[] args){
System.putprint('hello world!')
}
}
進入該檔案目錄,滑鼠點選檔案路徑,輸入cmd,在環境中輸入javac demo.java
隨後會生成一個.class檔案
然後(在cmd中)輸入java Demo(類名)(注意類名的大小寫),即可看見列印內容hello world!
安裝IDEA
建立包:new->package ->取名稱
建立類:new->Java Class ->取名稱
【命名規範:類名->駝峰 方法名->小駝峰】
java中分基本資料型別、引用資料型別(類、陣列、介面、介面對應的抽象類等)
過載問題
一個類中可以有多個方法具有相同的名稱,但這些方法的引數名必不相同
可以是 1、引數個數不同; 2、引數個數相同,但引數型別不同
public class MethodDemo01 { public static void main(String[] args){ MethodDemo01 methodDemo01=
new MethodDemo01(); System.out.println(MethodDemo01.def(2,4));//輸出6 methodDemo01.def(2.0,4);//輸出6.0 } public static int def(int a,int b){ return a+b; } public void def(double a,double b){ System.out.println(a+b); } }
Private
讓類裡面的屬性不被外界訪問,在屬性面前加private
private String idCard="436856927347";
若要訪問,可通過新增一個函式方法,通過方法訪問私有屬性
public String getIdCard(){
return idCard;
}
也可通過set方法給屬性賦值
public void setIdCard(String idCard){
this.idCard=idCard;
}
快速設定多個已宣告屬性的get或set方法:
1、右鍵->Generate->Getter/Setter->選中需要設定該方法的屬性->OK
2、Alt+insert->Generate->Getter/Setter->選中需要設定該方法的屬性->OK
構造方法
1、無參構造方法(預設,不寫也會有)
public Student(){
}
2、有參構造方法
public Student(String name){
this.name=name;
}
通過傳參可在new時給宣告的類賦予相對應的屬性值
堆、棧、方法區
Java程式執行時,資料會分割槽存放,JavaStack(Java棧)、 heap(堆)、method(方法區)
棧記憶體中存放基本資料型別的資料,和物件的引用(堆記憶體地址)
堆記憶體存放類的物件,所有的類物件都是通過new方法建立,建立後,在棧中會建立類物件的引用(記憶體地址)
方法區,又叫靜態區,存放所有的類(class)、靜態變數、靜態方法、常量和成員方法
垃圾回收機制
與C++不同的是,不用每次都手動回收清除,Java是自動回收
過載和重寫的區別
重寫(override
)
override是重寫(覆蓋)了一個方法,以實現不同的功能。一般是用於子類在繼承父類時,重寫(重新實現)父類中的方法
過載(overload
)
一般是用於在一個類內實現若干過載的方法,這些方法的名稱相同而引數形式不同
【類不支援多繼承】
多型
多型是同一個行為具有多個不同表現形式或形態的能力。
多型就是同一個介面,使用不同的例項而執行不同操作
多型存在的三個必要條件
- 繼承
- 重寫
- 父類引用指向子類物件:Parent p = new Child();
向上轉型:子->父,父類的引用指向子類物件
向下轉型:父->子,(通過強轉換)父類引用轉換為子類物件
通過以下程式碼輔助理解
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以 Cat 物件呼叫 show 方法
show(new Dog()); // 以 Dog 物件呼叫 show 方法
Animal a = new Cat(); // 向上轉型
a.eat(); // 呼叫的是 Cat 的 eat
Cat c = (Cat)a; // 向下轉型
c.work(); // 呼叫的是 Cat 的 work
}
public static void show(Animal a) {
a.eat();
// 型別判斷
if (a instanceof Cat) { // 貓做的事情
Cat c = (Cat)a;
c.work();
} else if (a instanceof Dog) { // 狗做的事情
Dog c = (Dog)a;
c.work();
}
}
}
abstract class Animal {
abstract void eat();
}
class Cat extends Animal {
public void eat() {
System.out.println("吃魚");
}
public void work() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨頭");
}
public void work() {
System.out.println("看家");
}
}
程式碼參考自菜鳥教程
結果為:
吃魚
抓老鼠
吃骨頭
看家
吃魚
抓老鼠
抽象類
抽象方法只能存在抽象類中,抽象類中可以擁有普通方法
關鍵字abstract
public abstract class Animal {
public abstract void getName();
public void getAge(){
}
}
抽象類只能用來被繼承
當子類繼承了父類,且父類為抽象方法時,子類必須重寫方法
介面
通過interface
關鍵字宣告
public interface Service {
}
抽象方法可以不寫方法體public abstract
沒有方法體的方法一定是抽象方法
在介面中不允許有變數存在
介面是一個特殊的抽象類,也是用來被子類繼承的,有一個特殊的關鍵字implements
用來實現介面
【Alt+回車】檢查錯誤
練習
人可以接收訊息,可以分別從QQ、微信、Email接收,使用多型+介面實現
1、建立People類,定義人可以接收訊息的功能
public class People {
public void getMessage(Message message){//引數根據定義的介面決定
message.getMessage();
}
}
2、定義接收訊息介面,使用關鍵字interface
public interface Message {
//public abstract void getMessage();
void getMessage();
}
【注:在介面中定義抽象方法可以省略方法前的public abstract】
3、分別建立QQ、Wechat、Email類實現介面,相當於宣告: 我應該具備這個介面中的功能,實現類仍需要 重寫 方法以實現具體功能
格式:
class 類 implements 介面 {
重寫介面中方法
}
實現程式碼:
public class QQ implements Message{
@Override
public void getMessage() {
System.out.println("接收來自QQ的訊息");
}
}
public class Wechat implements Message{
@Override
public void getMessage() {
System.out.println("接收來自Wechat的訊息");
}
}
public class Email implements Message{
@Override
public void getMessage() {
System.out.println("接收來自Email的訊息");
}
}
4、建立一個Test類,測試
public class Test {
public static void main(String[] args) {
People people=new People();
people.getMessage(new Wechat());//接收來自Wechat的訊息
people.getMessage(new QQ());//接收來自QQ的訊息
people.getMessage(new Email());//接收來自Email的訊息
}
}