Java内部类

定义在外部类中的类就是内部类;内部类的定义是为了更清楚、详细地描述事物。

有名内部类和匿名内部类

Java语言根据内部类是否有类名将内部类分为有名内部类和匿名内部类(没有类名)。

有名内部类及创建对象

public class OutClass{

public void play(){

System.out.println("正在玩耍......");

}

public class Inner{

public void play(){

System.out.println("正在愉快地玩耍......");

}

}

/* public static void main(String[] args){

OutClass outer = new OutClass();

Inner inner = outer.new Inner();  //同类中创建可省略 外部类名

outer.play();

inner.play();

}

*/

}

public class Test{

public static void main(String[] args){

OutClass outer = new OutClass();

OutClass.Inner inner = outer.new Inner();

outer.play();

inner.play();

}

}

正在玩耍......

正在愉快地玩耍......

上例就是一个有名内部类,类名为 Inner,创建内部类对象时的格式为:外部类名.内部类名 对象名 = 外部类对象名.new 内部类名;

还有一种 static 修饰的静态内部类,这时创建对象的格式为: 外部类名.内部类名 对象名 = new 外部类名.内部类名;

public class OutClass{

public void play(){

System.out.println("正在玩耍......");

}

public static class Inner{

public void play(){

System.out.println("正在愉快地玩耍......");

}

}

/*public static void main(String[] args){

OutClass outer = new OutClass();

Inner inner = new OutClass.Inner();   //同理可省略 外部类名

outer.play();

inner.play();

}*/

}

public class Test{

public static void main(String[] args){

OutClass outer = new OutClass();

OutClass.Inner inner = new OutClass.Inner();  //注意:创建方式稍有不同

outer.play();

inner.play();

}

}

正在玩耍......

正在愉快地玩耍......

匿名内部类及创建对象

有些类我们只使用一次就不需要了,如果我们特意为其创建一个类是比较浪费资源的,而匿名内部类就是为了实现这种只使用一次的类。

因为匿名内部类没有类名,所以无法直接创建匿名内部类;定义匿名内部类的同时须直接实例化该类;其语法格式为:

new 父类构造器([参数1],[参数2],...[参数n]){

//匿名内部类类体

};                             //注意结尾出必须有  ;

//抽象类

public abstract class Father{

public abstract void work();

}

public class Son{

public static void main(String[] args){

Father father = new Father(){

public void work(){

System.out.println("正在上课......");

}

};

father.work();

}

}

正在上课......

接口在定义匿名构造类的同时也需要将其实例化;其语法格式为:

new 接口(){

//匿名内部类类体

};                      //注意结尾出必须有  ;

//接口

public interface IComputer{

void add(int a,int b);

}

public class Test{

public static void main(String[] args){

IComputer iccomputer = new IComputer(){

public void add(int a,int b){

System.out.println(a+b);

}

};

iccomputer.add(1,5);

}

}

注意:

· 匿名内部类一定是接口的实现(该实现只能是一个接口)或类的子类,其中 new 关键字后面的类名或接口名是该匿名内部类继承的父类或实现的接口;

· 匿名内部类中的方法绝对不能是抽象方法;

· 匿名内部类新增的属性和方法不能被上转型对象所调动;只能被非上转型对象方式创建的匿名内部类对象所调用

public interface IComputer{

void add(int a,int b);

}

public class Test{

public static void main(String[] args){

new IComputer(){

public void add(int a,int b){

System.out.println(a+b);

}

public void computer(){

System.out.println("正在计算......");

}

}.computer();

}

}

正在计算......

静态内部类和非静态内部类

根据类是否有 static 修饰词修饰,可将内部类分为静态内部类和非静态内部类,因为以上内部类均为非静态内部类,因此我们下文只说静态内部类;

静态内部类

public class Father{

static String name = "Tom";

String id = "888";

public static void work(){

System.out.println("正在工作......");

}

public void study(){

System.out.println("正在进修......");

}

static{

Son.work();  //调用静态内部类的静态方法

System.out.println(Son.name);  //调用静态内部类的静态属性

Son son = new Son();  //创建静态内部类对象

son.study();  //通过创建静态内部类对象调用静态内部类的非静态方法

System.out.println(son.id);  //通过创建静态内部类对象调用静态内部类的非静态属性

}

public static class Son{

static String name = "Jim";

String id = "222";

public static void work(){

System.out.println("正在上学......");

}

public void study(){

System.out.println("正在学习......");

}

static{

Father.work();  //调用外部类的静态方法

System.out.println(Father.name);  //调用外部类的静态属性

Father father = new Father();  //创建外部类对象

father.study();  //通过创建外部类对象调用外部类的非静态方法

System.out.println(father.id);  //通过创建外部类对象调用外部类非静态属性

}

}

public static void main(String[] args){

new Father();

new Father.Son();

}

}

正在工作......

Tom

正在进修......

888

正在上学......

Jim

正在学习......

222

静态内部类可直接调用外部类的静态属性和方法,可以通过创建外部类对象调用外部类非静态属性和方法;

外部类可直接调用静态内部类的静态属性和方法,可以通过创建内部类对象调用静态内部类非静态属性和方法;

注意:静态内部类属于外部类,而不属于外部类对象

内部类特征小结

内部类是一个独立的类,编译后会单独生成一个 .class 文件;如果是有名内部类,则是 外部类名+$+内部类名;如果是匿名内部类,则为 外部类名+$+数字;

普通类、抽象类和接口都可以有内部类(包括有名内部类和匿名内部类);

外部类的访问控制符只能是MT4模拟账户登录教程public 或者是 默认的;但内部类的访问控制符可以是 public、protect、default、private ,还可以用 static 修饰(注意:static不能修饰外部类和接口);

定义在代码块和方法中内部类不能用访问控制符修饰,也不能用 static 修饰;

内部类可以访问外部类所有访问权限的成员变量。

内部类的定义:

在一个外部类中定义的类称为内部类。

内部类的分类:

按是否有名字:有名内部类和匿名内部类。

按是否有static:静态内部类和非静态内部类。

有名内部类:

创建形式如下:

public class Body {

public class Heart{

void work() {   //该类为有名内部类,在普通类Heart内部。

System.out.println("正在跳动");

}

}

}

匿名内部类:

1、创建

因为创建对象需要有类名,匿名内部类没有类名,所以匿名内部类定义的时候和创建对象一起定义。

创建形式如下:

new 父类构造器([参数列表])|接口(){

匿名内部类类体

};

Object object = new Object() { //object为匿名内部类的对象。

};

2、特点

① 匿名内部类是普通类的子类:

Object object = new Object() { //此时匿名内部类是Object的子类,而与在哪个类中创建无关。

};

② 匿名内部类是抽象类的子类:

Test1.java

public abstract class Test1 {

public abstract void eat();

}

Test.java

public class Test {

public static void main(String[] args) {

Test1 test = new Test1()

{

public void eat() {

System.out.println("吃");

}

};

}

}

③ 匿名内部类是接口的实现类:

Test1.java

public interface Test1 {

void eat();

}

Test.java

public class Test {

public static void main(String[] args) {

Test1 test = new Test1()

{

public void eat() {

System.out.println("吃");

}

};

}

}

④ 匿名内部类不能是抽象类:

如果匿名内部类是抽象类,则其必须有子类,但是因为匿名内部类没有名字,没有子类,所以匿名内部类不能是抽象类。

共同特点:

1、无论是匿名内部类还是有名内部类,javac都会产生一个独立的class文件,编译之后内部类会被编译成独立的.class文件:

① 如果该内部类为有名内部类,则有名内部类字节码文件名为:

② 如果为匿名内部类,则匿名内部类字节码文件名为(最后加的数字):

2、如果直接在类中定义内部类,则其使用方式与成员变量类似:

Body body = new Body();

System.out.println(body.age);

Heart heart = body.new Heart(); //增加父类变量来调用。

heart.work();

3、外部类或外部接口 public 默认的;但是直接在类中定义的内部类,可以有public ~private。

public class Test {

private class Test01

{

}

public static void main(String[] args) {

}

}

4、如果在内部类中使用局部变量的值,则:JDK8.0及+可以不适用final修饰,8.0以前必须使用fianl。

public class Test {

public static void main(String[] args) {

int age =12; //如果是8.0以前必须在int前面加上fianl。

Test1 test = new Test1()

{

public void eat() {

System.out.println("吃"+age);

}

};

}

}

————————————————

原文链接:https://blog.csdn.net/qq_44971038/article/details/102798027

Java之有名内部类和匿名内部类的更多相关文章

  1. Java中的内部类与匿名内部类总结

    内部类 内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动) ...

  2. java基础语法-内部类与匿名内部类

    1.成员内部类(声明在类内部&&方法之外) class Person{ String name = "韩梅梅"; int age; class Bird{ Stri ...

  3. JAVA类(内部类、匿名内部类、异常、自定义异常)

    内部类 package AA; public class 类 { ; StringBuffer dee=new StringBuffer(); public class 成员内部类{ public v ...

  4. Java中的内部类(成员内部类、静态内部类、局部内部类、匿名内部类)

    Java中的内部类(成员内部类.静态内部类.局部内部类.匿名内部类) 神话丿小王子的博客主页 我们先看这样一段话:人是由大脑.肢体.器官等身体结果组成.而组成我们人体的心脏它也有自己的属性和行为(血液 ...

  5. 十一、Java基础---------内部类与匿名内部类

    内部类分为普通内部类(有名)和匿名内部类.普通内部类分为成员内部类.局部内部类.静态内部类(嵌套内部类).顾名思义,内部类就是定义在一个类内部的类.什么时候都会使用内部类呢?当我们定义一个类,发现内部 ...

  6. java之内部类(InnerClass)----非静态内部类、静态内部类、局部内部类、匿名内部类

    提起java内裤类(innerClass)很多人不太熟悉,实际上类似的概念在c++里面也有,那就是嵌套类(Nested Class),关于这俩者的区别,在下文中会有对比.内部类从表面上看,就是在类中定 ...

  7. Java:内部类(静态内部类、成员内部类、局部内部类、匿名内部类)

    Java基础_内部类:在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类. 内部类的主要作用:使用内部类可以减少命名冲突. 定义位置:一个内部类可以定义在一个类中,也可以 ...

  8. Java内部类之匿名内部类

      我们都知道Java中可以使用内部类,将一个类的定义放在另一个类的定义的内部,这就是内部类,但是匿名内部类往往使我们摸不着头脑,因为它并没有特定的名称,那么该如何使用它呢? 定义一个匿名内部类 pu ...

  9. Java编程之委托代理回调、内部类以及匿名内部类回调(闭包回调)

    最近一直在看Java的相关东西,因为我们在iOS开发是,无论是Objective-C还是Swift中,经常会用到委托代理回调,以及Block回调或者说是闭包回调.接下来我们就来看看Java语言中是如何 ...

随机推荐

  1. GitHub 创建工程

    创建本地代码仓库 打开Git Bash 首先配置自己的身份,这样在提交代码的时候就能知道是谁提交的 输入git config --global user.name 名字 git config --gl ...

  2. jquery实现左侧菜单 效果

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  3. Mongo 备份

    1. Windows下远程连接服务器上的MongoDB数据库 使用的是mongo命令,如果安装mongodb时配置了环境变量,可以直接快捷键windows+R打开cmd. Cmd  --- mongo ...

  4. JVM内存模型及GC回收算法

    该篇博客主要对JVM内存模型以及GC回收算法以自己的理解和认识做以记录. 内存模型 GC垃圾回收 1.内存模型 从上图可以看出,JVM分为 方法区,虚拟机栈,本地方法栈,堆,计数器 5个区域.其中最为 ...

  5. C语言集成开发环境使用小记

    时隔6年,我又重操C语言,是什么让我如此再下定决心?就是不想让自己所学过的知识就此荒废了,我重新以一个C语言初学者的身份(当然,稍稍有点基础,以前的知识忘得没这么快^_^)温故C语言,学习了几天,果真 ...

  6. 《NULL-2019团队》第一次作业:OUC二手交易平台

    前言 项目名称:OUC二手交易平台 项目简介:针对在校大学生的二手交易平台,相对于现在市面已有的二手APP,将其使用的普遍性范围缩小,针对在校大学生,这样可以有效的保证交易的真实性和公平性.   NA ...

  7. Monkeyrunner学习

    可以写一个pyhon工程,安装在android进行测试,还可以截屏操作.Monkeyrunner为framework层开发.MonkeyRunner本身是Java做的,为了和Python连接,做了一个 ...

  8. Docker Machine 管理-管理machine(17)

    用 docker-machine 创建 machine 的过程很简洁,非常适合多主机环境.除此之外,Docker Machine 也提供了一些子命令方便对 machine 进行管理.其中最常用的就是无 ...

  9. 爬虫 fake_useragent

    import requests from fake_useragent import UserAgent ua = UserAgent() headers = { "UserAgent&qu ...

  10. (动态改变数据源遇到的问题)sqlserver2012:No Dialect mapping for JDBC type: -9解决方案

    public class MySQLServerDialect extends SQLServerDialect { public MySQLServerDialect() { super(); re ...