内部类

定义:

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

//外部类
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. 记一次 .NET 某游戏服务后端 内存暴涨分析

    一:背景 1. 讲故事 前几天有位朋友找到我,说他们公司的后端服务内存暴涨,而且CPU的一个核也被打满,让我帮忙看下怎么回事,一般来说内存暴涨的问题都比较好解决,就让朋友抓一个 dump 丢过来,接下 ...

  2. hexo博客git报错

    一.意外的标记异常 1.异常内容: xxx:blog xxxx$ hexo g INFO Start processing FATAL Something's wrong. Maybe you can ...

  3. .net 6 winform启动器:调用CMD命令行执行dotnet命令启动.net core程序并将控制台输出日志输出到winform textbox实现实时日志显示

    背景 历史遗留问题,生产车间运行的一个.net core signalr程序使用命令行程序启动,经常由于生产人员误操作将光标停留在控制台上导致程序假死,丢失部分测试数据,车间随便找了一台win10系统 ...

  4. 【MAUI Blazor踩坑日记】5.macOS上的缩放比例

    macOS的页面默认比较小,原因貌似是因为符合iPad吧, 这个没啥好说的,看微软文档就可以了https://learn.microsoft.com/zh-cn/dotnet/maui/mac-cat ...

  5. 关于quartus II的导入以前的工程,QSF文件出现的错误的解决方案。

    在有时候打开以前的工程,或者别人做好的例程会遇到一些报错信息.具体报错信息如下: 报错信息语句行: 在文件QSF文件中有几行出错,显示错误读取,即不能打开工程.打开文件发现该几行的PIN 使能信号处于 ...

  6. Windows 下搭建 Appium + Android+python 自动化测试环境

    前言 本来并不打算写这么一篇文章,但是实践下来发现网上的各种教程里大致有两个问题.一是文章有些跟不上时代,目前android开发和测试的技术更新都比较快,内容有些过期.二是细节部分不是太完整,拼拼凑凑 ...

  7. 七 APPIUM Android 定位方式(转)

    1.定位元素应用元素 1.1通过id定位元素 Android里面定位的id一般为resrouce-id: 代码可以这样写: WebElement element = driver.findElemen ...

  8. ABC295 D题 题解

    题意简述 给定一个长度不超过\(\;5\times 10^5\;\)的,仅有数字构成的字符串,问存在多少段子串,使得子串内字符重新排序后,前半段与后半段相同? 做法分析 重组后前后两部分相同,其实也就 ...

  9. js中的函数式编程

    函数是javascript中非常重要的一部分,用途也非常的多,可作为参数.返回值.回调等等,下面有一些函数式编程的重要概念和定义 纯函数 纯函数属于程序设计的名词,其它语言中也是存在的,而在javas ...

  10. GitOps 与 DevOps:了解关键差异,为企业做出最佳选择

    在软件开发领域,GitOps 和 DevOps 是加强协作和实现软件交付流程自动化的重要技术.虽然这两种模式都旨在提高软件开发生命周期的效率,但它们的核心原则和实施方式却各不相同. 本篇文章将帮助您了 ...