内部类

定义:

一个类的内部又完整的嵌套了另一个类结构,被嵌套的类就被我们称为内部类,嵌套内部类的类被我们称为外部类

//外部类
class Outer
{
//内部类
class Inner
{ }
}
package Innerclass;

//外部其他类
public class c1 {
} class Outer
{
//属性
private int n1 = 100;
//方法
public void m1()
{
System.out.println("m1()");
}
//内部类
class Inner
{ }
}

内部类的分类

1、定义在外部类局部位置上(比如方法内)
(1)局部内部类(有类名)

(2)匿名内部类(没有类名)

2、定义在外部类的成员位置上
(1)成员内部类(没用static修饰)
(2)静态内部类(使用static修饰)

1、局部内部类

1、局部内部类是定义在外部类的方法中的

2、并且局部内部类可以访问外部类的所有成员包括私有的,访问的方法是直接访问,外部类在方法中可以创建内部类的对象,然后通过内部类的对象去调用其方法

3、不能添加访问修饰符,和局部变量一样,可以用final来修饰

4、作用域只在局部类的方法体内

5、外部其他类不能访问局部内部类(因为局部内部类的地位是一个局部变量)

package Innerclass;

public class LocalInnerClass {
public static void main(String []args)
{
Outer02 outer02 = new Outer02();
outer02.m1();
}
}
//外部类
class Outer02
{
//属性
private int n1 = 100;
//私有方法
private void m2()
{
System.out.println("m2");
}
//方法
public void m1()
{
//局部内部类通常定义在外部类的方法中
//局部内部类
class Inner02
{
//局部内部类可以访问外部类的所有成员,包含私有的
public void f1()
{
m2();
System.out.println("n1 = " + n1);
}
}
Inner02 inner02 = new Inner02();
inner02.f1();
}
}

6、如果外部类和内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员可以使用(外部类名.this.成员)

Out02.this.n2

匿名内部类

1、本质是类

2、内部类, 但实际是有名字的,只不过用完之后会立即被销毁

3、该类是没有名字

4、同时还是一个对象

匿名内部类创建之后,会立马实例化出来,然后这个匿名类内部类就不能再被使用了,但实例化出来的对象是可以反复调用的

基于接口的匿名内部类使用

package Innerclass;

public class AnonymousInnerClass {
public static void main(String []args)
{
Outer04 outer04 = new Outer04();
outer04.method();
}
}
class Outer04
{
private int n1 = 10;
public void method()
{
//基于接口的匿名内部类
//tiger的编译类型?IA
//tiger的运行类型?就是匿名内部类
/*
底层是
class XXXX implements IA
{
public void cry()
{
System.out.println("老虎叫唤...");
}
}
*/
IA tiger = new IA()
{
public void cry()
{
System.out.println("老虎叫唤...");
}
};
System.out.println("tiger的运行类型 = " + tiger.getClass());
tiger.cry();
}
} interface IA{
public void cry();
}

基于类的匿名内部类

package Innerclass;

public class AnonymousInnerClass {
public static void main(String []args)
{
Outer04 outer04 = new Outer04();
outer04.method();
}
}
class Outer04
{
private int n1 = 10;
public void method()
{
//基于接口的匿名内部类
//tiger的编译类型?IA
//tiger的运行类型?就是匿名内部类
/*
底层是
class XXXX implements IA
{
public void cry()
{
System.out.println("老虎叫唤...");
}
}
*/
IA tiger = new IA()
{
public void cry()
{
System.out.println("老虎叫唤...");
}
};
System.out.println("tiger的运行类型 = " + tiger.getClass());
tiger.cry(); //正常new一个对象
Father father1 = new Father();
System.out.println("father1对象的运行类型是=" + father1.getClass()); //匿名内部类
Father father = new Father()
{
@Override
public void test() {
System.out.println("匿名内部类重写了test方法");
}
};
System.out.println("father对象的运行类型=" + father.getClass());
father.test();
Animal animal = new Animal()
{
@Override
public void say() {
System.out.println("小狗吃骨头");
}
};
animal.say();
}
} interface IA{
public void cry();
} class Father
{
public void test() {}
} abstract class Animal
{
public void say()
{}
}

匿名内部类的使用细节

匿名内部类的定义比较特殊,本身是一个类同时还是一个对象

先定义一个匿名内部类,接收之后,再用生成的对象

不接收直接调用

package Innerclass;

public class AnonymousInnerClassDetail
{
public static void main(String[] args)
{
Outer05 outer05 = new Outer05();
outer05.f1();
}
} class Outer05
{
private int n1 = 99;
public void f1()
{
Person person = new Person()
{
@Override
public void hi() {
System.out.println("匿名内部类重写了hi");
}
};
person.hi(); //也可以直接调用
new Person()
{
@Override
public void hi() {
System.out.println("匿名内部类重写了hi");
}
}.hi();
} }
class Person
{
public void hi()
{
System.out.println("Person hi");
} }

匿名内部类的实践

匿名内部类主要用于当前类只使用一次,使用过后我们就不会再反复使用,这样我们就没有必要专门再写一个类。

package Innerclass;

public class InnerClassExercise01 {
public static void main(String[]args)
{
f1(new IL() {
@Override
public void show() {
System.out.println("这是一幅名画");
}
});
}
public static void f1(IL il)
{
il.show();
}
}
interface IL
{
void show();
}
package Innerclass;

public class InnerClassExercise02 {
public static void main(String[] args)
{
CellPhone cellPhone = new CellPhone();
cellPhone.alarmclock(new Bell() {
@Override
public void ring() {
System.out.println("懒猪起床了");
}
});
cellPhone.alarmclock(new Bell() {
@Override
public void ring() {
System.out.println("小伙伴们上课");
}
});
}
} interface Bell
{
void ring();
} class CellPhone{
public void alarmclock(Bell bell)
{
bell.ring();
}
}

成员内部类

1、成员内部类是定义在外部类的成员位置,并且没有static修饰。

2、成员内部类可以直接访问外部类的所有成员,包括私有成员。

3、外部类访问内部类,就是直接创建一个内部类然后通过类进行访问。

4、我们可以用public、private、protected去修饰,因为它本身就是一个成员

package Innerclass;

public class MemberInnerClass {
public static void main(String [] args) {
Outer08 outer08 = new Outer08();
outer08.t1();
}
} class Outer08{
private int n1 = 10;
public String name = "张三";
class Inner08{
public void say()
{
System.out.println("n1 = " + n1 + " name = " + name);
}
}
public void t1(){
Inner08 inner08 = new Inner08();
inner08.say();
}
}

外部其他类使用成员内部类的两种方式

1、



2、

静态内部类

比上个内部类多了一个static修饰符

1、静态内部类,在外部类的成员位置,有static修饰

2、可以访问外部类的所有静态成员,非静态不能访问

3、作用域为整个类体

package Innerclass;

public class StaticInnerClass {
public static void main(String[] args) {
Outer10 outer10 = new Outer10();
outer10.m1();
}
} //外部类
class Outer10{
private int n1 = 10;
private static String name = "张三";
//静态内部类,在外部类的成员位置,有static修饰 //可以访问外部类的所有静态成员,非静态不能访问
//作用域为整个类体
static class Inner10{
public void say(){
System.out.println(name);
}
}
public void m1(){
Inner10 inner10 = new Inner10();
inner10.say();;
}
}

Java内部类与匿名类的更多相关文章

  1. java内部类以及匿名类

    内部类 一个类内部定义的类称为内部类. 内部类允许把逻辑相关的类组织在一起,并控制内部代码的可视性. 内部类与外部类的结构层次如下. 顶层类:最外层的类 外部类:内部类所在的类 内部类:类内部定义的类 ...

  2. Java 内部类和匿名类 实现JButton动作 ActionListener类

    import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ControlCircle2 extend ...

  3. java内部类和异常类的概念

    1.内部类的外嵌类的成员变量在内部类中任然有效,内部类中的方法也可以调用外嵌类中的 方法,内部类中不可以声明类的变量和方法,外嵌的类体可以用内部类声明对象,作为外嵌类的成员.内部类仅供他的外嵌类使用. ...

  4. (转)Java基础——嵌套类、内部类、匿名类

    本文内容分转自博客:http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html 将相关的类组织在一起,从而降低了命名空间的混乱. 一个内 ...

  5. Java中的内部类、匿名类的使用

    代码(test.java): interface ie{ public void print(); } class outer{} public class test{ public class in ...

  6. 【java】TreeSet、Comparable、Comparator、内部类、匿名类

    package com.tn.treeSet; public class Student { private String name; private int age; public Student( ...

  7. 【转】Java中的内部类和匿名类

       Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的 ...

  8. [改善Java代码]使用匿名类的构造函数

    建议39: 使用匿名类的构造函数 阅读如下代码,看看是否可以编译: public class Client { public static void main(String[] args) { Lis ...

  9. Java 中的 匿名类

    什么是内部类? 在一个类中定义另一个类,这样定义的类称为内部类.包含内部类的类称为内部类的外部类. 如果想要通过一个类来使用另一个类,可以定义为内部类. 内部类的外部类的成员变量在内部类仍然有效,内部 ...

  10. Java中的匿名类

    我们知道接口一般用于定义一种规范或操作协议,然后子类实现接口的所有功能.如下面的简单代码: 定义IMessage接口 package org.lyk.entities; public interfac ...

随机推荐

  1. 浅谈REFS文件系统数据恢复研发经历(1)

    作为80后技术员, 我一直很喜欢李玟, 是我们那个时代的偶像, 一直也很喜欢听他的歌, 看到她的噩耗, 还是很那么的无法理解, 一个那么好的人怎么会得抑郁症呢, 心里多少还是无法接受. 不过联想到自己 ...

  2. Day04_Java_作业

    A:选择题 1.下列哪个答案与show不是方法重载(b ). class Demo { void show(int a,int b,float c){} } A.void show(int a,flo ...

  3. SpringBoot 使用 Sa-Token 实现账号封禁、分类封禁、阶梯封禁

    一.需求分析 之前的章节中,我们学习了 踢人下线 和 强制注销 功能,用于清退违规账号.在部分场景下,我们还需要将其 账号封禁,以防止其再次登录. Sa-Token 是一个轻量级 java 权限认证框 ...

  4. TrustZone——(一)

    本文内容主要来源于网络,综合了网上的多篇文章,也加入了一些自己的理解,重新组织了文章结构使其便于理解. 主要参考的文章包括: 一篇了解TrustZone TrustZone领域先行者 TrustZon ...

  5. C语言基础-结构体基础

    文章目录 前言 1.结构体的创建 1.1 第一种方法 1.2 第二种方法 1.3 全局结构体和局部结构体的声明 2.结构体的使用 2.1 局部结构体的声明 & 初始化 2.1.1 指针方法 2 ...

  6. Ubuntu18.04 软件源更新:图形界面

    通过图形UI界面更新Ubuntu的软件源,手动修改虽然简单,但是要自己去找源,选一个系统配置好的更简单.但是新版的好像没有该功能,找到个奇葩的路径: 将Ubuntu16.04升级为Ubuntu18.0 ...

  7. DevOps|研发效能治理:进化史、规模化与治理复杂性

    麻广广@码猿外 研发效能这个词近几年火遍全网,各大企业都加入了研发效能治理的行列,开始梳理企业内部各个团队的研发流程,以期望找到企业降本增效的方向. 抛开政治因素,研发效能治理我们到底是在谈什么呢?从 ...

  8. JDBC:使用IDEA配置JDBC

    IDEA使用Jar包 操作流程 步骤1:创建lib路径 步骤2:复制jar包 步骤3:必须要做的一步 参考链接 https://blog.csdn.net/upup1006/article/detai ...

  9. return true 与 return false的妙用——jQuery

    var arr = [1, 3, 5,7,9]; jQuery.each(arr, function(key, value){ if(key === 2){ return true; } consol ...

  10. redux的三个概念与三大核心

    1.什么是redux?一个组件里可能会有很多的状态,比如控制某个内容显示的flag,从后端获取的展示数据,那么这些状态可以在自己的单个页面进行管理,也可以选择别的管理方式,redux就是是一种状态管理 ...