zoukankan      html  css  js  c++  java
  • Java核心(二):四种权限修饰符的区别、private是否能够修饰class

      一、public、protected、default、private四种权限修饰符的区别
      public:具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式。
      protected:主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西
      default:有时候也称为friendly,它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以。
      private:访问权限仅限于类的内部,是一种封装的体现,例如,大多数成员变量都是修饰符为private的,它们不希望被其他任何外部的类访问。
      注意:java的访问控制是停留在编译层的,也就是它不会在.class文件中留下任何的痕迹,只在编译的时候进行访问控制的检查。其实,通过反射的手段,是可以访问任何包下任何类中的成员,例如,访问类的私有成员也是可能的。
    • public:可以被所有其他类所访问
    • protected:自身、子类及同一个包中类均可以访问
    • default:同一包中的类可以访问,声明时没有加修饰符,认为是friendly
    • private:只能被自己访问和修改

     

    二、Java的外部类为什么不能使用private、protected进行修饰

       对于顶级类(外部类)来说,只有两种修饰符:public和默认(default)。因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置。因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default)。
      为什么是这种情况呢?可以想一下,一个java项目是不可能在一个class里面完成的。mvc模式中,是把类分为三层,一层层调用类。如果定义为私有的和受保护的就无法调用。换句话说,对于一个java文件,要么就是自己单独运行,要么就是被其他程序作为库调用,如果一个java文件的类被private修饰,那么是不是其他的程序或是类是无法使用它的,那么他作为一个单独的文件就没啥用了。如果它作为单个文件运行,类加载怎么找到它呢,因为它对外不可见。同时,也失去了类的存在意义。因此,类只有public和默认修饰符。
      如果类使用了private修饰符,说明是个内部类。内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(private),同包(default),父子类(protected),任何位置(public)。当一个内部类使用了private修饰后,只能在该类的外部类内部使用。
     
    三、private能否修饰class?
      private只能修饰内部类。
    //外部类
    public
    class OuterClass { //内部类 private static class InnerClass { public static void doSomething() { System.out.println(“我是内部类的方法。"); } public static void main(String args[]){ System.out.println("我是内部类的主方法main()"); } } //外部类主方法 public static void main(String[] args) {
              //在外部类中调用内部类的方法 InnerClass.doSomething(); } }
    public class OutClass {
        /**
         * 内部类
         */
        private class InnerClass{
            public void doSomething(){
                System.out.println("我是内部类的doSomething()方法");
            }
    
        }
    
        public void todo(){
            System.out.println("我是外部类的todo()方法,调用内部类的doSomething()方法-----");
            new InnerClass().doSomething();
        }
    }
    
    class Test{
    
        public static void main(String[] args) {
            new OutClass().todo();
        }
    }
    本博客部分内容转载自CSDN
    作者:yangyongUestc  
    原文:https://blog.csdn.net/yangyong0717/article/details/78379760
     
  • 相关阅读:
    Access导入MSSQL SERVER
    Centos8停用、启用、查看当前启用的端口
    CentOS下使用VI
    CentOS关机与重启命令
    华为云CentOS8安装FTP
    华为云CentOS8安装JDK
    华为云CentOS8安装Nginx
    华为云CentOS8安装Redis
    华为云CentOS8安装MYSQL
    oracle 本地导入imp bat的写法
  • 原文地址:https://www.cnblogs.com/newbie27/p/10413558.html
Copyright © 2011-2022 走看看