丁保国的博客

收集整理工作生活,点点滴滴

  :: :: 博问 :: 闪存 :: :: :: :: 管理 ::

第六讲 类的封装

主要内容

软件包的创建和使用

Java访问权限修饰词

类的访问权限修饰词

 

软件包的创建和使用

什么是软件包(package)

包的组成由一组类(class)和接口(interface)组成。

Java允许把多个类收集在一起成为一组,称作包(package)。


包的作用包是Java提供的一种类库的封装机制。专有的名字空间,解决了不同包中的类同名的问题。使自己的任务和其他人提供的代码库相分离。

 

软件包的建立

从示例程序理解

编译如下程序,查看所编译文件的位置。

package mylib.simple;

public class List{

  public List(){

     System.out.println("mylib.simple.List");

  }

}

结论

1、包对应着文件系统的目录层次结构。

2、编译生成的字节码文件将置放到包中,即包名所指定的目录中。

 

软件包的创建

package packagename;

几个要点:

l        package语句必须是文件中的第一条语句。

l        “.”作为分隔符来指明包(目录)的层次。

l        包名由小写字母组成。

l        没有注明放入到某个包中去的类,自动地归在一个无名包中

 

软件包的使用

l        设置环境变量classpath

l        Jcreator中添加classpath

l        使用如下两种方法之一:

²       import加载包中的类:import 包名; import 包名.类名;

²       直接用包名.类名去访问类

 

说明

²       import语句必须放在package语句和类的定义之间。

²       某个类若用到其他类,会优先在所在软件包中查找,继而在classpath指定的路径下查找。

 

例:创建一个newjw目录,在此新目录下创建如下java文件。

import mylib.simple.List;

class TestList{

  public static void main(String[] aa){

     new List();

  }

}

试用方法二改写并编译执行之。

思考

1.      一个程序的首语句是package a.b.c.d;其意是?

2.      一个程序中可含多个类,它们可分放到不同的软件包吗?

3.      若要使用d:\java07下的软件包,classpath如何设置?

4.      如何用到不同目录下的软件包myclass.lib1中的类?

5.      同一个软件包中的类可否直接使用?

6.      一个类设计成可被到处使用,应声明为public类吗?

7.      一个类用到其他类时,编译时的类查找路径是?

 

软件包的操作练习

练习:建立工具包,并使用之。

1.    设计一个P类置入mylib.tools包中,该P类含rintrintln方法,可实现字符串的输出。

2.    mylib.tools中的类P,分别输出字符串和数字。

import                         ;

class TestP{

  public static void main(String[] aa){

 

 

  }

}

3.  创建一个Input类,含有来输入整数或字符串的方法,以使下面的程序能正确编译和执行。

import mylib.tools.Input;

import mylib.tools.P;

class TestInput{

  public static void main(String[] aa){

     int y=Input.aInt();

     P.rintln(y+"");

     String s=Input.aString();

     P.rintln(s);

  }

}

 

Java访问权限修饰符

决定类成员的访问权限的修饰符有:public protected private

权限的设定对于类的封装有着重要的意义。公开需要公开的,隐藏必须隐藏的。这样就让类的继承变得简单。

 

无权限修饰符的成员

允许本类、同一软件包中的类访问即享受“包访问权限”。

 

public成员

public描述的是一个类中可向外公开的信息(属性和方法)。

允许本类、继承类、同一软件包中的类、不同软件包中的类访问。

示例:不同软件包之间一个类访问另一个类的public成员。

package mylib.lib1;    //Base.java

public class Base{

  public int x=5;

  public void print(){

     System.out.println("base"+x);//本类访问

  }

}

 

package mylib.lib2;    //Derive.java

class Derive {

  public static void main(String args[]){

     mylib.lib1.Base b = new mylib.lib1.Base();

     b.x=5;  //不同软件包的类访问

     b.print();

  }

}

思考

1.      程序编译后,磁盘上新增的目录结构?

2.      Base类中,可以公开的信息是?

3.      public的公开范围?

4.      如果Base类中的成员变量x前无public,会在何环节产生问题?

 

 

private成员

private修饰的成员变量和成员方法都只能在本类中访问

修饰不希望被其它类访问的变量和方法。有两种限制:

²       其它类中的该类对象不能访问private成员。

²       派生子类时,子类不能继承父类的private成员

class Base1{

  private int x=1;

  private void print(){

     System.out.println("base"+x);

  }

  void doprint(){

     print();

  }

}

class Derive1{

  public static void main(String args[]){

     Base1 b = new Base1();

     b.doprint();  //直接调用b.print();试试!

  }

}

观察JCreator中的数据视图(ctrl+alt+c),加深对private成员的认识。

 

假如构造方法是private的,类就不可直接实例化成对象:

class Sundae{

  private Sundae(){

     System.out.println("Here is a sundae");

  }

  static Sundae getASundae(){

     return new Sundae();

  }

}

class TestSundae{

  public static void main(String[] aa){

     Sundae s=Sundae.getASundae();

  }

}

protected成员

这是受保护成员。其修饰的数据和方法对继承它的子类公开。

protected成员允许本类、继承类和同一软件包中的类访问

包权限访问

class Base1{

  protected int x=1;

  protected void print(){

     System.out.println("base"+x);

  }

}

class Derive1{

  public static void main(String args[]){

     Base1 b = new Base1();

     b.print();

  }

}

继承类对protected成员的访问

package mylib.simple;//Cookie.java

public class Cookie{

  public Cookie(){

     System.out.println("Cookie constructor");

  }

  protected void bite(){System.out.println("bite");}

}

 

import mylib.simple.Cookie; //Chocolatechip.java

class Chocolatechip extends Cookie{

  Chocolatechip(){

     System.out.println("Chocolatechip");

  }

  public static void main(String[] aa){

     Chocolatechip c=new Chocolatechip();

     c.bite();    

  }

}

思考

1.      何谓类的封装?

2.      从封装角度比较以上不同的权限修饰?

3.      一个public成员向谁公开信息?

4.      一个protected成员向谁公开信息?

5.      一个private成员向其它类公开信息吗?

6.      private有何意义?

 

练习:试填表说明不同访问修饰符的访问权限

访问修饰符

本类

同软件包

不同包中子类

不同包且无继承

public

 

 

 

 

protected

 

 

 

 

无修饰词

 

 

 

 

private

 

 

 

 

 

类的访问权限

无访问修饰符

即为缺省类。可以被同一个软件包中的类访问。

 

public

通过import导入(配合classpath的设置),可以被任何其它的类访问。

public class 类名

思考

假如某一程序中定义了一个public类,框架如下:

package mylib.abc;

public class Abc{…}

 

1.      该程序应命名为?

2.      在另一个程序中如何能访问到Abc类?

3.      如果该类有显式的构造方法,并允许在其它类中创建该类的对象,构造方法的权限设置应是?

 

private

专用于修饰内部类,内部类常用于处理本类中的事件。

 

 

练习

1.分别构造一个Circle类和Square类,可接受半径(边长),包含求面积的方法。将它们放在myclass.simple包中。

2.利用上述类,求半径为4.5的圆面积,边长为4.56.5的矩形面积。

 

 

posted on 2007-07-21 10:33  丁保国  阅读(335)  评论(2编辑  收藏  举报