展开全部

对普通类(没有内部类的类)来说,62616964757a686964616fe78988e69d8331333337396234内部类和外部类都与他无关;对有内部类的类来说,它们就是其内部类的外部类,外部类是个相对的说法,其实就是有内部类的类。

所以,要回答这个问题,只需要讲解内部类是什么:

Java中的内部类共分为四种:

静态内部类static inner class (also called nested class)

成员内部类member inner class

局部内部类local inner class

匿名内部类anonymous inner class

静态内部类Static Inner Class

最简单的内部类形式。

类定义时加上static关键字。

不能和外部类有相同的名字。

被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式。

只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。

生成静态内部类对象的方式为:

OuterClass.InnerClass inner = new OuterClass.InnerClass();

示例代码:

package com.learnjava.innerclass;

class StaticInner

{

private static int a = 4;

// 静态内部类

public static class Inner

{

public void test()

{

// 静态内部类可以访问外部类的静态成员

// 并且它只能访问静态的

System.out.println(a);

}

}

}

public class StaticInnerClassTest

{

public static void main(String[] args)

{

StaticInner.Inner inner = new StaticInner.Inner();

inner.test();

}

}

成员内部类Member Inner Class

成员内部类也是定义在另一个类中,但是定义时不用static修饰。

成员内部类和静态内部类可以类比为非静态的成员变量和静态的成员变量。

成员内部类就像一个实例变量。

它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。

在外部类里面创建成员内部类的实例:

this.new Innerclass();

在外部类之外创建内部类的实例:

(new Outerclass()).new Innerclass();

在内部类里访问外部类的成员:

Outerclass.this.member

示例代码:

package com.learnjava.innerclass;

class MemberInner

{

private int d = 1;

private int a = 2;

// 定义一个成员内部类

public class Inner2

{

private int a = 8;

public void doSomething()

{

// 直接访问外部类对象

System.out.println(d);

System.out.println(a);// 直接访问a,则访问的是内部类里的a

// 如何访问到外部类里的a呢?

System.out.println(MemberInner.this.a);

}

}

}

public class MemberInnerClassTest

{

public static void main(String[] args)

{

// 创建成员内部类的对象

// 需要先创建外部类的实例

MemberInner.Inner2 inner = new MemberInner().new Inner2();

inner.doSomething();

}

}

局部内部类Local Inner Class

局部内部类定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。

像局部变量一样,不能被public, protected, private和static修饰。

只能访问方法中定义的final类型的局部变量。

局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。

示例代码:

package com.learnjava.innerclass;

class LocalInner

{

int a = 1;

public void doSomething()

{

int b = 2;

final int c = 3;

// 定义一个局部内部类

class Inner3

{

public void test()

{

System.out.println("Hello World");

System.out.println(a);

// 不可以访问非final的局部变量

// error: Cannot refer to a non-final variable b inside an inner

// class defined in a different method

// System.out.println(b);

// 可以访问final变量

System.out.println(c);

}

}

// 创建局部内部类的实例并调用方法

new Inner3().test();

}

}

public class LocalInnerClassTest

{

public static void main(String[] args)

{

// 创建外部类对象

LocalInner inner = new LocalInner();

// 调用外部类的方法

inner.doSomething();

}

}

匿名内部类Anonymous Inner Class

匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。

匿名内部类隐式地继承了一个父类或者实现了一个接口。

匿名内部类使用得比较多,通常是作为一个方法参数。

生成的.class文件中,匿名类会生成OuterClass$1.class文件,数字根据是第几个匿名类而类推。

示例代码:

package com.learnjava.innerclass;

import java.util.Date;

public class AnonymouseInnerClass

{

@SuppressWarnings("deprecation")

public String getDate(Date date)

{

return date.toLocaleString();

}

public static void main(String[] args)

{

AnonymouseInnerClass test = new AnonymouseInnerClass();

// 打印日期:

String str = test.getDate(new Date());

System.out.println(str);

System.out.println("----------------");

// 使用匿名内部类

String str2 = test.getDate(new Date()

{

});// 使用了花括号,但是不填入内容,执行结果和上面的完全一致

// 生成了一个继承了Date类的子类的对象

System.out.println(str2);

System.out.println("----------------");

// 使用匿名内部类,并且重写父类中的方法

String str3 = test.getDate(new Date()

{

// 重写父类中的方法

@Override

@Deprecated

public String toLocaleString()

{

return "Hello: " + super.toLocaleString();

}

});

System.out.println(str3);

}

}

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

java外部类_Java里什么叫内部类什么叫外部类相关推荐

  1. Java hibernate假外键_java – Hibernate:没有实体类的外键,只能通过id

    我有一个分层实体,它将自己引用为父母.我只需要通过id进行映射,而不是通过实体实例进行映射(原因太复杂,无法解释).所以我这样定义了实体: class Item { @Id private Strin ...

  2. java file 对象_Java里File对象的问题。

    Java里File对象的问题. 关注:282  答案:2  mip版 解决时间 2021-02-02 07:14 提问者鉨瞞着所囿亾,爱着誰 2021-02-01 08:59 import java. ...

  3. java克隆实现_JAVA里的深克隆与浅克隆实现

    概括起来说,JAVA里想让一个类的实例可以克隆,需要两步: 1.令该类实现Cloneable接口,这是一个标记接口,用来表示这个类是可被克隆的类型(没这个标记的话调用java.lang.Object. ...

  4. java 反射 静态成员_java 利用反射获取内部类静态成员变量的值

    待解析类结构如下: /** * @Author changle * @Time 17/6/13. * @Desc to do */ public class Goods { static class ...

  5. java calculator类_java里使用面向对象的思想编写一个计算器类(Calculator),可以实现两个数的加、减、乘、除运算...

    展开全部 package calculate; import java.math.BigDecimal; import java.math.BigInteger; import java.util.r ...

  6. java 元祖_JAVA里的元祖类

    什么是元祖类 java中的方法只能返回单个对象,如果需要返回多个怎么办?通常我们会创建一个额外的对象,或者把返回内容放入集合中返回,另外,我们也有其他的选择:结合泛型,我们可以把一组对象直接打包存储于 ...

  7. java取得一月_Java里,如何得到一个月有多少天

    展开全部 按照你62616964757a686964616fe78988e69d8331333361326239的要求,如何得到一个月有多少天,这里并没有说是什么年份,所以默认当年(不同年份的月份天数 ...

  8. redis的java客户端名称_java里常用的redis客户端简介

    zepto返回顶部动画 点击返回顶部 function goTop(acceleration, time) { acceleration = acceleration || 0.1; time = t ...

  9. java 二元组_java里有类似于二元组之类的数据结构么?

    二元组(D,R),D是数据元素的有限集,R是D关系上的有限集. 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.通常情况下,精心选择的数据结构可以带来 ...

最新文章

  1. pytorch源码解析:Python层 pytorchmodule源码
  2. 【3DMax教程】三维产品可视化视频教程 3d Products Visualization Course
  3. 【亲测有效】在win10上如何安装Fortify17.10
  4. Java把List转换为String使用stream(functional programming in java)
  5. CSS BOX类型和display属性
  6. C#中所有对象共同的基类是System.Object
  7. 前端实现只显示年月日
  8. Java环境变量CLASSPATH详解
  9. php redis事务回滚,【Redis】Redis事务详解,Redis事务不支持回滚吗?
  10. java cookie id,我如何在Java中获取会话ID
  11. 优化理论09-----线性等式约束问题的投影方法、投影最速下降算法、解决方向查找问题(DFP)、牛顿法的修正在线性等式约束、变度量法
  12. hard-negative mining详细介绍
  13. 算法学习:01背包问题求具体方案
  14. Archlinux kde 美化
  15. 使用RX方式模拟DoubanFm的登陆
  16. 如何给视频添加特效字幕?分享一个简单好用的办法
  17. 自学Java的心路历程
  18. html dom ready,【js】实现DOMReady
  19. sas 读取mysql数据类型_SAS | 格式规范数据读取
  20. 腾讯视频VIP周卡深圳地区免费领!附非深圳免费领腾讯视频会员攻略

热门文章

  1. Linux下的LD_PRELOAD环境变量与库打桩
  2. C语言—sort函数比较大小的快捷使用--algorithm头文件下
  3. react同步请求_React中setState同步更新策略
  4. es内嵌文档查询_ElasticSearch 文档的增删改查都不会?
  5. 三种平摊分析的方法分别为_干货|电工必须学会的三极管电路分析方法
  6. 俩台电脑怎么设置同一局域网_方法 | 把手机上的照片传到电脑上
  7. java的for循环取出数据只是拿到最后一个_一问SQL优化就无从藏身?那只是你对原理的精髓掌握不深
  8. 云服务器php版本修改,云服务器 更改php版本
  9. tomcat监控脚本
  10. oracle跨越千年处理