一、this
this的應用:當定義類中功能時,該函數內部要用到調用該函數的對象時,這時用this來表示這個對象。但凡本類功能內部使用了本類對象,都用this表示。
示例:
class ThisDemo {
public static void main(String[] args) {
Person p1 = new Person("張三",25);
Person p2 = new Person("李四",30);
boolean b = p1.compare(p2);
System.out.println(p1.name+" "+p1.age);
System.out.println(p2.name+" "+p2.age);
System.out.println("年齡是否相等:"+b);
}
}
class Person {
int age;
String name;
Person(int age){
this.age = age;
}
Person(String name){
this.name = name;
}
Person(String name,int age){
this.name = name;
this.age = age;
}
public boolean compare(Person p){
return this.age == p.age;
}
}
以上代碼中,new一個對象 p1 的時候,通過Person類的構造函數傳遞了參數 “張三”和25,在Person類的構造函數中,this.age = age,意爲把參數age的值傳遞給本類對象 p1 的age屬性。
this即代表本類對象的引用。
Person p1 = new Person("張三",25); // 這個語句也能看出this關鍵字能在構造函數間調用
二、super
super 功能和this相似,只不過 super是在有繼承時,對父類對象中成員的引用。
示例:
public class SuperDemo{
public static void main(String[] args){
Manager m = new Manager("張三",5000,"財務部");
System.out.println(m.getDetails());
}
}
class Employee{
private String name;
private int salary;
Employee(String name,int salary){
this.name = name;
this.salary = salary;
}
public String getDetails(){
return "姓名:"+name+" 工資:"+salary;
}
}
class Manager extends Employee{
private String department;
Manager(String name,int salary,String department){
super(name,salary); //調用父類Employee()的構造方法。
this.department = department;
}
public String getDetails(){
//調用父類Employee()的getDetails()方法。
return super.getDetails()+" 部門:"+department;
}
}
三、static
static 是靜態的關鍵字,static用來修飾成員變量和成員函數靜態特點:
(1)隨着類的加載而加載,存於方法區(數據區)中,靜態變量生命週期最長,因爲隨着類的消失而消失。
(2)靜態成員優先於對象而存在,就是類一加載進內存靜態成員就有了,這時還沒有對象。所以,靜態方法中不能使用 this、super 關鍵字。
(3)靜態成員被本類的所有對象所共享。
(4)靜態成員可以直接被類名調用。
(5)靜態方法只能訪問靜態成員。
靜態的利弊:
利:對對象的共享數據單獨存儲,節省空間。沒有必要每個對象中都存儲一份, 可以直接被類名調用。
弊:生命週期過長,訪問出現侷限性(靜態只能訪問靜態)。
實例變量(非靜態)和類變量(靜態)區別:
1、存放位置:類變量隨着類的加載而存在於方法區(數據區)中,實例變量隨着對象的建立而存在於堆內存中。
2、生命週期: 類變量生命週期最長,隨着類的消失而消失,實例變量生命週期隨着對象的消失而消失。
示例:
class StaticDemo{
public static void main(String[] args){
Person p = new Person();
p.name = "張三";
p.show();
}
}
class Person {
String name; //非靜態成員變量,實例變量
static String country = "CN"; //靜態成員變量,類變量
public void show() {
System.out.println(name+": "+country);
}
}
四、final
final關鍵字可以修飾類、變量、方法。
final修飾的類不能被繼承,爲了避免被子類重寫。
final修飾的變量作爲常量,只能賦值一次不能被更改,既可以修飾成員變量也可以修飾局部變量。
final修飾的方法不能被重寫。
class FinalDemo{
public static void main(String[] args){
SubDemo s = new SubDemo();
s.show2();
}
}
class Demo{
final int x = 3; //x被final修飾,x的值不能再更改。
final int show1(){
return 4;
}
}
class SubDemo extends Demo{
//void show1(){} 錯誤,show1()被final修飾不能被重寫。
public void show2(){
System.out.println("x="+x+" y="+super.show1());
}
}
五、instanceof
public class InstanceofDemo{
public static void main(String[] args){
Manager m = new Manager("張三",5000,"財務部");
if(m instanceof Manager){ //若m是manager類型對象,則if表達式的值爲ture,否測爲false
System.out.println(m.getDetails());
}
else if(m instanceof Employee){
System.out.println(m.getDetails());
}
else{
System.out.println("error");
}
}
}
class Employee{
private String name;
private int salary;
Employee(String name,int salary){
this.name = name;
this.salary = salary;
}
public String getDetails(){
return "姓名:"+name+" 工資:"+salary;
}
}
class Manager extends Employee{
private String department;
Manager(String name,int salary,String department){
super(name,salary); //調用父類Employee()的構造方法。
this.department = department;
}
public String getDetails(){
//調用父類Employee()的getDetails()方法。
return super.getDetails()+" 部門:"+department;
}
}