访问权限修饰符:
1. 有哪些访问权限修饰?
一共四个
- private
- protected
- public
- 默认//什么都没有
2.各个访问权限修饰符的控制范围?
- private修饰的是私有的,只允许在本类中访问。
同一包下:(private只要不是同一个类就不能直接访问)
package com.study;
public class User{
//私有
private int age;
//受保护的
protected int weight;
//公开的
public String name;
//默认的
String height;
}
package com.study;
public class Test01{
public static void main(String[] args){
User u = new User();
//错误: age 在 User 中是 private 访问控制
//System.out.println(u.age);
System.out.println(u.weight);
System.out.println(u.name);
System.out.println(u.height);
}
}
可以看出,同一包下,protected/public/默认还不能进行区分,下面在不同包下分析:
- 在不同包中,public修饰的仍能正常访问——public表示公开的,在任何位置都可以访问
当Test02和User在不同包下时,protected和默认修饰的都不能访问。还是没法区分。
package com.study.chen;
import com.study.User;
public class Test02{
public static void main(String[] args){
User u1 = new User();
//错误: weight 在 User 中是 protected 访问控制
System.out.println(u1.weight);
System.out.println(u1.name);
//错误: height在User中不是公共的; 无法从外部程序包中对其进行访问
System.out.println(u1.height);
}
}
-
protected在继承的子类中可以访问,默认的只能在同包下访问。
User在com.study包下。
Vip在com.chen包下。
User和Vip不在同一个包下。
但是Vip是User的子类。
package com.chen;
import com.study.*;
public class Vip extends User{
public void doSome(){
System.out.println(this.weight);
System.out.println(this.name);
//错误: height在User中不是公共的; 无法从外部程序包中对其进行访问
System.out.println(this.height);
}
}
综上,总结:
访问权限如下:
修饰符 | 本类 | 同包 | 子类 | 任意位置 |
---|---|---|---|---|
private | 可以 | 不行 | 不行 | 不行 |
protected | 可以 | 可以 | 可以 | 不行 |
public | 可以 | 可以 | 可以 | 可以 |
默认 | 可以 | 可以 | 不行 | 不行 |
public >protected>默认>private
3.访问修饰符可以修饰什么?
属性(4个都能用)
方法(4个都能用)
类(public和默认能用,其它不行。)
接口(public和默认能用,其它不行。)
…
package com.chen;
import com.study.*;
public class Test03{
//访问修饰符修饰属性
private int age;
protected int year;
int month;
public int day;
//访问修饰符修饰方法,静态方法也可以
public void f(){}
protected void g(){}
void k(){}
private void l(){}
}
//错误: 此处不允许使用修饰符protected
/*protected class A{
}
*/
// 错误: 此处不允许使用修饰符private
/*
private class A{
}
*/
class A{
}
//接口同上
//公共类需要有自己的java文件来声明
//错误: 类 B 是公共的, 应在名为 B.java 的文件中声明
/*public class B{
}
*/