一,this關鍵字
1,當成員變量和局部變量重名時,可以使用this關鍵字來區分。
this關鍵字代表的是本類對象,this一般是在一個函數中,哪個對象在調用this所在的函數,this就代表哪個對象。
//this關鍵字的使用
class Person
{
private String name;
private int age;
Person(int age)
{
this.age = age;
}
Person(String name)
{
this.name = name;
}
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public void speak()
{
System.out.println("name="+this.name+"...age="+this.age);
this.show();
}
public void show()
{
System.out.println(this.name);
}
/*
需求:給人定義一個用於比較年齡是否相同的功能。也就是是否是同齡人。
*/
public boolean compare(Person p)
{
return this.age==p.age;
}
}
class PersonTest
{
public static void main(String[] args)
{
Person p1 = new Person(20);
Person p2 = new Person(25);
boolean b = p1.compare(p2);
System.out.println(b);
//Person p = new Person("lisi");
//Person p1 = new Person("zhangsan");
//p.speak();
//p1.speak();
//p.speak();
}
}
2,this可以用於在構造函數中調用其他的構造函數,但是在調用其他構造函數的時候,要定義在構造函數的第一行,因爲初始化動作要先執行。
理解下面這個程序的執行過程就可以明白this在構造函數間的調用過程了。
class Person
{
private String name;
private int age;
Person()
{
System.out.println("person run");
}
Person(String name)
{
this();
this.name =name;
}
Person(String name,int age)
{
this(name);
this.age = age;
}
}
class Demo
{
public static void main(String[] args)
{
Person p = new Person("lisi",30);
}
}
二,super關鍵字和this的用法幾乎相同,它的不同在於,super指向的是父類的對象,而this指向的是本類的對象。
下面這個程序時面向對象裏面繼承的示例代碼,裏面幾乎涵蓋了super的所有使用方法。
class Person {
public String name;
public int age;
int num = 12;
Person(String name,int age) {
this.name = name;
this.age = age;
}
/*public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}*/
public void sayHello() {
System.out.println(name + ":" + age);
}
}
class Student extends Person {
int num = 13;
Student(String name,int age) {
super(name,age);
}
// 重寫父類中的sayHello方法
public void sayHello() {
System.out.println("我叫:" + name + ",今年" + age + "歲了");
System.out.println(super.num + "::" + this.num);//默認的this,可以省略
}
}
class Demo {
public static void main(String[] args) {
Student s = new Student("zhangsan",25);
/*s.setName("zhangsan");
s.setAge(25);*/
s.sayHello();
}
}
三,static(靜態)關鍵字
1,static關鍵字特點:
(1)他是一個修飾符,是用來修飾成員的(成員變量和成員方法)。
(2)static修飾的成員被所有的對象共享。
(3)static優先於對象存在,因爲static的成員隨着類的加載就已經存在於內存中了。
(4)static修飾的成員可以通過類名直接調用。類名.靜態成員
(5)static修飾的數據時共享數據,對象中存儲的是特有數據。
2,成員變量和靜態變量的區別:
(1)兩個變量的生命週期不同,成員變量隨着對象的創建而存在,隨着對象的被回收而釋放。
靜態變量隨着類的加載而存在,隨着類的消失而消失。
(2)調用方式不同,成員變量只能被對象調用,靜態成員變量可以被對象調用,還可以被類名調用。
(3)別名不同,成員變量也稱爲實例變量,靜態變量稱爲類變量。
(4)數據的存儲位置不同,成員變量存儲在堆內存中,也叫做對象的特有數據,而靜態變量數據
存儲在方法區(共享數據區)的靜態區,所以也叫做對象的共享數據。
3,靜態在使用時應該注意:
(1)靜態方法只能訪問靜態成員,而非靜態成員既可以訪問非靜態成員也可以訪問靜態成員。
(2)靜態方法中不可以使用this關鍵字和super關鍵字。
(3)主函數是靜態的。
4,靜態的使用:
(1)靜態變量:
當分析對象中所具備的成員變量的值都是相同的。這時,這個成員就可以被修飾成靜態的。只要數據在對象中都是不相同的,就是對象的特有數據,必須存儲在對象中,是非靜態的。如果是相同的數據,對象不需要做修改,只需要使用即可,不需要定義在對象中,定義成靜態的。
(2)靜態函數:
函數是否用靜態修飾,就參考一點,就是該函數的功能是否有訪問到對象中的特有數據。簡單點說,從源代碼看,該功能是否需要訪問非靜態的成員變量,如果需要該功能就是非靜態的。如果不需要就可以將該功能定義成靜態的,當然也可以定義成非靜態的。但是非靜態需要對象調用,而僅創建對象調用非靜態的沒有訪問特有數據的方法,該對象的創建時沒有意義的。
(3)靜態的優缺點
優點:對對象的共享數據進行單獨空間的存儲,節省空間。沒有必要每一個對象中都存儲一份。還可以直接被類名調用。
缺點:生命週期過長。訪問出現侷限性。(靜態雖好,只能訪問靜態。)
class Person {
int age;
static int num = 9;
Person(int age) {
this.age = age;
}
public static void speak() {
System.out.println(num);
}
public void show() {
System.out.println("age = " + age);
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person(30);
p.show();
p.speak();//這種方式不建議使用,減一使用下面的方式
Person.speak();
}
}
四,靜態代碼塊
1,靜態代碼塊格式:
static
{
靜態代碼塊中的執行語句。
}
2,靜態代碼塊的特點:隨着類的加載而執行,只執行一次,並且優於主函數。主函數是程序的入口,並且是直接由JVM直接調用的。
3,靜態代碼塊的作用是給類進行初始化。
class StaticCode
{
int num = 9;
StaticCode()
{
System.out.println("c");
}
static
{
System.out.println("d");
}
{
System.out.println("construct"+this.num);
}
StaticCode(int x)
{
System.out.println("e");
}
public static void show()
{
System.out.println("show run");
}
}
class StaticCodeDemo
{
static
{
System.out.println("a");
}
public static void main(String[] args)
{
//new StaticCode(4);//打印結果是:a,b,d,construct9,e
//StaticCode.show(); //打印結果:a,b,d,run show
//StaticCode s = new StaticCode(); //a,b,d,construct9,c
//StaticCode.show();//打印結果:a,b,d,show run
}
static
{
System.out.println("b");
}
}
五,fina關鍵字
1.fian關鍵字的特點是:
(1)可以用來修飾類,方法,變量
(2)final修飾的類不能被繼承
(3)fianl修飾的方法不可以被覆蓋
(4)fianl修飾的變量只能被賦值一次
(5)fianl既可以修飾成員變量也可以修飾局部變量,內部類只能訪問被fianl修飾的局部變量
2,什麼時候使用final呢?
當在描述事物時,一些數據的出現值是固定的,那麼這時爲了增強閱讀性,都給這些值起個名字。方便於閱讀。而這個值不需要改變,所以加上final修飾。作爲常量:常量的書寫規範所有字母都大寫,如果由多個單詞組成。單詞間通過_連接。
在java文檔中有很多字段就是fianl的,其實就是一個常量,這個常量不需要改變,所以寫成了大寫。