当前位置:  技术问答>java相关

初学者问题一?

    来源: 互联网  发布时间:2015-07-14

    本文导语:  我在书上看到 “类属类” 的问题,就是说在一个类中定义另外一个类。 我看了之后,有些不大明白。那位高手知道其前因后果及优缺点请道来,小弟不胜感激。 欢迎大家一起来讨论! | 如...

我在书上看到 “类属类” 的问题,就是说在一个类中定义另外一个类。
我看了之后,有些不大明白。那位高手知道其前因后果及优缺点请道来,小弟不胜感激。
欢迎大家一起来讨论!

|
如楼上所言,什么烂书阿?居然翻译成“类属类”,晕,不就是“内部类”吗?给你点资料:摘自《Thinking in java》
7.6 内部类
在Java 1.1中,可将一个类定义置入另一个类定义中。这就叫作“内部类”。内部类对我们非常有用,因为利用它可对那些逻辑上相互联系的类进行分组,并可控制一个类在另一个类里的“可见性”。然而,我们必须认识到内部类与以前讲述的“合成”方法存在着根本的区别。
通常,对内部类的需要并不是特别明显的,至少不会立即感觉到自己需要使用内部类。在本章的末尾,介绍完内部类的所有语法之后,大家会发现一个特别的例子。通过它应该可以清晰地认识到内部类的好处。
创建内部类的过程是平淡无奇的:将类定义置入一个用于封装它的类内部(若执行这个程序遇到麻烦,请参见第3章的3.1.2小节“赋值”):

//: Parcel1.java
// Creating inner classes
package c07.parcel1;

public class Parcel1 {
  class Contents {
    private int i = 11;
    public int value() { return i; }
  }
  class Destination {
    private String label;
    Destination(String whereTo) {
      label = whereTo;
    }
    String readLabel() { return label; }
  }
  // Using inner classes looks just like
  // using any other class, within Parcel1:
  public void ship(String dest) {
    Contents c = new Contents();
    Destination d = new Destination(dest);
  }  
  public static void main(String[] args) {
    Parcel1 p = new Parcel1();
    p.ship("Tanzania");
  }
} ///:~

若在ship()内部使用,内部类的使用看起来和其他任何类都没什么分别。在这里,唯一明显的区别就是它的名字嵌套在Parcel1里面。但大家不久就会知道,这其实并非唯一的区别。
更典型的一种情况是,一个外部类拥有一个特殊的方法,它会返回指向一个内部类的句柄。就象下面这样:

//: Parcel2.java
// Returning a handle to an inner class
package c07.parcel2;

public class Parcel2 {
  class Contents {
    private int i = 11;
    public int value() { return i; }
  }
  class Destination {
    private String label;
    Destination(String whereTo) {
      label = whereTo;
    }
    String readLabel() { return label; }
  }
  public Destination to(String s) {
    return new Destination(s);
  }
  public Contents cont() { 
    return new Contents(); 
  }
  public void ship(String dest) {
    Contents c = cont();
    Destination d = to(dest);
  }  
  public static void main(String[] args) {
    Parcel2 p = new Parcel2();
    p.ship("Tanzania");
    Parcel2 q = new Parcel2();
    // Defining handles to inner classes:
    Parcel2.Contents c = q.cont();
    Parcel2.Destination d = q.to("Borneo");
  }
} ///:~

若想在除外部类非static方法内部之外的任何地方生成内部类的一个对象,必须将那个对象的类型设为“外部类名.内部类名”,就象main()中展示的那样。

7.6.1 内部类和上溯造型
迄今为止,内部类看起来仍然没什么特别的地方。毕竟,用它实现隐藏显得有些大题小做。Java已经有一个非常优秀的隐藏机制——只允许类成为“友好的”(只在一个包内可见),而不是把它创建成一个内部类。
然而,当我们准备上溯造型到一个基础类(特别是到一个接口)的时候,内部类就开始发挥其关键作用(从用于实现的对象生成一个接口句柄具有与上溯造型至一个基础类相同的效果)。这是由于内部类随后可完全进入不可见或不可用状态——对任何人都将如此。所以我们可以非常方便地隐藏实施细节。我们得到的全部回报就是一个基础类或者接口的句柄,而且甚至有可能不知道准确的类型。就象下面这样:

//: Parcel3.java
// Returning a handle to an inner class
package c07.parcel3;

abstract class Contents {
  abstract public int value();
}

interface Destination {
  String readLabel();
}

public class Parcel3 {
  private class PContents extends Contents {
    private int i = 11;
    public int value() { return i; }
  }
  protected class PDestination
      implements Destination {
    private String label;
    private PDestination(String whereTo) {
      label = whereTo;
    }
    public String readLabel() { return label; }
  }
  public Destination dest(String s) {
    return new PDestination(s);
  }
  public Contents cont() { 
    return new PContents(); 
  }
}

class Test {
  public static void main(String[] args) {
    Parcel3 p = new Parcel3();
    Contents c = p.cont();
    Destination d = p.dest("Tanzania");
    // Illegal -- can't access private class:
    //! Parcel3.PContents c = p.new PContents();
  }
} ///:~

现在,Contents和Destination代表可由客户程序员使用的接口(记住接口会将自己的所有成员都变成public属性)。为方便起见,它们置于单独一个文件里,但原始的Contents和Destination在它们自己的文件中是相互public的。
在Parcel3中,一些新东西已经加入:内部类PContents被设为private,所以除了Parcel3之外,其他任何东西都不能访问它。PDestination被设为protected,所以除了Parcel3,Parcel3包内的类(因为protected也为包赋予了访问权;也就是说,protected也是“友好的”),以及Parcel3的继承者之外,其他任何东西都不能访问PDestination。这意味着客户程序员对这些成员的认识与访问将会受到限制。事实上,我们甚至不能下溯造型到一个private内部类(或者一个protected内部类,除非自己本身便是一个继承者),因为我们不能访问名字,就象在classTest里看到的那样。所以,利用private内部类,类设计人员可完全禁止其他人依赖类型编码,并可将具体的实施细节完全隐藏起来。除此以外,从客户程序员的角度来看,一个接口的范围没有意义的,因为他们不能访问不属于公共接口类的任何额外方法。这样一来,Java编译器也有机会生成效率更高的代码。
普通(非内部)类不可设为private或protected——只允许public或者“友好的”。
注意Contents不必成为一个抽象类。在这儿也可以使用一个普通类,但这种设计最典型的起点依然是一个“接口”。

|
翻译的太烂了,有英文告诉大家英文,没有的话快把那本书扔了。

|
嵌套类,类中定义类,你把他想象成定义一个方法好了,没什么大的区别

|
啊。类属类是什么啊。
应该是内部类或者嵌套类吧。
看看《JAVA编程思想》,有这方面的详细讲解。

    
 
 

您可能感兴趣的文章:

  • 又一个初学者的困惑!如果您是个大虾,请你一定要进来看看,指点迷津!如果您也是个初学者,那么您也一定要进来,也许我们有一样的遭遇!
  • 初学者的问题我是linux初学者,我想问一下在windows里下载的大于1.44M文件如何转移到linux分区里?
  • 我是个初学者,希望指点明津
  • 初学者用什么工具好?JBUILDER?JDK?
  • 对于初学者应该看什么样的java书籍
  • 我是初学者,该用什么java的“编译器”????
  • 对于初学者应该看什么样的书
  • 初学者:不是问题的问题?
  • 初学者这样检验自己的学习效果呢?
  • 初学者的问题??在线等待。
  • linux初学者应该看什么书
  • 初学者的疑问
  • Free Java的初始设置问题----初学者求教.
  • 各位大虾,一个初学者该怎样开始学习java?
  • 熟悉weblogic&ejb2.0的请进(初学者就不用看了)
  • 怎样学习Java,我是个初学者。
  • 我是一个java初学者
  • 初学者的问题!
  • 小弟是初学者,请推荐几本不错的unix书籍。
  • 请指点:初学者应怎样学习?
  • 编译参数问题,初学者的问题,请多帮忙
  • 概念问题----初学者的问题
  • 初学者的问题,关于LINUX的安装的问题,谢谢高手执教!!!
  • 初学者的一个好菜的问题:有关菜单项的问题
  • 初学者问题(2):关于super的使用问题,请大家多多帮忙。
  • 初学者的问题-关于编译问题!
  • Qt初学者请教大家几个问题!
  • 关于REDHAT 9.0的问题.初学者,请大家不要见笑.
  • linux初学者的一些问题
  • 初学者的两个问题,谢了先
  • 初学者的关于ls的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 给初学者!
  • 我是java的初学者,谁能告诉我什么书最好,谢谢
  • 请问有哪些书适合我们初学者?
  • JAVA初学者的困惑
  • 请教学习java的经验(对于初学者)?
  • 初学者:怎样在linux下用C编程啊?
  • 小弟是初学者,请推荐几本不错的java书籍。
  • 求适合初学者读的书
  • linux初学者的贴
  • 请问对于初学者应该使用哪种版本的linux比较好?
  • shell初学者
  • 我想用Linux学程序,不知道哪个发行版比较适合初学者?
  • 请问什么是“设计模式”,有这方面的教材吗?望各位大侠指点指点初学者。谢谢!
  • zt:向KDE/QT编程初学者推荐一个网站 from : 中国Linux公社 by :liskman
  • JBuilder初学者,帮我推荐几本比较好的书,好吗?(最好能具体点儿,谢谢 ~~~)
  • 初学者
  • 请给Java初学者一点点建议!
  • 初学者请教几个最常用的命令,多谢!
  • 初学者问题,Unix Shell
  • linux初学者,咨询一下学习过程


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3