java 访问控制符 protected,以及命名空间 妙用

在JAVA中,如果一个类,方法,属性被设置成protected,表明只能在子类或者同一个命名空间中才能使用,但我们可以巧妙的利用特殊的编码方式,在其他的命名空间下,创造同一个命名空间,从而访问 protected 代表的类,方法,属性。

举例,定义一个Person类,注意:address 是protected static 

 

package test;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class Person {

    {
        System.out.println("instance 1");
        System.out.println(toString());
    }

    static {
        System.out.println("static 1");
    }

    private String          privateName         = "privateName";

    protected String        protectedName       = "protectedName";

    String                  friendlyName        = "friendlyName";

    public String           publicName          = "publicName";

    private static String   privateStaticName   = "privateStaticName";

    protected static String protectedStaticName = "protectedStaticName";

    static String           friendlyStaticName  = "friendlyStaticName";

    public static String    publicStaticName    = "publicStaticName";

    public Person() {
        System.out.println("no name");
    }

    public Person(String name) {
        System.out.println("my name is " + name);

        System.out.println(toString());
        this.privateName = name;
        System.out.println(toString());
    }

    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
        .append("privateName", privateName)
        .append("protectedName",protectedName)
        .append("friendlyName",friendlyName)
        .append("publicName",publicName)
        .append("privateStaticName",privateStaticName)
        .append("protectedStaticName",protectedStaticName)
        .append("friendlyStaticName",friendlyStaticName)
        .append("publicStaticName",publicStaticName).toString();
    }

    {
        System.out.println("instance 2");
        System.out.println(toString());
    }

    static {
        System.out.println("static 2");

    }
}

 

利用new Person()制造命名空间:

package test;

public class PersonTest {

    public static void main(String[] args) {

        Person person = new Person("bob") {

            {
                System.out.println("outside");
            }

            public void cut() {
                System.out.println("cut");
            }

            {
                publicName = "newPublicName";
                protectedName = "newProtectedName";
                friendlyName = "newFriendlyName";

                publicStaticName = "newPublicStaticName";
                protectedStaticName = "newProtectedStaticName";
                friendlyStaticName = "newFriendlyStaticName";

                cut();

                System.out.println(toString());
            }

        };

        System.out.println(person.toString());

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

perfect5085

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值