構造函數:
創建對象時調用,所有類都有構造函數,目的是爲了給對象進行初始化,可以有多個構造函數,以重載的形式定義;
類中不定義構造函數的話,該類會產生一個默認的空參數構造函數;如果定義的話默認的構造函數就消失了;
構造函數---對象創建會調用相應的構造函數進行初始化,有且僅調用一次,
一般函數---對象創建後,需要函數功能才調用,可以無限調用;
一般函數不可直接調用構造函數,構造函數內有return語句。
static:
特點{
1.修飾類成員
2.修飾的成員被所有對象共享
3.優先於對象存在,加載類的時候,static成員便存在了
4.調用的時候有兩種方式,一種是對象調用,另一種是類名調用
5.修飾的爲共享數據,對象中存儲的是特有對象
6.只要變量是對象所共有的就可用static修飾
7.如果方法不需要調用非靜態成員就可定義爲靜態
8.類不封裝特有數據,可以把方法設爲static,該類稱工具類,不需要創建對象就能調用。爲了阻止其他程序創建該對象,可將該構造函數私有化}
成員變量與靜態變量的區別{
1.生命週期不同,成員變量跟着對象存在,消失;靜態變量跟着類
2.調用方式,成員變量只能通過對象調用
3.存儲位置不同,成員變量時在堆中的對象裏面;靜態變量在方法區的靜態區中}
注意{
由於靜態成員跟隨着類,還沒有對象的時候就可以操作靜態成員
1.靜態方法只能訪問靜態成員,非靜態方法可以訪問靜態和非靜態
2.靜態方法中不可有this和super
}
成員變量與局部變量重名時,用this來調用成員變量
this可用來在構造函數中調用其他構造函數,但必須爲構造函數的第一條語句
靜態代碼塊只在加載類的時候執行一次,構造代碼塊創建一次對象執行一次
public static void main(String【】 args)
1.格式是固定的,只有args可更換,爲了讓jvm識別;
2.訪問權限必須最大
3.static 爲了不創建對象直接地執行main方法
4.主函數沒有具體返回值
5.main一個被jvm識別的固定名字
6.String[] args:這是主函數的參數列表,是一個數組類型的參數,而且元素都是字符串類型
分析下面程序在內存中完成的動作
class Person{
private String name = null;
private int age = 0;
public static String country = "CN"
Person(String name){
this.name = name
}
Person(String name,int age){
this(name);
this.age = age;
}
public void print(){
System.out.println(this.name + " " + this.age);
}
}
class Demo{
public static void main(String[] args){
Person p1 = new Person("aa", 20);
Person p2 = new Person("bb", 21);
}}
1.main函數進棧,存儲變量p1 2.在方法區加載Person類,在靜態區存儲country的值 3.new Person("aa", 20)堆中分配空間給第一個new 4.調用Person(String name,int age),構造函數進棧 5.this(name)再次調用另一個構造函數,Person(String name)進棧 6.將參數aa賦值給堆中對象的變量name 7.第5步的構造函數出棧 8.將參數20賦值給堆中對象的變量age
9.第4步的構造函數出棧 10.把該對象地址賦值給p1.11.重複3到10步驟 12.main函數出棧
該程序p1和p2共享country的值,構造函數使用this是由於能在局部變量找到就不會去尋找成員變量