Chapter 5 Hiding the Implementation

    现在想好好学学java了,学校里的c和汇编帮我打下了学语言的基础。要把Thinking in java看完,并写些程序。

  1. Package

Package感觉类似于c中的include语句,主要是让我们可以使用编译好的class文件(一个compile unit如果有多个类的话,会有多个class文件)。但是为什么用了import 之后java可以找到对应的class文件所在地了?需要在环境变量中设置CLASSPATH,它会告诉java去哪里找package,这也是为什么java是跨平台的,当程序换了环境,不需要修改代码! 因为程序都是使用的相对路径,而非绝对路径,根据目录的路径。

Example:

    在Eclipse的default package中新建了package :TestingPackage,并在其中新建类MyClass,代码如下:

    package TestingPackage;

 

public class MyClass {

    public int ii;

    public MyClass(int i){

        this.ii = i;

    }

    public void print(){

        System.out.println("This is package TestingPackage");

    }

    public static void main(){

    }

}

再在default Package中新建类TestPackage,代码如下:

import TestingPackage.*;

public class TestPackage {

    public static void main(String args[]){

        MyClass me = new MyClass(12);

        me.print();

    }

}

结果如下:

This is package TestingPackage

因为我在同一个目录下加的Package,所以并没有在classpath中设置路径也可以运行。以上便实现了如何调用不同Package下的类。

  1. Java access specifiers

Java中的public,private,protected是挺好的设计,把不必要的细节全部隐藏,只提供必要的接口。好比我去银行,不需要知道银行的内部细节,只要一个服务员能和我交流,帮我把我需要的事情干完。但是C中如果有全局变量或者函数,全部都展现给我,我有点不知从哪里看起。还是含蓄的比较好,只给我想看的,这样也减少了程序复杂度。

  • Testing case 1:

相同Package下能否访问public,protected,private变量。

Testing Code:

刚才的TestingPackage下新建CLASS SamePackage

package TestingPackage;

 

public class SamePackage {

    public static void main(String args[]){

        MyClass me = new MyClass(23);

        System.out.println(me.ss);

    }

}

MyClass下新建变量:

protected String ss = new String("i am protected");

分别改变protected限定词

Conclusion:相同Package下可以访问Public和Private变量。

  • Testing case2

不同Package下能否访问public,protected,private变量。

Testing code:

在default Package下新建ClassTestPackage:

import TestingPackage.MyClass;;

public class TestPackage {

    public static void main(String args[]){

        MyClass me = new MyClass(12);

        me.print();

        //can not use, not the same package

        //System.out.println(me.ss);

    }

}

Conclusion:不同Package下只能访问Public!

  1. Class access

一个compilation unit下只有一个Public class,并且这个类的名称和文件名必须相同。书中还有一个有趣的例子如下:

class Soup {

private Soup() {}

// (1) Allow creation via static method:

public static Soup makeSoup() {

return new Soup();

}

// (2) Create a static object and return a reference

// upon request.(The "Singleton" pattern):

private static Soup ps1 = new Soup();

public static Soup access() {

return ps1;

}

public void f() {}

}

 

class Sandwich { // Uses Lunch

void f() { new Lunch(); }

}

 

// Only one public class allowed per file:

public class Lunch {

void test() {

// Can't do this! Private constructor:

//! Soup priv1 = new Soup();

Soup priv2 = Soup.makeSoup();

Sandwich f1 = new Sandwich();

Soup.access().f();

}

} ///:~

    Soup的构造函数是private来修饰,谁都不能访问。相当于把一个class当一个函数来使用了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值