類和物件(中)

啊哈biubiubiu~發表於2020-11-10

Java的訪問控制修飾符及許可權

修飾符:public、protected、private、預設;
類的各種成員和方法被不同修飾符修飾
同一包內,可以訪問所有類的public,protected,預設的所有屬性和方法,不能訪問private屬性和方法。
同一包
不同包只能訪問其他包的public屬性和方法,其他都不可訪問
不同包

小結

訪問許可權首先看類前的修飾符:
當類的修飾符為public時,則類可以被所有的類所訪問(可以import)
當為預設時,則只能為包中的類所訪問。
在此前提下,再看屬性和方法前的修飾符:
類前修飾符為public時,當屬性和方法前的修飾符為public時,則該屬性可以被所有類訪問;
當屬性和方法前為protected修飾時,對於類定義而言,可以被同包中的類和所有子類訪問(子類和父類可以不在同一個包中),也就是B+C範圍,但對於物件而言,只能被同一個包的類物件所訪問,也就是B的範圍;
當為預設時,只能被同包中的類所訪問(比protected訪問許可權小);當為private時,只能被本類內部所訪問 。
在這裡插入圖片描述

子類對於從父類繼承的哪些屬性與方法的可見性

子類繼承了父類的所有屬性和方法, 但只有public、protected的屬性和方法在子類是可見的。
子類在繼承父類的時候,首先應該滿足父類可被訪問,例如當子類和父類不
在同一個包當中時,父類修飾符必為public;在父類能被訪問的前提下,凡
是修飾符為public或是protected的父類屬性成員或是方法能被子類所訪問;
private的屬性成員或是方法則不能被訪問。
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

組合

組合:一個類的物件引用是另一個類的屬性就是一個組合現象。
作用:java程式碼複用的一種方法。顧名思義,就是使用多個已有的物件組合為一個功能更加複雜強大的新物件。體現的是整體與部分、擁有的關係.

public class job {
	String name;
	int salary;
	public int getsalary() {
		return salary;
	}
	public void setsalary(int sa) {
		this.salary=sa;
	}
	public String getname() {
		return name;
	}
	public void setname(String na) {
		this.name=na;
	}
}
class person{
	String name;
	job j;
	person(String na){
		this.j=new job();
		j.setname("baiche");
		j.setsalary(100);
		this.name=na;
	}
	public void cout() {
		System.out.println("My name is "+name);
		System.out.println("My job is "+j.getname());
		System.out.println("My salary is "+j.getsalary());
	}
}
public class run3 {
	public static void main(String[] args) {
		person p=new person("jiangshan");
		p.cout();
	}
}

過載

過載:在類中定義了多個同名而不同內容引數的成員方法時,稱這些方法是過載方法。
作用:同一型別的方法,對不同的物件,具有不同的表現形式

class Parent {
	public int getScore(){
		return 3;
	}
}
class Son extends Parent {
	public int getScore(){
		return 4;
	}
}

注:如果子類定義的方法與父類名稱相同(大小寫完全匹配),但引數名稱不同,不是覆蓋,而是過載。如果名稱、引數相同,返回值不同,則編譯不能通過。

覆蓋

如果在子類中定義一個方法,其名稱、返回型別及引數簽名正好與父類中某個方法的名稱、返回型別及引數簽名相匹配,那麼可以說,子類的方法覆蓋了父類的方法。

public class zilei {
	int a,b;
	int sum;
	public void set(int a,int b) {
		sum=a+b;
		System.out.println(sum);
	}
	public int get() {
		return sum;
	}
}
class fugai extends zilei{
	public void set(int a,int b) {
		sum=a*b;
		System.out.println(sum);
	}
}
public class run4 {
	public static void main(String[] args) {
		zilei z=new zilei();
		z.set(2, 3);
		fugai f=new fugai();
		f.set(2,3);
	}
}
注意;子類的訪問修飾符許可權應等於或大於父類
同名的static方法和非static方法不能相互覆蓋
方法前有final修飾符,此方法不能在子類方法中進行覆蓋
在JDK中,很多父類的方法被子類重新覆蓋,賦予了不同的含義,如Object類中的boolean equals(Object obj)方法
抽象類中如果存在抽象方法,則具體子類必須對抽象方法進行覆蓋

相關文章