• 访问权限PPP(public、private、protected、default)之成员变量、成员变量权限解析


    首先,我们需要清楚一下方法是由哪些部分构成的:

    [权限修饰符列表][别的修饰符列表] 返回值类型 方法名(参数列表){
       方法体;
    }

    然后我们需要知道成员变量和成员方法访问有几种情况:1、当前包同一个类  2、当前包里面别的类  3、别的包里别的类  4、自己包继承关系的类  5、从别的包里有继承关系的类 

    第一步先创建一个别的类的代码,示例:

    package com.java;
    public class admin{
        //成员变量的访问权限
        public int i1 = 10;
        protected int i2 = 20;
        private int i3 = 30;
        int i4 = 40;//default(默认)
    }

    然后创建带main方法的代码,并创建同包内的class,示例:

    package cn.java;
    import com.java.admin;
     public class PPP01{
     //public class PPP01 extends Customer{
     //public class PPP01 extends admin{
         //成员变量的访问权限
        public int b1 = 10;
        protected int b2 = 20;
        private int b3 = 30;
        int b4 = 40;
         public static void main(String[] args){
            //相同的包,不同的类,没有继承关系
            Customer a = new Customer();//未继承情况下运行
            System.out.println( a.i1 );
            System.out.println( a.i2 );
            System.out.println( a.i3 );//报错:i3可以在Customer中访问private
            System.out.println( a.i4 );
            //相同的包,相同的类,没有继承关系
            PPP01 b = new PPP01();
            System.out.println( b.b1 );//都可以运行
            System.out.println( b.b2 );
            System.out.println( b.b3 );
            System.out.println( b.b4 );
            //相同的包,不同的类,有继承关系
            Customer c = new Customer();
            System.out.println( c.i1 );
            System.out.println( c.i2 );
            System.out.println( c.i3 );//错误: i3可以在Customer中访问private
            System.out.println( c.i4 );
            //不同的包,不同的类,没有继承关系
            admin d = new admin();
            System.out.println( d.i1 );//在未继承状态下运行
            System.out.println( d.i2 );//错误: i2可以在admin中访问protected
            System.out.println( d.i3 );//错误: i3可以在admin中访问private
            System.out.println( d.i4 );//错误: i4在User中不是公共的; 无法从外部程序包中对其进行访问
            //不同的包,不同的类,有继承关系
            admin e = new admin();
            System.out.println( e.i1 );
            System.out.println( e.i2 );//错误: i2可以在admin中访问protected
            System.out.println( e.i3 );//错误: i3可以在admin中访问private
            System.out.println( e.i4 );//错误: i4在admin中不是公共的; 无法从外部程序包中对其进行访问
         }
     }
    class Customer{
        //成员变量的访问权限
        public int i1 = 10;
        protected int i2 = 20;
        private int i3 = 30;
        int i4 = 40;
    }

    在不同情况下的运行可得出结果

    ----------------------成员变量的访问权限-------------------------
                                      public       private      protected        default
     当前包同一个类               可以          可以           可以               可以

     当前包里面别的类            可以         不可以         可以                可以

     别的包里别的类               可以         不可以       不可以             不可以

     自己包继承关系的类         可以         不可以        可以(V)           可以(V)

     从别的包里有继承关系的类 可以         不可以        可以(V)          不可以(x)

    成员方法代码和变量的代码差不多,但是要注意,方法需要返回值return,运算后得出结论:

    ------------------------成员方法的访问权限---------------------------
                                           public              private              protected             default
     当前包同一个类                  可以                可以                    可以                    可以

     当前包里面别的类               可以               不可以                  可以                     可以

     别的包里别的类                  可以               不可以                 不可以                  不可以

     自己包继承关系的类            可以               不可以                  可以(V)               可以(V)

    从别的包里有继承关系的类    可以               不可以                  可以(v)               不可以(x)

    根据以上结果,可得出结论:

           (1)protected:如果跨包的话,必须有继承关系才可以,自己的包可以直接访问不受影响

            (2)default:跨包就不可以。

            (3)在实例化子类变量的时候,可以访问父类的成员变量,这才可继承访问权限

            (4)如果在子类中,实例化父类的对象,访问权限不变

           (5)public:不管在成员变量还是成员方法中都可以访问

       以上就是我的理解,请大家多多指导。

                                                                                                                                                                           欢迎转载,但请注明出处。

     ------http://www.cnblogs.com/wing411/---------

    ····················································Wing--九尾狗编辑 http://www.cnblogs.com/wing411/
  • 相关阅读:
    [CF1076D] Edge Deletion
    [CF1081D] Maximum Distance
    [CF1095F] Make It Connected
    [CF1328E] Tree Queries
    [CF1328F] Make k Equal
    Codeforces Round #629 (Div. 3) 总结
    [CF1131D] Gourmet choice
    [CF1176D] Recover it!
    [CF1205B] Shortest Cycle
    [CF1213G] Path Queries
  • 原文地址:https://www.cnblogs.com/wing411/p/4722261.html
Copyright © 2020-2023  润新知