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关键字声明的类不能被继承,即最终类。