• Java学习笔记(4)----Public,Protected,Package,Private修饰符可见性


    Java修饰符类型(public,protected,private,friendly)

    public的类、类属变量及方法,包内及包外的任何类均可以访问;
    protected的类、类属变量及方法,包内的任何类,及包外的那些继承了此类的子类才能访问;
    private的类、类属变量及方法,包内包外的任何类均不能访问;
    如果一个类、类属变量及方法不以这三种修饰符来修饰,它就是friendly类型的,那么包内的任何类都可以访问它,而包外的任何类都不能访问它(包括包外继承了此类的子类),因此,这种类、类属变量及方法对包内的其他类是友好的,开放的,而对包外的其他类是关闭的。

    从开放性来说,public > protected > package > private 。  其中 package修饰符就是默认修饰符,也就是缺省修饰符情况下的修饰符,实际中package 修饰符不能写出。

    示例:

    在同一工程中,在 src 包中定义 Modifier类 (且在Modifier类文件中定义默认修饰符类DefaultClass类),Modifier类的子类ModifierSub类,SamePackageTestModifier类;在另一个包 mvc.circle 包中,定义DifferentPackageTestModifierSub类,DifferentPackageTestModifier类,其中的函数和类的可见性如下所示:

    -- src/Modifier.java文件

    package src;
    
    public class Modifier {
        public void methodPublic(){
            System.out.println("这是Public方法");
        }
        protected void methodProtected(){
            System.out.println("这是Protected方法");
        }
        void methodDefault(){
            System.out.println("这是Default方法");
        }
        private void methodPrivate(){
            System.out.println("这是Private方法");
        }
        
        public void doTest(){
            DefaultClass aClass=new DefaultClass();
            aClass.methodPublic();  //同一包中,DefaultClass类的Public方法可见
            aClass.methodProtected();//同一包中,DefaultClass类的Protected方法可见
            aClass.methodDefault();  //同一包中,DefaultClass类的Default方法可见
                                    //同一包中,DefaultClass类的Private方法不可见
        }
    }
    
    class DefaultClass{
        public void methodPublic(){
            System.out.println("这是Default类的Public方法");
        }
        protected void methodProtected(){
            System.out.println("这是Default类的Protected方法");
        }
        void methodDefault(){
            System.out.println("这是Default类的Default方法");
        }
        private void methodPrivate(){
            System.out.println("这是Default类的private方法");
        }
    }

    -- src/ModifierSub.java 文件

    package src;
    
    
    public class ModifierSub extends Modifier {
        public void doTest(){
            methodPublic();    //子类中,父类Public方法可见
            methodProtected();//子类中,父类Protected方法可见
            methodDefault();//子类中,父类Default方法可见
                            //子类中,父类Private方法不可见
            
            //测试默认修饰符的类
            DefaultClass aClass=new DefaultClass();//同一包中,默认修饰符的类可见
            aClass.methodPublic();    //同一包中,默认修饰符的类的Public方法可见
            aClass.methodProtected();//同一包中,默认修饰符的类的Protected方法可见
            aClass.methodDefault();    //同一包中,默认修饰符的类的Default方法可见
                                    //同一包中,默认修饰符的类的Private方法不可见
        }
    }

    -- src/SamePackageTestModifier.java文件

    package src;
    
    public class SamePackageTestModifier {
        Modifier Modifier=new Modifier();
        public void doTest(){
            Modifier.methodPublic();    //同一包中,Public 方法可见
            Modifier.methodProtected();//同一包中,Protected方法可见
            Modifier.methodDefault();    //同一包中,Default方法可见
                                        //同一包中,Private方法不可见
            //同一包中,DefaultClass类可见
            DefaultClass aClass=new DefaultClass();
            aClass.methodPublic();    //同一包中,DefaultClass类的Public方法可见
            aClass.methodProtected();//同一包中,DefaultClass类的Protected方法可见
            aClass.methodDefault();  //同一包中,DefaultClas类的Default方法可见
                                    //同一包中,DefaultClass类的Private方法不可见
        }
    }

    -- mvc/circle/DifferentPackageTestModifierSub.java文件

    package mvc.circle;
    
    import src.Modifier;
    
    public class DifferentPackageTestModiferSub extends Modifier {
        public void doTest(){
            methodPublic();    //不同包的子类中,Public方法可见
            methodProtected(); //不同包的子类中,Protected方法可见
                                //不同包的子类中,Default方法不可见
            //不同包子类中,DefaultClass不可见    
        }
    }

    -- mvc/circle/DifferentPackageTestModifier.java 文件

    package mvc.circle;
    
    import src.Modifier;
    
    public class DifferentPackageTestModifer {
        Modifier modifier;
        public void doTest(){
            modifier=new Modifier();
            modifier.methodPublic();    //不同的包中,只有Public方法可见
            
            //不同包中,DefaultClass不可见
        }
    }
  • 相关阅读:
    ubuntu18 faster-rcnn
    osgViewer应用基础
    error C2086: “int WINGDIAPI”: 重定义
    test5
    test3
    test2
    Kinect关节数据
    MySQL乱码问题以及utf8mb4字符集
    mysql5.7执行sql语句报错:In aggregated query without GROUP BY, expression #1 of SELECT list contains nonagg
    yum安装软件报错:curl#6
  • 原文地址:https://www.cnblogs.com/dongling/p/5783111.html
Copyright © 2020-2023  润新知