整理java读书笔记十五之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)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java内部类
java读书笔记
万历十五年读书笔记、如何整理读书笔记、万历十五年的读书笔记、整理读书笔记、政治学十五讲读书笔记,以便于您获取更多的相关知识。

时间: 2024-11-17 00:52:13

整理java读书笔记十五之java中的内部类_java的相关文章

kvm虚拟化学习笔记(十五)之kvm虚拟机动态迁移

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1300783 相比KVM虚拟机静态迁移中需要拷贝虚拟机虚拟磁盘文件,kvm虚拟机动态迁移无需拷贝虚拟磁盘文件,但是需要迁移到的虚拟主机之间需要有相同的目录结构虚拟机磁盘文件,本文这部分内容通过nfs来实现,当然也可以采用GFS2集群文件系统来实现,本文的动态迁移是基于共享存储动态迁移. KVM动态迁移目前有两种,一种是基于

深入解析Java中的内部类_java

概述 最近学习python,发现python是支持多继承的,这让我想起Java是通过内部类实现的这套机制.这篇文章不是讲如何通过内部类实现多继承,而是总结一下内部类的类型和使用方法. Java内部类分为:     非静态内部类     静态内部类     局部内部类     匿名内部类 内部类在Android源码中被大量的使用,先介绍一下这四种内部类的共同点:     内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号.     内部类不

Java如何在List或Map遍历过程中删除元素_java

遍历删除List或Map中的元素有很多种方法,当运用不当的时候就会产生问题.下面通过这篇文章来再学习学习吧. 一.List遍历过程中删除元素 使用索引下标遍历的方式 示例:删除列表中的2 public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(2); list.add(3); list.add(

Java设计模式(十五)----观察者模式

观察者模式 一.定义 二.结构 具体案例 推模型和拉模型 三.Java提供的对观察者模式的支持 Observer接口 Observable类 一.定义 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使

Java初级笔记-第五章

第五章 面向对象的特点 5.1 继承 面向对象的重要特点之一就是继承.类的继承使得能够在已有的类的基础上构造新的类,新类除了具有被继承类的属性和方法外,还可以根据需要添加新的属性和方法.继承有利于代码的复用,通过继承可以更有效地组织程序结构,并充分利用已有的类来完成复杂的任务,减少了代码冗余和出错的几率.   继承通过extends 来表示. class A extends B 表示类A继承了类B,B是父类,A叫子类.A类有B类的相应功能,并且还可以自己定义新的功能(方法及属性)   对于父类与

hibernate3学习笔记(十五)|继承映射

这里详细讨论继承映射的3种方式: 1.Table per concrete class 继承关系如下图: 数据表设计如下图: MySQL数据库中执行如下DDL: 1.CREATE TABLE defaultuser (2. id INT(11) NOT NULL auto_increment PRIMARY KEY,3. name VARCHAR(100) NOT NULL default '',4. someProperty VARCHAR(100)5.);6.7.CREATE TABLE p

云计算读书笔记(五)

Hadoop:Google云计算的开源实现 Hadoop是Apache开源组织的一个分布式计算机框架,可以在大量廉价的硬件设备组成的集群上运行应用程序,为应用程序提供一组稳定可靠的接口,旨在构建一个具有高可靠性和良好扩展性的分布式系统. Hadoop的核心是HDFS,MapReduce和HBase,它们分别对应Google的云计算GFS,MapReduce和Bigtable. Hadoop主要由以下几个子项目组成: 1)Hadoop Common:原来的Hadoop Core,这是整个Hadoo

Java Socket编程(五) 简单的WEB服务器_Java编程

文章来源:aspcn 作者:孙雯 简单的WEB服务器 一个简单的WEB服务器将由列表9.2这样构建.当然,还必须要对方法和回应事件进行改进.简单的服务器不会分析和存储请求头.新的WEB服务器将分析和存储请求,为以后的处理作准备.为了达到这个目的,你必须有一个包含HTTP请求的类. HTTPrequest类 列表9.5列出了一个完整的HTTPrequest类.这个类必须包括一个请求头所需的所有信息. 列表9.5.HTTPrequest类. import java.io.*; import java

设计模式学习笔记(十五)—State模式

一.State模式定义: 允许一个对象在其状态改变时,改变它的行为.看起来对象似乎修改了它的类. 二.模式解说 State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责任交给了具体的状态