JavaSE篇-Day(7)學習筆記

面向對象

成員變量和局部變量的區別

/*
	成員變量和局部變量的區別?
		A:在類中的位置不同
			成員變量:在類中方法外
			局部變量:在方法定義中或者方法聲明上
		B:在內存中的位置不同
			成員變量:在堆內存
			局部變量:在棧內存
		C:生命週期不同
			成員變量:隨着對象的創建而存在,隨着對象的消失而消失
			局部變量:隨着方法的調用而存在,隨着方法的調用完畢而消失
		D:初始化值不同
			成員變量:有默認初始化值
			局部變量:沒有默認初始化值,必須定義,賦值,然後才能使用。
			
		注意事項:
			局部變量名稱可以和成員變量名稱一樣,在方法中使用的時候,採用的是就近原則。
*/
class Varialbe {
	//成員變量
	//int num = 10;
	int num; //0
	
	public void show() {
		//int num2 = 20; //局部變量
		//可能尚未初始化變量num2
		//int num2; //沒有默認值
		int num2 = 20;
		System.out.println(num2);
		
		//int num = 100;
		System.out.println(num);
	}
}


class VariableDemo {
	public static void main(String[] args) {
		Varialbe v = new Varialbe();
		
		System.out.println(v.num); //訪問成員變量
		
		v.show();	
			
	}
}

方法的形式參數是類名的時候如何調用

/*
	形式參數的問題:
		基本類型:形式參數的改變不影響實際參數
		引用類型:形式參數的改變直接影響實際參數
*/
//形式參數是基本類型
class Demo {
	public int sum(int a,int b) {
		return a + b;
	}
}

//形式參數是引用類型
class Student {
	public void show() {
		System.out.println("我愛學習");
	}
}

class StudentDemo {
	//如果你看到了一個方法的形式參數是一個類類型(引用類型),這裏其實需要的是該類的對象。
	public void method(Student s) { //調用的時候,把main方法中的s的地址傳遞到了這裏 Student s = new Student();
		s.show();
	}
}

class ArgsTest {
	public static void main(String[] args) {
		//形式參數是基本類型的調用
		Demo d = new Demo();
		int result = d.sum(10,20);
		System.out.println("result:"+result);
		System.out.println("--------------");
		
		//形式參數是引用類型的調用
		//需求:我要調用StudentDemo類中的method()方法
		StudentDemo sd = new StudentDemo();
		//創建學生對象
		Student s = new Student();
		sd.method(s); //把s的地址給到了這裏
	}
}

匿名對象的概述和應用

/*
	匿名對象:就是沒有名字的對象。
	
	匿名對象的應用場景:
		A:調用方法,僅僅只調用一次的時候。
			注意:調用多次的時候,不適合。
			那麼,這種匿名調用有什麼好處嗎?
				有,匿名對象調用完畢就是垃圾。可以被垃圾回收器回收。
		B:匿名對象可以作爲實際參數傳遞
*/
class Student {
	public void show() {
		System.out.println("我愛學習");
	}
}

class StudentDemo {
	public void method(Student s) {
		s.show();
	}
}

class NoNameDemo {
	public static void main(String[] args) {
		//帶名字的調用
		Student s = new Student();
		s.show();
		s.show();
		System.out.println("--------------");
		
		//匿名對象
		//new Student();
		//匿名對象調用方法
		new Student().show();
		new Student().show(); //這裏其實是重新創建了一個新的對象
		System.out.println("--------------");
		
		
		//匿名對象作爲實際參數傳遞
		StudentDemo sd = new StudentDemo();
		//Student ss = new Student();
		//sd.method(ss); //這裏的s是一個實際參數
		//匿名對象
		sd.method(new Student());
		
		//在來一個
		new StudentDemo().method(new Student());
 	}
}

封裝和private

封裝(理解)
    (1)隱藏實現細節,提供公共的訪問方式
    (2)好處:
        A:隱藏實現細節,提供公共的訪問方式
        B:提高代碼的複用性
        C:提高代碼的安全性
    (3)設計原則
        把不想讓外界知道的實現細節給隱藏起來,提供公共的訪問方式
    (4)private是封裝的一種體現。
        封裝:類,方法,private修飾成員變量

private關鍵字(掌握)
    (1)私有的意義,可以修飾成員變量和成員方法
    (2)特點:
        被private修飾的後的成員只能在本類中被訪問
    (3)private的應用:
        以後再寫一個類的時候:
            把所有的成員變量給private提供對應的getXxx()/setXxx()方法

private的引出

/*
	定義一個學生類:
		成員變量:name,age
		成員方法:show()方法
		
	我們在使用這個案例的過程中,發現了一個問題:
		通過對象去給成員變量賦值,可以賦值一些非法的數據。
		這是不合理的。
		應該是這個樣子的:在賦值之前,先對數據進行判斷。
		判斷到底在哪裏做比較合適呢?
		StudentDemo類是一個測試類,測試類一般只創建對象,調用方法。	
		所以,這個判斷應該定義在Student類中。
		而我們在成員變量的位置可不可以進行數據判斷呢?
		是不可以的,因爲做數據校驗,必須要依靠一些邏輯語句。
		邏輯語句是應該定義在方法中的,所以,我們最終決定在Student類中提供一個方法
		來對數據進行校驗。
	
	按照我們前面的分析,我們給出了一個方法進行校驗。
	但是呢,它偏偏不調用方法來賦值,還是直接賦值了,
	這樣我們的方法就沒有起到作用。
	我就應該要求你必須使用我的方法,而不能直接調用成員變量賦值。
	怎麼去強制要求不能直接使用成員變量呢?
		針對這種情況,Java就提供了一個關鍵字 private
		
	private:私有的。可以修飾成員變量和成員方法。
		注意:被private修飾的成員只能在本類中訪問。
		
	其實我講到現在講解的是一個封裝的思想。
	封裝:是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。
*/
class Student {
	//姓名
	String name;
	//年齡
	private int age;
	
	//寫一個方法對數據進行校驗
	/*
		返回值類型:void
		參數列表:int a
	*/
	public void setAge(int a) {
		if(a < 0 || a > 120) {
			System.out.println("你給的年齡有問題");
		}else {
			age = a;
		}
	}
	
	
	//show()方法,顯示所有成員變量值
	public void show() {
		System.out.println("姓名:"+name);
		System.out.println("年齡:"+age);
	}
}

class StudentDemo {
	public static void main(String[] args) {
		//創建學生對象
		Student s = new Student();
		s.show();
		System.out.println("--------------");
		
		//給成員變量賦值
		s.name = "林青霞";
		//s.age = 27;
		s.setAge(27);
		s.show();
		System.out.println("--------------");
		
		//給age賦值
		//s.age = -27; //這個數據是不合理的
		//通過方法給值
		s.setAge(-27);
		s.show();
		System.out.println("--------------");
	}
}

private關鍵字的概述和特點

/*
	private:
		是一個權限修飾符
		可以修飾成員變量和成員方法
		被其修飾的成員只能在本類中被訪問
*/
class Demo {
	//int num = 10;
	//用private修飾
	private int num = 10;
	
	public void show() {
		System.out.println(num);
	}
	
	private void method() {
		System.out.println("method");
	}
	
	public void function() {
		method();
	}
}

class PrivateDemo {
	public static void main(String[] args) {
		Demo d = new Demo();
		//不能方法私有的成員變量
		//System.out.println(d.num);
		d.show();
		//不能訪問私有的成員方法
		//d.method();
		d.function();
	}
}

private的應用標準案例

/*
	封裝和private的應用:
		A:把成員變量用private修飾
		B:提高對應的getXxx()和setXxx()方法
*/
//定義學生類
class Student {
	//姓名
	private String name;
	//年齡
	private int age;
	
	//姓名獲取值
	public String getName() {
		return name;
	}
	
	//姓名設置值
	public void setName(String n) {
		name = n;
	}
	
	//年齡獲取值
	public int getAge() {
		return age;
	}
	
	//年齡賦值
	public void setAge(int a) {
		age = a;
	}
}

//測試類
class StudentTest {
	public static void main(String[] args) {
		//創建學生對象
		Student s = new Student();
		
		//使用成員變量
		//錯誤:被私有修飾了,外界不能直接訪問了
		//System.out.println(s.name+"---"+s.age);
		System.out.println(s.getName()+"---"+s.getAge());
		
		//給成員變量賦值
		//s.name = "林青霞";
		//s.age = 27;
		//通過方法給賦值
		s.setName("林青霞");
		s.setAge(27);
		System.out.println(s.getName()+"---"+s.getAge());
	}
}

this關鍵字的概述和應用

/*
	我們曾經曰:起名字要做到見名知意。
	
	this:是當前類的對象引用。簡單的記,它就代表當前類的一個對象。
	
		注意:誰調用這個方法,在該方法內部的this就代表誰。
		
	this的場景:
		解決局部變量隱藏成員變量
*/
//定義學生類
class Student {
	//姓名
	private String name;
	//年齡
	private int age;
	
	//姓名獲取值
	public String getName() {
		return name;
	}
	
	//姓名設置值
	public void setName(String name) { //name = "林青霞";
		//name = name; //變量的使用規則:就近原則
		//這裏是類名,目前還沒有說過類似的用法,所以這個是有問題的
		//這裏的調用只能通過對象名
		//這個對象如果存在,它應該代表的是Student的一個對象。
		//那麼,誰能夠代表當前類的對象呢? java就提供了一個關鍵字 this
		//Student.name = name;
		this.name = name;
	}
	
	//年齡獲取值
	public int getAge() {
		return age;
	}
	
	//年齡賦值
	public void setAge(int age) {
		this.age = age;
	}
}

//測試類
class StudentTest {
	public static void main(String[] args) {
		//創建學生對象
		Student s = new Student();
		
		//給成員變量賦值
		s.setName("林青霞");
		s.setAge(27);
		//獲取數據
		System.out.println(s.getName()+"---"+s.getAge());
	}
}
/*
	標準的代碼改進版
	
	this:哪個對象調用那個方法,this就代表那個對象
*/
class Student {
	private String name;
	private int age;
	
	public String getName() {
		return name; //這裏其實是隱含了this
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
}

class StudentTest2 {
	public static void main(String[] args) {
		//創建一個對象
		Student s1 = new Student();
		s1.setName("林青霞");
		s1.setAge(27);
		System.out.println(s1.getName()+"---"+s1.getAge());
		
		//創建第二個對象
		Student s2 = new Student();
		s2.setName("劉意");
		s2.setAge(30);
		System.out.println(s2.getName()+"---"+s2.getAge());
	}
}

this關鍵字的內存圖解

tupian1

標準手機類代碼及其測試

/*
	作業:請把手機類寫成一個標準類,然後創建對象測試功能。
	
	手機類:
		成員變量:
			品牌:String brand;
			價格:int price;
			顏色:String color;
		成員方法:
			針對每一個成員變量給出對應的getXxx()/setXxx()方法。
		最後定義測試:
			創建一個對象,先通過getXxx()方法輸出成員變量的值。這一次的結果是:null---0---null
			然後通過setXxx()方法給成員變量賦值。再次輸出結果。這一次的結果是:三星---2999---土豪金
*/
class Phone {
	//品牌
	private String brand;
	//價格
	private int price;
	//顏色
	private String color;
	
	//getXxx()和setXxx()方法
	public String getBrand() {
		return brand;
	}
	
	public void setBrand(String brand) {
		this.brand = brand;
	}
	
	public int getPrice() {
		return price;
	}
	
	public void setPrice(int price) {
		this.price = price;
	}
	
	public String getColor() {
		return color;
	}
	
	public void setColor(String color) {
		this.color = color;
	}
}

class PhoneTest {
	public static void main(String[] args) {
		//創建手機對象
		Phone p = new Phone();
		
		//直接輸出默認值
		System.out.println(p.getBrand()+"---"+p.getPrice()+"---"+p.getColor());
		
		//給成員變量賦值
		p.setBrand("三星");
		p.setPrice(2999);
		p.setColor("土豪金");
		//再次輸出
		System.out.println(p.getBrand()+"---"+p.getPrice()+"---"+p.getColor());
	}
}

構造方法概述和格式

/*
	構造方法:
		給對象的數據進行初始化

	格式:
		A:方法名與類名相同
		B:沒有返回值類型,連void都沒有
		C:沒有具體的返回值
*/
class Student {
	private String name; //null
	private int age; //0
	
	public Student() {
		System.out.println("這是構造方法");
	}
}

class ConstructDemo {
	public static void main(String[] args) {
		//創建對象
		Student s = new Student();
		System.out.println(s); //Student@e5bbd6
	}
}

構造方法的重載及注意事項

/*
	我們一直在使用構造方法,但是,我們確沒有定義構造方法,用的是哪裏來的呢?
	
	構造方法的注意事項:
		A:如果我們沒有給出構造方法,系統將自動提供一個無參構造方法。
		B:如果我們給出了構造方法,系統將不再提供默認的無參構造方法。
			注意:這個時候,如果我們還想使用無參構造方法,就必須自己給出。建議永遠自己給出無參構造方法
		
	給成員變量賦值有兩種方式:
		A:setXxx()
		B:構造方法
*/

class Student {
	private String name;
	private int age;

	public Student() {
		//System.out.println("我給了,你還給不");
		System.out.println("這是無參構造方法");
	}
	
	//構造方法的重載格式
	public Student(String name) {
		System.out.println("這是帶一個String類型的構造方法");
		this.name = name;
	}
	
	public Student(int age) {
		System.out.println("這是帶一個int類型的構造方法");
		this.age = age;
	}
	
	public Student(String name,int age) {
		System.out.println("這是一個帶多個參數的構造方法");
		this.name = name;
		this.age = age;
	}
	
	public void show() {
		System.out.println(name+"---"+age);
	}
}

class ConstructDemo2 {
	public static void main(String[] args) {
		//創建對象
		Student s = new Student();
		s.show();
		System.out.println("-------------");
		
		//創建對象2
		Student s2 = new Student("林青霞");
		s2.show();
		System.out.println("-------------");
		
		//創建對象3
		Student s3 = new Student(27);
		s3.show();
		System.out.println("-------------");
		
		//創建對象4
		Student s4 = new Student("林青霞",27);
		s4.show();
	}
}

成員方法的分類及使用

/*
    類的組成:成員變量,成員方法
    今天我們又加入了一個新的成員:構造方法。
    以後再提類的組成:
        1、成員變量
        2、構造方法
        3、成員方法
            根據返回值:
                void類型
                非void類型
            形式參數:
                空參方法
                非空參方法
*/
class Student {
    public String getString() {
        return "helloworld";
    }

    public void show() {
        System.out.println("show");
    }
    
    public void method(String name) {
        System.out.println(name);
    }
    
    public String function(String s1,String s2) {
        return s1+s2;
    }
}

class StudentDemo {
    public static void main(String[] args) {
        //創建對象
        Student s = new Student();
        
        //調用無參無返回值方法
        s.show();
        
        //調用無參有返回值方法
        String result = s.getString();
        System.out.println(result);
        
        //調用帶參無返回值的方法
        s.method("林青霞");
        
        //調用帶參帶返回值的方法
        String result2 = s.function("hello","world");
        System.out.println(result2);
    }
}

一個標準學生類的代碼及測試

/*
	一個標準代碼的最終版。
	
	學生類:
		成員變量:
			name,age
		構造方法:
			無參,帶兩個參
		成員方法:
			getXxx()/setXxx()
			show():輸出該類的所有成員變量值
			
	給成員變量賦值:
		A:setXxx()方法
		B:構造方法
		
	輸出成員變量值的方式:
		A:通過getXxx()分別獲取然後拼接
		B:通過調用show()方法搞定
*/
class Student {
	//姓名
	private String name;
	//年齡
	private int age;
	
	//構造方法
	public Student() {
	}
	
	public Student(String name,int age) {
		this.name = name;
		this.age = age;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	//輸出所有的成員變量值
	public void show() {
		System.out.println(name+"---"+age);
	}
}

//測試類
class StudentTest {
	public static void main(String[] args) {
		//方式1給成員變量賦值
		//無參構造+setXxx()
		Student s1 = new Student();
		s1.setName("林青霞");
		s1.setAge(27);
		//輸出值
		System.out.println(s1.getName()+"---"+s1.getAge());
		s1.show();
		System.out.println("----------------------------");
		
		//方式2給成員變量賦值
		Student s2 = new Student("劉意",30);
		System.out.println(s2.getName()+"---"+s2.getAge());
		s2.show();
	}
}

一個標準手機類的代碼及測試

/*
	標準的手機類練習
	
	手機類:
		成員變量:brand,price,color
		構造方法:無參構造
		成員方法:getXxx()/setXxx()
*/
//定義手機類
class Phone {
	//品牌
	private String brand;
	//價格
	private int price;
	//顏色
	private String color;
	
	//無參構造方法
	public Phone() {}
	
	//getXxx()和setXxx()方法
	public String getBrand() {
		return brand;
	}
	
	public void setBrand(String brand) {
		this.brand = brand;
	}
	
	public int getPrice() {
		return price;
	}
	
	public void setPrice(int price) {
		this.price = price;
	}
	
	public String getColor() {
		return color;
	}
	
	public void setColor(String color) {
		this.color = color;
	} 
}

//手機測試類
class PhoneTest {
	public static void main(String[] args) {
		//創建對象
		Phone p = new Phone();
		
		//給成員變量賦值
		p.setBrand("諾基亞");
		p.setPrice(199);
		p.setColor("土豪金");
		
		//獲取值
		System.out.println(p.getBrand()+"---"+p.getPrice()+"---"+p.getColor());
	}
}

創建對象做了哪些事情

(1)把Student.class文件加載到內存
    (2)在棧內存爲s開闢空間
    (3)在堆內存爲學生對象申請空間
    (4)給學生的成員變量進行默認初始化。null,0
    (5)給學生的成員變量進行顯示初始化。林青霞,27
    (6)通過構造方法給成員變量進行初始化。劉意,30
    (7)對象構造完畢,把地址賦值給s變量

tupian111

什麼時候定義成員變量

/*
	定義一個類Demo,其中定義一個求兩個數據和的方法,
	定義一個測試了Test,進行測試。
	
	變量什麼時候定義爲成員變量:
		如果這個變量是用來描述這個類的信息的,那麼,該變量就應該定義爲成員變量。
		
	變量到底定義在哪裏好呢?
		變量的範圍是越小越好。因爲能及時的被回收。
*/

//方式1
/*
class Demo {
	public int sum() {
		int a = 10;
		int b = 20;
		int c = a + b;
		return c;
	}
}
*/
//方式1滿足了我們的要求,但是不好。
//因爲參與操作的數據現在是固定的。

//方式2
/*
class Demo {
	public int sum(int a,int b) {
		return a + b;
	}
}
*/

//方式2可以滿足我們的要求,但是呢我們學習過來面向對象的思想。
//我就再想,a,b可不可以定義爲成員變量呢?
//如果可以,我們再改進一版
class Demo {
	int a;
	int b;
	
	public int sum() {
		return a + b;
	}
}
//雖然這種方式可以,並且好像是符合了面向對象的思想。
//但是不好。
//因爲我們曾經說過:類是一組相關的屬性和行爲的集合。
//並且類是通過事物轉換過來的
//而類中的成員變量就是事物的屬性
//屬性是用來描述事物的
//同理:成員變量其實是用來描述類的。

//測試類
class Test {
	public static void main(String[] args) {
		//創建對象
		//方式1測試
		/*
		Demo d = new Demo();
		System.out.println(d.sum());
		*/
		
		//方式2測試
		/*
		Demo d = new Demo();
		int a = 10;
		int b = 20;
		System.out.println(d.sum(a,b));
		*/
		
		//方式3測試
		Demo d = new Demo();
		d.a = 10;
		d.b = 20;
		System.out.println(d.sum());
	}
}

長方形案例練習

/*
	定義一個長方形類,定義 求周長和麪積的方法,
	然後定義一個測試了Test2,進行測試。

	長方形的類:
		成員變量:
			長,寬
		成員方法:
			求周長:(長+寬)*2;
			求面積:長*寬
			
	注意:
		import必須出現在所有的class前面。
*/

import java.util.Scanner;

class ChangFangXing {
	//長方形的長
	private int length;
	//長方形的寬
	private int width;
	
	public ChangFangXing(){}
	
	//僅僅提供setXxx()即可
	public void setLength(int length) {
		this.length = length;
	}
	
	public void setWidth(int width) {
		this.width = width;
	}
	
	//求周長
	public int getZhouChang() {
		return (length + width) * 2;
	}
	
	//求面積
	public int getArea() {
		return length * width;
	}
}

class Test2 {
	public static void main(String[] args) {
		//創建鍵盤錄入對象
		Scanner sc = new Scanner(System.in);
		
		System.out.println("請輸入長方形的長:");
		int length = sc.nextInt();
		System.out.println("請輸入長方形的寬:");
		int width = sc.nextInt();
		
		//創建對象
		ChangFangXing cfx = new ChangFangXing();
		//先給成員變量賦值
		cfx.setLength(length);
		cfx.setWidth(width);
		
		System.out.println("周長是:"+cfx.getZhouChang());
		System.out.println("面積是:"+cfx.getArea());
	}
}

員工類案例練習

/*
	需求:
		定義一個員工類,自己分析出幾個成員,
		然後給出成員變量,構造方法,getXxx()/setXxx()方法,
		以及一個顯示所有成員信息的方法。並測試。

	分析:
		員工
			成員變量:
				員工編號,姓名,年齡
			構造方法:
				無參構造方法
			成員方法:
				getXxx()/setXxx()
				show();
*/
class Employee {
	//員工編號
	private String employeeId;
	//姓名
	private String name;
	//年齡
	private int age;
	
	//構造方法
	public Employee() {}
	
	//getXxx()/setXxx()
	public String getEmployeeId() {
		return employeeId;
	}
	
	public void setEmployeeId(String employeeId) {
		this.employeeId = employeeId;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	//顯示所有成員信息的方法
	public void show() {
		System.out.println("員工編號是:"+employeeId+"的這個人是:"+name+"的年齡是:"+age);
	}
}

class EmployeeTest {
	public static void main(String[] args) {
		//創建對象
		Employee e = new Employee();
		
		//給成員變量賦值
		e.setEmployeeId("czbk9527");
		e.setName("唐伯虎");
		e.setAge(18);
		
		//獲取數據
		//System.out.println(e.getEmployeeId()+"---"+e.getName()+"---"+e.getAge());
	
		//我們在Employee類中定義了一個show方法。所以,我們改進一下,使用show方法
		e.show();
	}
}

自己實現加減乘除並測試

/*
	定義一個類MyMath,提供基本的加減乘除功能,然後進行測試。
*/
import java.util.Scanner;

class MyMath {
	//加法功能
	public int add(int a,int b) {
		return a + b;
	}
	
	//減法功能
	public int sub(int a,int b) {
		return a - b;
	}
	
	//乘法功能
	public int mul(int a,int b){
		return a * b;
	}
	
	//除法功能
	public int div(int a,int b) {
		return a / b;
	}
}

//測試類
class MyMathTest {
	public static void main(String[] args) {
		//創建鍵盤錄入對象
		Scanner sc = new Scanner(System.in);
		
		System.out.println("請輸入第一個操作數:");
		int firstNumber = sc.nextInt();
		System.out.println("請輸入第二個操作數:");
		int secondNumber = sc.nextInt();
		
		//創建MyMath對象,並使用
		MyMath mm = new MyMath();
		
		System.out.println("加法結果:"+mm.add(firstNumber,secondNumber));
		System.out.println("減法結果:"+mm.sub(firstNumber,secondNumber));
		System.out.println("乘法結果:"+mm.mul(firstNumber,secondNumber));
		System.out.println("除法結果:"+mm.div(firstNumber,secondNumber));
	}
}

static關鍵字的引入

static關鍵字(理解)
    (1)靜態的意思。可以修飾成員變量和成員方法。
    (2)靜態的特點:
        A:隨着類的加載而加載
        B:優先與對象存在
        C:被類的所有對象共享
            這其實也是我們判斷該不該使用靜態的依據。
            舉例:飲水機和水杯的問題思考
        D:可以通過類名調用
            既可以通過對象名調用,也可以通過類名調用,建議通過類名調用。
    (3)靜態的內存圖
        靜態的內容在方法區的靜態區
    (4)靜態的注意事項;
        A:在靜態方法中沒有this對象
        B:靜態只能訪問靜態(代碼測試過)
    (5)靜態變量和成員變量的區別
        A:所屬不同
            靜態變量:屬於類,類變量
            成員變量:屬於對象,對象變量,實例變量
        B:內存位置不同
            靜態變量:方法區的靜態區
            成員變量:堆內存
        C:生命週期不同
            靜態變量:靜態變量是隨着類的加載而加載,隨着類的消失而消失
            成員變量:成員變量是隨着對象的創建而存在,隨着對象的消失而消失
        D:調用不同
            靜態變量:可以通過對象名調用,也可以通過類名調用
            成員變量:只能通過對象名調用
    (6)main方法是靜態的
        public:權限最大
        static:不用創建對象調用
        void:返回值給jvm沒有意義
        main:就是一個常見的名稱。
        String[] args:可以接收數據,提供程序的靈活性
            格式:java MainDemo hello world java
                  java MainDemo 10 20 30

/*
	定義一個人類
	
	姓名和年齡都是變化的,這個我能接收,因爲每個人的姓名和年齡是不同的。
	但是,我們現在選取的幾個人都是中國人,他們的國籍是一樣的。
	一樣的國籍,我每次創建對象,在堆內存都要開闢這樣的空間,
	我就覺得有點浪費了。怎麼辦呢? 
		針對多個對象有共同的這樣的成員變量值的時候,
		Java就提高了一個關鍵字來修飾:static。
*/
class Person {
	//姓名
	String name;
	//年齡
	int age;
	//國籍
	//String country;
	static String country;
	
	public Person(){}
	
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
	
	public Person(String name,int age,String country) {
		this.name = name;
		this.age = age;
		this.country = country;
	}
	
	public void show() {
		System.out.println("姓名:"+name+",年齡:"+age+",國籍:"+country);
	}
}

class PersonDemo {
	public static void main(String[] args) {
		//創建對象1
		Person p1 = new Person("鄧麗君",16,"中國");
		p1.show();
		
		//創建對象2
		//Person p2 = new Person("楊冪",22,"中國");
		//p2.show();
		Person p2 = new Person("楊冪",22);
		p2.show();
		
		//創建對象3
		//Person p3 = new Person("鳳姐",20,"中國");
		//p3.show();
		Person p3 = new Person("鳳姐",20);
		p3.show();
		
		p3.country = "美國";
		p3.show();
		
		p1.show();
		p2.show();
	}
}

static關鍵字的特點

/*
	static的特點:(它可以修飾成員變量,還可以修飾成員方法)
		A:隨着類的加載而加載
			回想main方法。
		B:優先於對象存在
		C:被類的所有對象共享
			舉例:咱們班級的學生應該共用同一個班級編號。
			其實這個特點也是在告訴我們什麼時候使用靜態?
				如果某個成員變量是被所有對象共享的,那麼它就應該定義爲靜態的。
			舉例:
				飲水機(用靜態修飾)
				水杯(不能用靜態修飾)
		D:可以通過類名調用
			其實它本身也可以通過對象名調用。
			推薦使用類名調用。
			
			靜態修飾的內容一般我們稱其爲:與類相關的,類成員
*/
class Student {
	//非靜態變量
	int num = 10;
	
	//靜態變量
	static int num2 = 20;
}

class StudentDemo {
	public static void main(String[] args) {
		Student s = new Student();
		System.out.println(s.num);
		
		System.out.println(Student.num2);
		System.out.println(s.num2);
	}
}

static關鍵字的內存圖解

tupian2222

static關鍵字的注意事項

/*
	static關鍵字注意事項
		A:在靜態方法中是沒有this關鍵字的
			如何理解呢?
				靜態是隨着類的加載而加載,this是隨着對象的創建而存在。
				靜態比對象先存在。
		B:靜態方法只能訪問靜態的成員變量和靜態的成員方法
				靜態方法:
					成員變量:只能訪問靜態變量
					成員方法:只能訪問靜態成員方法
				非靜態方法:
					成員變量:可以是靜態的,也可以是非靜態的
					成員方法:可是是靜態的成員方法,也可以是非靜態的成員方法。
			簡單記:
				靜態只能訪問靜態。
*/
class Teacher {
	public int num = 10;
	public static int num2 = 20;
	
	public void show() {
		System.out.println(num); //隱含的告訴你訪問的是成員變量
		System.out.println(this.num); //明確的告訴你訪問的是成員變量
		System.out.println(num2);
		
		//function();
		//function2();
	}
	
	public static void method() {
		//無法從靜態上下文中引用非靜態 變量 num
		//System.out.println(num);
		System.out.println(num2);
		
		//無法從靜態上下文中引用非靜態 方法 function()
		//function();
		function2();
	}
	
	public void function() {
	
	}
	
	public static void function2() {
	
	}
}

class TeacherDemo {
	public static void main(String[] args) {
		//創建對象
		Teacher t = new Teacher();
		t.show();
		System.out.println("------------");
		t.method();
	}
}

main方法的格式詳解

/*
	main方法的格式講解:
		public static void main(String[] args) {...}
		
		public:公共的,訪問權限是最大的。由於main方法是被jvm調用,所以權限要夠大。
		static:靜態的,不需要創建對象,通過類名就可以。方便jvm的調用。
		void:因爲我們曾經說過,方法的返回值是返回給調用者,而main方法是被jvm調用。你返回內容給jvm沒有意義。
		main:是一個常見的方法入口。我見過的語言都是以main作爲入口。
		String[] args:這是一個字符串數組。值去哪裏了?
			這個東西到底有什麼用啊?怎麼給值啊?
				這個東西早期是爲了接收鍵盤錄入的數據的。
				格式是:
					java MainDemo hello world java
*/
class MainDemo {
	public static void main(String[] args) {
		//System.out.println(args); //[Ljava.lang.String;@175078b
		//System.out.println(args.length); //0
		//System.out.println(args[0]); //ArrayIndexOutOfBoundsException
		
		//接收數據後
		System.out.println(args); 
		System.out.println(args.length); 
		//System.out.println(args[0]); 
		for(int x=0; x<args.length; x++) {
			System.out.println(args[x]);
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章