首页 > 代码库 > Java编程思想(三) —— 访问权限的控制

Java编程思想(三) —— 访问权限的控制

之前没去注意的修饰符,一般变量前面没添加,一个是不知道有什么用,一个是懒,后面遇到项目的时候就会发现私有和公有区别还是很大的。


(1)首先是包名

使用一个类的时候,例如集合类,就需要引入这个包,然后再使用该包下面的类。如:

package com.myown.iaiti;

public class Print {
    static void print(String s){
        System.out.println(s);
    }
}

自定义的包,通过引入自己的包,以后你就可以使用自己写的方法进行字符串的打印。之前试过将自己包的路径设进CLASSPATH中,那么在其他目录编译,不需要将包放进该目录,也可以正常运行,不然的话是找不到JAR包的。


(2)public

public,公共的,以前的老师经常用老子来比喻,这是公共的东西,老子给你用,public紧跟数据成员,说明对每个人都是可用的。


(3)private

private,私有的,老子的私有财产,你不要动它,除了包里含有这个数据成员的类可以用之外,其他类不能使用,这部分是设计者本身不想给外人看和修改的。

public class Print {
    public static void main(String[] args) {
        GetIt g = new GetIt();
    }
}

 class GetIt{// 注意 一个文件只能有一个公共类 如果你想在
     //前面加上public 那么就不要和Print写在同一个文件
    private GetIt(){}
}

The constructor GetIt() is not visible,不可见,看出用处了吧,单例模式也是这么用的,控制对象的创建。


单例模式的应用:

class A{
    private A(){} 
    private static A a = new A(); 
    public static A getInstace(){
        return a;
    }
}
其他的类不能通过new来创建对象,因为构造器被private所修饰,用处在于,当这个A类极为复杂,耗内存的时候,我需要严格控制A对象的创建。既然举了单例,顺便就把单例给讲了。之前看过一些人写的,实在太经典,太厉害了


上面那种是属于饿汉式,就是一来就帮你new出来,以后new的时候就直接用,不存在线程问题,缺点是放着如果没用的话就是资源浪费。


懒汉式

public class A {       
     private A(){ }    
    
     private static A a;    
     public static A getInstance(){    
         if(a == null){    
             return a = new A();    
         }else{    
             return a;    
         }    
     }    
 }

用的时候才帮你new,为null才new,但是存在线程问题,加上synchronized,但是效率降低,因为多线程的话,其中有一个在用的话,就会霸占着。


完美的方法是结合两者:

public class A {
    // 私有静态内部类, 只有当有引用时, 该类才会被装载
    private static class LazyA {
        public static A A = new A();
    }
    public static A getInstance() {
        return LazyA.A;
    }
}

之前看不懂这个所谓的静态内部类,作用是,既可以做到延时加载,因为只有当使用的时候才会去new,用getInstace方法,不存在多线程问题是因为,静态类属于所有外部类对象,只会加载一次,而静态内部类实例化之后,便是类级别的属性,不属于某个对象,只会加载一次,这样就不会存在资源浪费,也没有多线程效率低的问题。想出这个方法的人真的厉害。




(4)protected

Print是基类,国人喜欢讲父类,但是老外觉得子类更牛逼,基类算是一个根基或者基础吧,protected就是老子专门留给儿子的财产。

public class Print {
    protected void print(){}
    private void cannotprint(){}
}


public class PrintSon extends Print{
   void get(){
       print();
       //cannotprint();   private 私有的方法,子类还是不能用
   }
}


public class NotSon {
    void get() {
        print();
    }
}

protected修饰的,子类可以拿到,介于public和private之间。


(5)类的访问权限

每个文件只能有一个public类。

类名和文件名一致。


单例的话如果没基础看起来有点超前,但是后面知识点完善之后,会容易理解,访问权限的控制还是在于你想不想把自己的那部分代码给别人直接使用。