一、什么是内部类

  将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类

  内部类所在的类在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class。

  内部类主要分为四种:

    成员内部类、局部内部类、匿名内部类、静态内部类

二、成员内部类

  成员内部类,顾名思义它的身份是作为一个类的成员,我们来看它是怎么定义的

package com.jiangbei.test.innerclass;

/**
* 外部类
* 作者: Administrator
* 日期: 2017/9/24
**/
public class OutterClass {
private String name;
private Integer age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} // 内部类
public class InnerClass{
public InnerClass(){
name = "张三";
age = 18;
}
public void show(){
System.out.println("i am InnerClass");
}
public void display(){
System.out.println("name:"+getName()+" age:"+getAge());
}
}
// 推荐使用getInnerClass()获取内部类
public InnerClass getInnerClass(){
// 当然也可以在外部类创建内部类引用,当内部类为空时新建,不为空时返回,实现单例的效果
return new InnerClass();
} public static void main(String[] args) {
OutterClass outter = new OutterClass();
// InnerClass inner = new InnerClass(); 无法直接创建内部类
// OutterClass.InnerClass inner = outter.new InnerClass(); 不推荐
OutterClass.InnerClass inner = outter.getInnerClass();
inner.show();
inner.display();
}
}

  结果:

  

  由此我们可以知道:

    1.成员内部类依靠外部类,只有创建了外部类实例才能创建成员内部类

     2..成员内部类可以无限制访问外部类成员,即使它是private的

     3.外部类想访问成员内部类的方法和变量,必须通过内部类的实例

 三、局部内部类

  嵌套在方法和作用域的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。

  引用海子(http://www.cnblogs.com/dolphin0520/)的实例:

class People{
public People() { }
} class Man{
public Man(){ } public People getWoman(){
class Woman extends People{ //局部内部类
int age =0;
}
return new Woman();
}
}

  这里需要注意的是:

    1.局部内部类类似一个局部变量,无法拥有访问修饰符!

四、匿名内部类

  一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。

new 父类构造器(形参列表) | 实现接口(){

  // 重写方法或实现方法
}

  比较典型的就是swing中的事件绑定了:

button1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.out.println("你按了按钮二");
}
});

   注意点:

    1.匿名内部类必须是实现一个接口或者继承一个父类的方式

      2.匿名内部类没有构造函数

      3.匿名内部类不能存在静态变量静态方法

      4.匿名内部类不能是抽象的(继承抽象类、实现接口必须重写、实现所有方法)

      5.Java为了避免数据不同步的问题,做出了匿名内部类只可以访问final的局部变量的限制。

      关于这点通俗的解释,请参见:http://www.jianshu.com/p/609ca1c584ac

   更多匿名内部类的详解,参见:http://www.cnblogs.com/chenssy/p/3390871.html

五、静态内部类

  和成员变量类似,不过它是静态的,不再需要依靠外部类

  /**
*静态内部类
*/
static class InnerClass1{
/* 在静态内部类中可以存在静态成员 */
public static String _name1 = "chenssy_static"; public void display(){
/*
* 静态内部类只能访问外围类的静态成员变量和方法
* 不能访问外围类的非静态成员变量和方法
*/
System.out.println("OutClass name :" + name);
}
}

  更多有关内部类的讲解与深入,请参见http://www.cnblogs.com/dolphin0520/p/3811445.html

                    http://www.cnblogs.com/chenssy/p/3388487.html

Java基础——内部类的更多相关文章

  1. 第30节:Java基础-内部类

    内部类 // 外部类 class Demo{ private int num = 3; // 定义内部类 class Int{ void show(){ System.out.println(&quo ...

  2. Java 基础 内部类

    Java 基础 内部类 内部类(嵌套类) nested class 目的为外围类enclosing class提供服务. 四种: 静态成员类 static member class 非静态成员类 no ...

  3. JAVA基础——内部类详解

    JAVA内部类详解 在我的另一篇java三大特性的封装中讲到java内部类的简单概要,这里将详细深入了解java内部类的使用和应用. 我们知道内部类可分为以下几种: 成员内部类 静态内部类 方法内部类 ...

  4. Java基础-内部类-为什么局部和匿名内部类只能访问局部final变量

    先看下面这段代码: public class Test { public static void main(String[] args) { } public void test(final int ...

  5. Java基础-内部类-为什么成员内部类可以无条件访问外部类

    在此之前,我们已经讨论过了成员内部类可以无条件访问外部类的成员,那具体究竟是如何实现的呢?下面通过反编译字节码文件看看究竟.事实上,编译器在进行编译的时候,会将成员内部类单独编译成一个字节码文件,下面 ...

  6. Java基础-内部类

    在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类. 下面就先来了解一下这四种内部类 ...

  7. Java基础内部类、包的声名、访问修饰符、代码块整理

    内部类 14.1内部类概念 将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类.其他类也称为外部类. 内部类分为成员内部类与局部内部类. 我们定义内部类时,就 ...

  8. Java基础-内部类介绍

    java内部类介绍 内部类一共分为4种 成员内部类 静态内部类 方法内部类 匿名内部类 下面我会为大家详细介绍每一个内部类!! 成员内部类 成员内部类就好像是外部类的一个成员属性,也是内部类中最常见的 ...

  9. Java基础—内部类(转载)

    转载自:java中的匿名内部类总结 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部 ...

随机推荐

  1. fastcgi+lighttpd+c语言 实现搜索输入提示

    1.lighttpd 服务器 lighttpd是一个比较轻量的服务器,在运行fastcgi上效率较高.lighttpd只负责投递请求到fastcgi. centos输入yum install ligh ...

  2. vue.js--基础 事件结合双向数据绑定实现todolist 待办事项 已经完成 和进行中,键盘事件

    <template> <div id="app"> <h1>{{ msg }}</h1> <input type=" ...

  3. CF25E Test

    嘟嘟嘟 因为只有三个字符串,所以就有一个比较暴力的做法:枚举这三个串所有排列,然后对于每一个排列,减去这三个串两两的公共部分的长度,更新答案. 求公共部分自然想到kmp:比如s[1]接在s[0]后面, ...

  4. POJ 1984 Navigation Nightmare 【经典带权并查集】

    任意门:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K To ...

  5. POJ 1088 滑雪 【记忆化搜索经典】

    题目链接:http://poj.org/problem?id=1088 滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:  ...

  6. caffe实现focal loss层的一些理解和对实现一个layer层易犯错的地方的总结

    首先要在caffe.proto中的LayerParameter中增加一行optional FocalLossParameter focal_loss_param = 205;,然后再单独在caffe. ...

  7. 写一个简单的shellcode

    0x00 前言 漏洞利用中必不可缺的部分就是shellcode,不会编写shellcode和咸鱼有什么区别,跳出咸鱼第一步. 0x01 系统调用 通过系统调用execve函数返回shell C语言实现 ...

  8. 简单使用Idea创建三层架构项目和数据库连接(使用原生ajax进行访问+ajax)

    Idea创建三层架构项目 首先创建一个Web项目model 创建Web完成后进行创建entity.dao.service 特别注意 根据上面的步骤进行创建即可得到 创建完成 我们首先创建数据库 cre ...

  9. 在idea配置jetty和创建(包、文件)javaWeb以及Servlet简单实现

    在创建之前要安装好jetty jetty官网链接:https://jettylife.com/ 现在进行创建项目: 需要按照好jdk 现在进行添加jetty 现在进行配置 完成后ok ok 下面警告的 ...

  10. 使用dva框架的总结

    最近的项目是react+dva+atd+webpack的一个后台项目,刚接触dva就感觉很喜欢,很简洁用着很爽. 关于使用redux中的一些问题 1.文件切换问题. redux的项目通常哟啊分为red ...