Java作用域修饰符
在java语言中,可以使用访问修饰符来规定对类、变量、方法和构造方法的访问。
文章目录
- 一、访问修饰符
- 二、非访问修饰符
一、访问修饰符
1.私有的访问修饰符private:
声明为私有访问类型的变量只能通过类中的公共方法被外部类访问。
被声明为private的方法、变量和构造方法,只能被所属类访问,并且类和接口不能被声明为private。
public class PrivateTest{private String name;//私有成员变量public String getName(){return name;}public void setName(String name){this.name = name;}//下面说明了:声明为私有访问类型的变量只能通过类中的公共方法被外部类访问。public static void main(String[] args){PrivateTest p = new PrivateText();//创建类的对象p.setName("private访问修饰符");//调用对象的set方法,为私有成员变量name赋值。System.out.println("name = " + p.getname());}
}
2.无访问修饰符:
不使用访问修饰符声明的变量和方法,可以被这个类本身或者与类在同一个包内的其他类访问。
接口中变量隐式声明为 public stastic final。
接口中的方法默认访问权限为 public。
public class PrivateTest{String name;//默认访问修饰符的成员变量String getName(){return name;}void setName(String name){this.name = name;}public static void main(String[] args){DefaultTest d = new DefaultText();d.setName("default test");System.out.println("name = " + d.getname());}
}
3.受保护的访问修饰符protected
protected修饰符不能修饰类和接口,方法和成员变量能够声明为protected。接口的成员变量和方法不能声明为protected。
可以被这个类本身、与类在同一个包内的其他类、不同包中的子类访问。
package create;
public class Person{ //父类protected String name; protected void sing(){ System.out.println("父类");}
}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"; //可见不同包中的子类可以访问protected修饰的变量。System.out.println(w.name);}
}
4.公有的访问修饰符public
被声明为public的类、方法、构造方法和接口能够被任何其他类访问。
几个相互访问的public类分布在不同的包中,则需要用import导入相应public类所在的包。
类所有的公有方法和变量都能被其子类继承。
package create;
public class Person{public void test(){System.out.println("父类:public test");}
}package child;
import creat.Person;
public class PublicTest{//两个类之间没有继承关系public static void main(String[] args){Person p = new Person();p.test();//调用person类中public方法。}
}
二、非访问修饰符
1.static修饰符
static修饰符用来修饰类的成员变量和成员方法,也可以形成静态代码块。
static修饰的成员变量和成员方法也成为静态变量、静态方法,可以直接通过类名访问他们。
静态变量也称为类变量,局部变量不能被声明成static变量。
无论一个类实例化多少个对象,它的静态变量就只有一份,静态变量独立于该类的任何对象。
JVM加载类时,就会执行静态代码块。
package create;
public class StaticTest{public static final String BANANA = "香蕉";//用static和final修饰的成员变量一旦初始化,其值就不能修改,它的名字建议用大写字母。public static float price = 5.2f;static{//JVM在加载类时会执行这些静态代码块,每个代码块只会被执行一次。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 + "的价格 = " + st.price);//通过对象st调用类的静态成员变量和常量。}
}
2.final修饰符:
final可以修饰类、方法、变量。
final可以修饰类中的变量,分别是静态变量、成员变量、局部变量。
变量初始化可以在定义时初始化,也可以在构造方法中赋初值。final修饰的成员变量表示常量,值一旦给定就无法改变。
一个类不允许其子类覆盖某个方法,可以把这个方法声明为final方法。
final声明的类不能被继承。
/*
如下:编译报错:
错误:无法为最终变量f分配值
错误:Son中的work()无法覆盖Father中的work(),被覆盖的方法为final*/
public class Father{final int f = 9;//值一旦给定就无法改变final void work(){//final定义的成员方法不能被重写System.out.println("上班");}
}
public class Son extends Father{public static void main(String[] args){Son s = new son();s.f = 12;//错误System.out.println(s,f);} void work(){//错误}
}