Java基础:访问限制修饰符

Java基础:访问限制修饰符

访问限制修饰符有private,public,protected,他们都是Java的关键字,用来修饰成员变量和方法。

注意,在编写类的时候,类中的实例方法总是可以操作该类中的实例变量和类变量。类方法总是可以操作该类中的类变量,与访问限制符没有关系。

公有变量和公有方法

使用public修饰。权限最高,可以在不同包中不同类中被访问。

友好变量和友好方法

不用public、protected、private修饰符等修饰的成员变量和方法。权限从上至下排在第二。只能在该包中使用,包括不能被别的包的子类继承。

受保护的变量和受保护的方法

使用protected修饰。可以被继承。除了子类以外,在别的类中无法引用protected修饰的变量和方法。

私有变量和私有方法

用关键字private修饰。只能被当前类使用,不能被其他类拿出来使用。是定义某个权限最低的变量和方法的关键字。也无法被继承。

两种类

分别为public修饰的和友好类(即不加任何修饰符),除此之外,使用protected和private修饰的都是错误的,不存在的。

友好类的访问权限限制于当前包。

protected和默认修饰符的区别

到目前为止,两者似乎没有什么区别。但是两者的确是有区别的,在子类继承的时候。分为两种情况:

当子类和父类在同一个包下:

子类可以继承父类中不是private的变量和方法。

当子类和父类在不同包下:

子类只能继承protected和public的成员变量。

protected的进一步说明:

假设s包下有两个类,分别是temp5和test_temp5。t包下有一个类是temp2。现在temp5继承了temp2。我们来看在temp5和test_temp5中关于父类的操作权限。

temp2.java

package t;

public class temp2{
    private int a;
    private int getA(){
        return a;
    }
    protected int b;
    protected int getB(){
        return b;
    }
    int c;
    int getC(){
        return c;
    }
    public int d = 0;
    int getD(){
        return d;
    }
}

temp5.java

package s;

import t.temp2;

public class temp5 extends temp2{
    //在构造方法中查看可以使用的哪些继承来的变量
    public temp5(){
        this.a = 1;  //a是private的,显然报错
        this.b = 1;  //b是protected的
        this.c = 1;  //c是默认的,也会报错
        this.d = 1;  //d是public的
    }
}

test_temp5.java

package s;

public class test_temp5 {
    public test_temp5(){
        temp5 tem5 = new temp5();
        tem5.a = 1;     //报错,tem5对象的该变量继承自另外一个包,因此无法访问。
        tem5.b = 1;     //报错
        tem5.c = 1;     //报错
        tem5.d = 1;
    } 
}

分析上述代码:

  • 对于子类temp5从temp2继承的protected成员变量和方法,需要追溯到protected成员变量和方法所在的“祖先类”,只要test_temp5类和temp5的祖先类在一个包中,那么用temp5创建的对象就可以被test_temp5访问它继承的protected变量和方法。
  • 在不同包中,子类永远可以访问继承的protected和public变量和方法。

一个示例

(默认包)

Main.java

import s.temp5;
import t.temp2;
import t.temp3;

public class Main{
    public static void main(){
        Abc abc = new Abc();
        Abcd abcd = new Abcd();
        temp tem = new temp();     //同一个包下继承了Abc的类
        temp2 tem2 = new temp2();   //在不同包下,无法继承Main类的Abc类,因为Abc是友好类,无法被别的包下的类继承。
        temp3 tem3 = new temp3(); //与temp2在同一个包下,继承了temp2

        abc.a = 1;    //使用abc对象的a变量,为private,报错 
        abc.b = 1;   //使用abc对象的b变量,为protected
        abc.c = 3;   //default

        abcd.b = 2; //protected     
        abcd.c = 3; //default

        tem.b = 1; //protected
        tem.c = 2; //default

        tem2.b = 1;  //protected,报错,无法访问其protected变量
        tem2.c = 1;  //报错,无法访问其友好变量
        tem2.d = 1; //public的可以访问

        tem3.d = 1; //temp3继承了temp2,同上
    }
}

class Abc{
    private int a;
    private int getA(){
        return a;
    }
    protected int b;
    protected int getB(){
        return b;
    }

    int c;
    int getC(){
        return c;
    }
}

class Abcd extends Abc{
}

temp.java


public class temp extends Abc{
}

t包

temp2.java

package t;

public class temp2{
    private int a;
    private int getA(){
        return a;
    }
    protected int b;
    protected int getB(){
        return b;
    }
    int c;
    int getC(){
        return c;
    }

    public int d = 0;
    int getD(){
        return d;
    }
}

temp3.java

package t;

public class temp3 extends temp2{
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值