《Java 编程思想》学习笔记 05 | 访问权限控制

1.访问权限控制的等级

以最大权限到最小权限依次为:

  1. public(接口访问权限
  2. protected(默认包访问权限会限制继承访问权限
  3. 默认包访问权限
  4. private(类访问权限

注意:如果父类和子类不在同一个包中,就算父类的方法用protected修饰,在另一个包中的子类也无法调用该方法。所以说,包访问权限会限制继承访问权限,这样就能避免滥用保护机制:通过在别的包派生子类从而访问受保护的字段做一些坏事。

package a;

public class Father {
    protected void show() {
        System.out.println("FatherShow");
    }
}
package b;

import a.Father;

public class Child extends Father {
    public static void main(String[] args) {
        Father f = new Child();
        //f.show();  //编译不通过,报错!
    }
}

2.每个类中只有一个public类

Java中明确规定,一个类中只能有一个public类,其它的类仅仅只是为了给这个public类提供支持,并且包外的世界无法访问这些非public类。

3.package与import

package a.b.c; //将下面的Myclass这个编译单元声明为a.b.c这个类库的一部分。

public class Myclass {
    ...
}
import a.b.c.Myclass; //要想使用a.b.c类库下的Myclass类,就必须使用import。
//import.a.b.c.*; //当然也可以这么写,用*号表示导入a.b.c类库的所有类。

public class ImportedMyclass {
    public static void main(string[] args) {
        Myclass myclass = new Myclass();
    }
}

注意:包名全部用小写字母。

4.Java解释器运行原理与CLASSPATH与package

假设现在有一个CLASSATH为:CLASSPATH=.;D:\JAVA\LIB;C:\DOC\JavaT

有一个包为:package a.b.c;

那么,Java解释器的运行原理如下:

首先Java解释器会找出环境变量CLASSPATH,将CLASSPATH中的多个目录用作查找.class文件的根目录;

接着Java解释器获取包的名称,将句号换成反斜杠(a\b\c),并与CLASSPATH中的目录名称相连形成一个路径

最后Java解释器就会在这些路径中查找与你所要使用的类相对应的.class文件

5.使用JAR文件时要在CLASSPATH中使用全称

比如CLASSPATH=.;C:\flavors\grape.jar

当然,使用IDEA直接导入JAR包就不用在CLASSPATH中设置路径了,就是得去下载JAR包。

注意:不要错误地将当前目录视作查找行为的起点之一,如果CLASSPATH中缺少一个“.”作为路径之一的话,那么Java就不会查找那里。

6.Java5开始不必再设定默认的CALSSPATH

从Java5开始CLASSPATH默认就是当前路径,一般情况下就不需要再设定了。若使用Java5以前的版本,需要设置环境变量CLASSPATH为:

CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

其中dt.jar是关于java运行环境的类库;tools.jar是工具类库;

image.png

java5中,sun公司改进了JDK设计,JRE会自动搜索当前路径下的jar包,并自动加载dt.jar和tools.jar。所以从Java5开始,就不必再设置CLASSPATH环境变量了。

7.默认包

当一个目录中有许多的Java文件,并且这些Java文件都没有明确的package声明,那么这些文件就会在当前目录中以默认包的形式共享,所有的Java文件都被赋予了包访问权限。

8.protected继承访问权限

如果基类的创建者希望某个特定的成员只可以被被派生类访问而不是被所有类访问的话,就可以使用protected继承访问权限。

public class Cookie {
    public Cookie() {}
    protected void bite() {}
}
/*
* 这里,bite()方法就可以被所有继承了Cookie类的派生类所访问。
*/

需要注意的是,protected也提供了包访问权限,所有位于同一个包内的类也可以访问protected成员。

9.封装的概念

隐藏对象的属性和实现细节,仅对外提供公共的访问接口。

通俗点讲就是将一个类中的数据成员和成员方法用private修饰,只对外提供一个接口,用户只需要通过对接口的访问,就可以实现想要的操作。

10.类只能是public和默认,不可以是private或protected

类如果是private的话,将会使得除了它自己以外,所有的类都无法访问它,类也不能是protected的。如果不希望其他任何人对该类拥有访问权限,可以将该类的构造方法设为private,从而阻止创建该类的对象。(但要记住,如果有某一个类的构造器被设为private,该类的static成员是可以使用private构造器来创建该类的对象的,这是单例设计模式的精髓。

Java中的类只允许是public和默认的,当然,如果是内部类的话就可以将类设为private和protected。

11.单例设计模式(private构造器,private static对象,public static方法访问)

单例设计模式就是指:将某一个类的构造器声明为private,使其无法被其它类所创建;然后在该类内部new一个private static对象,最后创建一个public方法返回该对象,这样,就始终只能创建该类的一个对象,并且只能以通过该类的公共方法返回该类的对象的形式使用这个唯一的静态对象。例如:

 
class Soup {
    private Soup() {} //将构造方法声明为private
    
    private static Soup sp = new Soup(); //在该类中new一个private static对象
    
    public static Soup access() { //创建一个publcic access方法返回刚刚创建的对象,提供唯一的对外接口
        return sp;
    }
    
    public void f() {} 
}
public class Lunch {
    void testSingleto() {
        Soup.access().f(); //用Soup.access()使用Soup的唯一静态对象来调用f()方法
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值