1.通路修飾符
限定詞 | 同一個類中 | 同一個包中 | 不同包中的子類 | 不同包中的非子類 |
---|---|---|---|---|
private | ✔ | |||
無限定詞 | ✔ | ✔ | ||
protected | ✔ | ✔ | ✔ | |
public | ✔ | ✔ | ✔ | ✔ |
(1)private
隻能被所屬類通路,類、接口不能聲明為這種類型,外部隻能通過類中的公共方法通路。隐藏類的實作細節和保護資料。
package create;
public class PrivateTest {
private String name; //私有的成員變量
//私有成員變量的get/set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args){
//建立類的對象
PrivateTest p = new PrivateTest();
//調用對象的set方法,為成員變量指派
p.setName("private通路修飾符");
//列印成員變量name的值
System.out.println("name = " + p.getName());
}
}
(2)不使用任何關鍵字
他們可以被目前包裡其他類通路。
package create;
public class DefaultTest {
String name; //預設修飾符的成員變量
String getName() { //預設修飾符成員變量的get方法
return name;
}
void setName(String name) { //預設修飾符成員變量的set方法
this.name = name;
}
public static void main(String[] args){
DefaultTest d = new DefaultTest();
d.setName("default test");
System.out.println(d.getName());
}
}
(3)protected
能被包内任何類通路,也可以被不同包中的子類通路。
package create;
public class Person {
protected String name;
protected void sing(){
System.out.println("父類...");
}
public void test(){
System.out.println("父類:public test");
}
}
package child;
import create.Person;
public class Women extends Person{
public static void main(String[] args){
Women w = new Women();
w.sing();
w.name = "protected";
System.out.println(w.name);
}
}
(4)public
package create;
public class Person {
protected String name;
protected void sing(){
System.out.println("父類...");
}
public void test(){
System.out.println("父類:public test");
}
}
package child;
import create.Person;
public class PublicTest {
public static void main(String[] args) {
Person p = new Person();
p.test();
}
}
2.非通路修飾符
(1)static修飾符
修飾成員變量和方法,直接通過類名通路。
格式:類名.靜态變量名
類名.靜态方法名
靜态方法不能使用類的非靜态變量,靜态方法必須被實作,隻能通路所屬類的靜态成員變量和靜态成員方法。
靜态代碼塊獨立于類成員,位置随便放,加載類是時會被執行,
package create;
public class StaticTest {
public static final String BANANA = "香蕉"; //static final 修飾的常量
public static float price = 5.2f; //final定義的成員變量
static{
System.out.println("static 靜态塊");
}
public static void test(){
System.out.println(StaticTest.BANANA + "的價格是:" + StaticTest.price);
}
public static void main(String[] args){
StaticTest st = new StaticTest();
st.test();
System.out.println("main()中,"+st.BANANA+"的price = " + st.price);
}
}
static 靜态塊
香蕉的價格是:5.2
main()中,香蕉的price = 5.2
(2)final修飾符
用final修飾的變量是常量,值一旦給定就無法改變。
如果一個類不允許其子類覆寫某個方法,則可以把這個方法聲明為final方法。
使用final方法的原因有兩個:一是把方法鎖定,防止任何繼承類修改它的意義和實作。二是高效。
final關鍵字聲明的類不能被繼承,即最終類。