整理java读书笔记十五之java中的内部类

内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹相同。
*内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default)。

前言

Java从JDK1.1的时候,就开始引入内部类的概念了,那么小编也通过这篇博客来分享一下Java中有关内部类的一些特性。

 什么是内部类?

在很多情况下,类被定义成一个独立的程序单元,但是有时候也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就称为内部类。

从语法上来看的话,定义内部类和定义外部类的语法大致相同,内部类除了需要定义在其他类里面之外,还存在如下两点区别。

1.内部类比外部类多使用三个修饰符:private——protected、static——外部类不可以使用这三个修饰符。

2.非静态内部类不能拥有静态成员。

除了以上两点之外,其他的地方都与普通的类相同,下面来列举一下常见的内部类操作。

非静态内部类

定义内部类也非常简单,只要把一个类放在另一个类内部定义即可,甚至都可以放置在方法的内部。

<span style="font-family:Comic Sans MS;font-size:18px;">package com.test;
public class Cow
{
  private double weight;
  // 外部类的两个重载的构造器
  public Cow(){}
  public Cow(double weight)
  {
    this.weight = weight;
  }
  // 定义一个非静态内部类
  private class CowLeg
  {
    // 非静态内部类的两个实例变量
    private double length;
    private String color;
    // 非静态内部类的两个重载的构造器
    public CowLeg(){}
    public CowLeg(double length , String color)
    {
      this.length = length;
      this.color = color;
    }
    // 下面省略length、color的setter和getter方法
    public void setLength(double length)
    {
      this.length = length;
    }
    public double getLength()
    {
      return this.length;
    }
    public void setColor(String color)
    {
      this.color = color;
    }
    public String getColor()
    {
      return this.color;
    }
    // 非静态内部类的实例方法
    public void info()
    {
      System.out.println("当前牛腿颜色是:"
        + color + ", 高:" + length);
      // 直接访问外部类的private修饰的成员变量
      System.out.println("本牛腿所在奶牛重:" + weight);  //①
    }
  }
  public void test()
  {
    CowLeg cl = new CowLeg(1.12 , "黑白相间");
    cl.info();
  }
  public static void main(String[] args)
  {
    Cow cow = new Cow(378.9);
    cow.test();
  }
}
</span> 

在上述中非静态内部类的成员可以访问外部类的private成员,但反过来就不成立了。非静态内部类的成员只在非静态内部类范围内是可知的,并不能被外部类直接使用。如果外部类需要访问非静态内部类的成员,则必须显式创建非静态内部类对象来调用访问其实例成员。

<span style="font-family:Comic Sans MS;font-size:18px;">package com.test;
public class Outer
{
  private int outProp = 9;
  class Inner
  {
    private int inProp = 5;
    public void acessOuterProp()
    {
      // 非静态内部类可以直接访问外部类的private成员变量
      System.out.println("外部类的outProp值:"
        + outProp);
    }
  }
  public void accessInnerProp()
  {
    // 外部类不能直接访问非静态内部类的实例变量,
    // 下面代码出现编译错误
    // System.out.println("内部类的inProp值:" + inProp);
    // 如需访问内部类的实例变量,必须显式创建内部类对象
    System.out.println("内部类的inProp值:"
      + new Inner().inProp);
  }
  public static void main(String[] args)
  {
    // 执行下面代码,只创建了外部类对象,还未创建内部类对象
    Outer out = new Outer();   //①
    out.accessInnerProp();
  }
}
</span> 

注意:非静态内部类中不能有静态方法、静态成员变量、静态初始化块。

静态内部类

如果使用static来修饰一个内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象,因此使用static修饰的内部类被称为类内部类,有的地方也称为静态内部类。静态内部类可以包含静态成员,也可以包含非静态成员。根据静态成员不能访问非静态成员的规则,静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。

<span style="font-family:Comic Sans MS;font-size:18px;">package com.test;
public class StaticInnerClassTest
{
  private int prop1 = 5;
  private static int prop2 = 9;
  static class StaticInnerClass
  {
    // 静态内部类里可以包含静态成员
    private static int age;
    public void accessOuterProp()
    {
      // 下面代码出现错误:
      // 静态内部类无法访问外部类的实例变量
      System.out.println(prop1);
      // 下面代码正常
      System.out.println(prop2);
    }
  }
}
</span> 

匿名内部类

使用匿名内部类可以创建那种只需要一次使用的类,并且创建匿名内部类时会立即创建一个该类的实例,但是也需要注意一下规则

1.匿名内部类不能是抽象类,因为系统在创建匿名内部类时,会立即创建匿名内部类的对象,因此不允许将匿名内部类定义成为抽象类

2.匿名内部类不能定义构造器,由于匿名内部类没有类名,所以无法定义构造器

<span style="font-family:Comic Sans MS;font-size:18px;">package com.test;
interface Product
{
  public double getPrice();
  public String getName();
}
public class AnonymousTest
{
  public void test(Product p)
  {
    System.out.println("购买了一个" + p.getName()
      + ",花掉了" + p.getPrice());
  }
  public static void main(String[] args)
  {
    AnonymousTest ta = new AnonymousTest();
    // 调用test()方法时,需要传入一个Product参数,
    // 此处传入其匿名实现类的实例
    ta.test(new Product()
    {
      public double getPrice()
      {
        return 567.8;
      }
      public String getName()
      {
        return "AGP显卡";
      }
    });
  }
}
</span>

下面给大家总结以下内部类的共性编辑

(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。

(0)

相关推荐

  • Java自学书籍Top 10

    下面是Java Inside上推荐的十本不错的Java书籍. 1)Java Language Specification, Third Edition (by James Gosling) 本书由Java技术的发明者编写,是Java TM编程语言的权威性技术指南.如果你想知道语言之构造的精确含义,本书是最好的资源. 2)Effective Java , Second Edition (by Joshua Bloch) 本书介绍了在Java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多

  • Java自学书籍推荐 程序员到架构师必看的书

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水平的Java程序员们. 一.Java编程入门类 对于没有Java编程经验的程序员要入门,随便读什么入门书籍都一样,这个阶段需要你快速的掌握Java基础语法和基本用法,宗旨就是"囫囵吞枣不求甚解",先对Java熟悉起来再说.用很短的时间快速过一遍Java语法,连懵带猜多写写代码,要"

  • 一个合格的程序员应该读过哪些书(偏java)

    很多程序员响应,他们在推荐时也写下自己的评语. 以前就有国内网友介绍这个程序员书单,不过都是推荐数 Top 10的书. 其实除了前10本之外,推荐数前30左右的书籍都算经典,笔者整理编译这个问答贴,同时摘译部分推荐人的评语. 下面就按照各本书的推荐数排列. 1.<代码大全> 史蒂夫·迈克康奈尔 推荐数:1684 "优秀的编程实践的百科全书,<代码大全>注重个人技术,其中所有东西加起来, 就是我们本能所说的"编写整洁的代码".这本书有50页在谈论代码布局

  • 值得Java程序猿阅读的书籍

    学习的最好途径就是看书 "学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超其他资料 2.对着书上的代码自己敲的时候方便 "看完书之后再次提升自我的最好途径是看一些相关的好博文",我个人认为这是学习的第二步,因为一本书往往有好几百页,好的博文是自己看书学习之后的一些总结和提炼,对于梳理学习的内容很有好处,当然这里不是说自

  • 推荐几本学习java的书籍

    ■<java in a Nutshell:A Desktop Quick Reference,第2版> 作者:David Flanagan 出版社:O'Reilly & Assoc 出版时间:1997 简介:对Java 1.1联机文档的一个简要总结.就个人来说,我更喜欢在线阅览文档,特别是在它们变化得如此快的时候.然而,许多人仍然喜欢印刷出来的文档,这样可以省一些上网费.而且这本书也提供了比联机文档更多的讨论. ■<The Java Class Libraries:An Anno

  • Java Web开发入门书籍实例解析(总结一)

    从事Java Web开发这一段时间来,对Java 面向对象的思想和MVC开发模式可以说已经熟悉了.我当前参与的项目使用的框架是Spring.SpringMVC.Hibernate.下面我们小编给大家整理一篇教程帮助大家学习javaweb相关知识,感兴趣的朋友可以参考下. 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 1.静态web资源(如html 页面):指w

  • 又一波Java专业人士必备书籍来袭

    Java 专业人士必备的书籍大放送: 每个程序员都会有一些由于经常被当作专业资料参阅而磨坏的书.下列书籍应该是 Java 语言程序员的书架上必备的.书很贵,所以我有意将这份列表弄得很短,仅限于重要书籍. Thinking in Java (Bruce Eckel) Thinking in Java, 3rd edition (Bruce Eckel; Prentice Hall PTR,2002 年) Java 编程思想:第3版 (陈昊鹏 等译; 机械工业出版社,2005 年) Eckel 的书

  • 整理java读书笔记十五之java中的内部类

    内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文件名相同的只能使用public和default). 前言 Java从JDK1.1的时候,就开始引入内部类的概念了,那么小编也通过这篇博客来分享一下Java中有关内部类的一些特性.  什么是内部类? 在很多情况下,类被定义成一个独立的程序单元,但是有时候也会把一个类放在另一个类的内部定义,这个定义在

  • MYSQL必知必会读书笔记第五章之排序检索数据

    MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. 其实,检索出的数据并不是以纯随机顺序显示的.如果不排序,数据一般将以它底层表现中出现的顺序显示.这可以是数据最初添加到表中的顺序.但是,如果数据后来进行过更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响.因此,如果不明确控制的话,不能依赖该排序顺序. 在多个列上将序排列 :如果想在多个列上进行将序排列,必须每个列指定DESC关键字

  • javascript学习笔记(十五) js间歇调用和超时调用

    1.超时调用setTimeout() setTimeout() 方法接受两个参数,第一个参数是函数,第二个参数是时间(单位微秒),返回数值ID 复制代码 代码如下: setTimeout( function () { alert("你好!"); },1000); 调用前取消clearTimeout(),接受一个参数超时调用ID 复制代码 代码如下: var timeOutId = setTimeout( function () { alert("你好!"); },1

  • JavaScript高级程序设计 阅读笔记(十五) 浏览器中的JavaScript

    Window对象 窗口操作 Window对象对操作浏览器窗口非常有用,开发者可以移动或调整浏览器窗口的大小.可用四种方法实现这些操作: moveBy(dx,dy):把浏览器窗口相对当前位置水平移动dx个像素,垂直移动dy个像素.dx值为负左移,dy为负上移. moveTo(x,y):移动浏览器窗口,使它的左上角位于用户屏幕的(x,y)处.可以使用负数,不过这样会把部分窗口移出屏幕的可视区域. resizeBy(dw,dh):相对浏览器窗口当前大小,把窗口的宽度调整dw个像素,高度调整dy个像素.

  • JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)

    2.9 运算符 2.9.1.一元运算符 一元运算符只有一个参数,即要操作的对象或值. 1.delete:删除对以前定义的对象属性或方法的引用,但此运算符不能删除开发者未定义的属性和方法.示例: 复制代码 代码如下: var o=new Object; o.name="Nicholas"; o.show=function(){ return "test"; }; console.log(o.name); //outpus Nicholas console.log(o.

  • javascript学习笔记(十八) 获得页面中的元素代码

    1.获取元素 getElementById()方法,通过元素的id获取元素,接受一个参数即要获取元素的id,如果不存在这个id返回 null 注意不要让表单元素的name和别的元素的id相同,IE8以下的IE浏览器用这个方法通过元素的name属性可以获得该元素 以下面元素为例 <div id ="myDiv">这里是id为"myDiv"的div内容</div>var document.getElementById("myDiv&qu

  • 十大常见Java String问题_动力节点Java学院整理

    本文介绍Java中关于String最常见的10个问题: 1. 字符串比较,使用 "==" 还是 equals() ? 简单来说, "==" 判断两个引用的是不是同一个内存地址(同一个物理对象). 而 equals 判断两个字符串的值是否相等. 除非你想判断两个string引用是否同一个对象,否则应该总是使用 equals()方法. 如果你了解 字符串的驻留 ( String Interning ) 则会更好地理解这个问题 2. 对于敏感信息,为何使用char[]要比

  • Java List简介_动力节点Java学院整理

    Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解.  List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引  ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步  LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快)  Vector:底层是数组数据结构 线

  • Java学习笔记之面向对象编程精解

    目录 包 继承 super 关键字 final protected关键字 组合 多态 抽象类 接口 面向对象编程(包.继承.组合.多态 .抽象类.接口) 包 包其实就是类的集合,其本质上其实就是一个文件夹,里面存放的. java 文件里面有我们写的代码,并且包的存在还可以有效解决在实际开发过程中程序员. java文件命名重叠问题,其实就是,一个包里面是能有两个名字相同的.java文件,但是如果是不同的包下就允许这样的情况存在. 我们创建一个包只需要在 src 目录底下去创建就行了,公司里面给报的

  • [JAVA]十四种Java开发工具点评

    在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具,Java菜鸟们如初入大观园的刘姥姥,看花了眼,不知该何种选择.的确,这些工具各有所长,都没有绝对完美的,就算是老鸟也很难做出选择.在本文中我简要介绍了常见的十四种Java开发工具的特点,管中窥"器",希望能对大家有所帮助. 1.JDK (Java Development Kit) 2.Java Workshop 3.NetBeans 与Sun Java Studio 5 4.Borlan

随机推荐