文章目录
一、Access Specifiers访问控制符
public
protected
"default"
private
二、对成员变量和成员方法使用访问控制符
public
:我的东西大家任何人都可以分享protected
:我的东西我可以和跟我一块住的那个人分享。另外也可以跟不在家的儿子分享"default"
:我的东西可以和跟我一块住的那个人分享。private
:我什么都不跟别人分享。只有自己知道。
1.public
都可见:不同包下都可见,其他的更可见。
( 我的东西大家任何人都可以分享)
package Main;
public class Hello{
public String content = "world";
public Hello()
{
System.out.println("Hello Constructor");
}
public void printHello()
{
System.out.println("hello");
}
}
package Second;
import Main.Hello;
public class Hi {
public static void main(String[] args) {
Hello h = new Hello();
h.printHello();
System.out.println(h.content);
}
}
2.protected
同一包内(本类和包内其他类)可见和不同包下的子类可见;不同包内不可见
(我的东西我可以和跟我一块住的那个人分享。另外也可以跟不在家的儿子分享)
类NewObject中有protected修饰的方法或者属性,则:
同一个包中:
- 可在同一个包里的子类中实例化NewObject类获得对象,然后可用该对象访问protected修饰的方法或者属性,即.操作访问。
- 可在同一个包里的非子类中实例化NewObject类获得对象,然后可用该对象访问protected修饰的方法或者属性。
- 可在同一个包里的非子类中实例化NewObject类的子类(该子类和NewObject类在同一个包中)获得对象,然后可用该对象访问protected修饰的方法或者属性。
- 可在同一个包里的NewObject类的子类中调用NewObject类中protected修饰的方法或者属性,即protected修饰的方法和属性可被同一个包中的子类继承。
非同一个包中:
- 可在非同一个包里的子类中实例化NewObject类获得对象,但无法用该对象问protected修饰的方法或者属性。
- 可在非同一个包里的非子类中实例化NewObject类获得对象,但无法用该对象问protected修饰的方法或者属性。
- 可在非同一个包里的非子类中实例化NewObject类的子类(该子类和NewObject类不在同一个包中)获得对象,但无法用该对象问protected修饰的方法或者属性。
- 可在非同一个包里的NewObject类的子类中调用NewObject类中protected修饰的方法或者属性,即protected修饰的方法和属性可被不同一个包中的子类继承。
例:非同一个包中,第一条。
3.default
- 只有同一包内可见;不同包内不可见,不同包下子类更不可见。
(我的东西可以和跟我一块住的那个人分享。)
只有同一包内可见
//Main包下的ClassA
package Main;
public class ClassA{
String content = "world";
ClassA()
{
System.out.println("Hello Constructor");
}
void printHello()
{
System.out.println("hello");
}
}
package Main;
public class ClassB {
public static void main(String[] args) {
ClassA a = new ClassA();
a.printHello();
System.out.println(a.content);
}
}
/*
Hello Constructor
hello
world
*/
不同包下不可见
package Second;
import Main.ClassA;
public class ClassC {
public static void main(String[] args) {
//ClassA a = new ClassA();
//a.printHello();
//System.out.println(a.content);
}
}
4.private
- 只有本类可见:声明为private的成员变量和成员方法只有在类内可以调用,类外不可以调用。(我什么都不跟别人分享。只有自己知道。)
- 但我们可以通过静态方法来构造对象,也可以通过在类内定义方法得到一个private的成员变量值。
class Sundae {
private int price = 10;
private Sundae() {
System.out.println("Sundae's price:" + this.price);
}
private void setPrice(int price) {
this.price = price;
}
//在类定义方法得到一个private的成员变量值。
public int getPrice() {
return price;
}
//通过静态方法来构造对象
static Sundae makeASundae() {
return new Sundae();
}
}
public class IceCream {
public static void main(String[] args) {
//Sundae x = new Sundae(); //类外不可见
Sundae y = Sundae.makeASundae();
//System.out.println(y.price); //类外不可见
//y.setPrice(100); //类外不可见
System.out.println(y.getPrice());
}
}
/*
Sundae's price:10
10
*/
三、对类使用访问控制符
1.位置
修饰对象是类,是指这里:
2.规则
-
只能修饰为
public
和"default"
-
public
:包内包外都可见 -
"default"
:包内可见
3.附加类
PS:这不是内部类,内部类是定义在类中,是一种成员变量。
什么是附加类
Sundae
就是附加类。
附加类的访问控制修饰符
只能是"default"
可见性
包内可见
IceCream.java
文件
class Sundae {
public void printNice()
{
System.out.println("nice!");
}
}
public class IceCream {
}
Snack .java
文件
public class Snack {
public static void main(String[] args) {
Sundae s = new Sundae();
s.printNice();
}
}
//nice!