内部类

一个定义在另一个类里面的类称为内部类。内部类可以分为四种形式:成员内部类,

成员内部类

内部调用外部的属性和方法

成员内部类可以无条件访问外部类的所有成员属性和方法。

其他类(例子中的RunC类)访问一个内部类的形式有三种:

Outter.Inner outin=new Outter().new Inner();

Outter out=new Outter();

Outter.Inner in=out.new Inner();

public Inner getInnerInstance(){return Inner};

Outter out=new Outter();

Outter.Inner in=out.getInnerInstance();

public class Outter {

private String name = "Krystal";

private int age = 20;

private Inner innerInit=null;

public void outterFun(){

System.out.println("外部类的方法");

}

public Inner getInnerInstance(){

if(innerInit==null){

innerInit=new Inner();

return innerInit;

}else{

return innerInit;

}

}

class Inner {

void fun() {

//内部类无条件访问外部类的所有成员属性和方法,不需要声明

outterFun();

System.out.println(name);

System.out.println(age);

}

}

}

class RunC {

public static void main(String[] args) {

//第一种方式:

Outter.Inner outin=new Outter().new Inner();

outin.fun();

// //第二种方式:

// Outter out=new Outter();

// Outter.Inner in=out.new Inner();

// in.fun();

// //第三种方式:

// Outter out=new Outter();

// Outter.Inner in=out.getInnerInstance();

// in.fun();

}

}

/*运行结果为:

外部类的方法

Krystal

20

*/

外部调用内部的属性和方法

成员内部类可以无条件访问外部类的所有成员属性和方法,但是外部想访问内部就没那么简单了。首先要创建一个成员内部类的对象,然后通过该对象访问。

其他类(例子中的RunC类)访问一个外部类的方式跟平时一样,正常调用即可。

public class Outter {

Inner in=new Inner();

void outterFun(){

System.out.println(in.salary);

in.innerFun();

}

class Inner {

public void innerFun() {

System.out.println("内部类的方法");

}

private long salary=25000;

}

}

class RunC {

public static void main(String[] args) {

Outter ot=new Outter();

ot.outterFun();

}

}

/*运行结果为:

25000

内部类的方法

*/

局部内部类

局部内部类是定义在一个方法内或者一个作用域内的类。局部内部类的访问权限仅限于方法内或者作用域内。

class Outter{

private String name="krystal";

public void outterFun(){

class Woman{

int age=18;

}

//方法内定义的局部内部类的成员属性和方法只能在该方法内使用

System.out.println(new Woman().age);

}

//Woman w=new Woman();--->编译报错

}

class RunC{

public static void main(String[] args) {

Outter out=new Outter();

out.outterFun();

}

}

//运行结果: 18

匿名内部类(常用)

首先来了解以下什么叫做匿名类,匿名类就是没有名称的类,匿名类的名称由java的编译器给出,格式形如:外部类名称+$匿名类顺序。

既然匿名类没有名称,没有名称就不能被其它地方引用,不能被实例化,所以匿名类只能用一次,也不能由构造器。

匿名类可以继承父类的方法,也可以重写父类的方法。

匿名类必须继承一个父类或者实现一个接口。创建语法格式如下:

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

{

//匿名内部类的类体部分

}

匿名类可以访问外部类的成员属性和方法,匿名类的类体不可以声明static变量或static方法。

了解了匿名类之后,那么放在一个类内部的匿名类就是匿名内部类。

案例1:通过继承实体类创建匿名内部类

class Outter{

public String name="krystal";

void show(){

System.out.println("我叫"+name);

}

}

class RunC{

public static void main(String[] args) {

//通过实体类创建匿名内部类,相当于创建一个该类的子对象

Outter out=new Outter(){

//匿名内部类可以重写父类的方法:

@Override

void show() {

System.out.println("我叫Jimmy");

}

};

out.show();

//匿名内部类可以继承父类的属性和方法:

System.out.println(out.name);

//查看编译器分配给匿名内部类的名称

System.out.println(out.getClass());

}

}

/*运行结果为:

我叫Jimmy

krystal

class RunC$1

*/

案例2:通过实现接口创建匿名内部类

interface OutF{

public double getPrice();

public String getName();

}

class RunC{

public static void main(String[] args) {

OutF oF=new OutF() {

@Override

public double getPrice() {

return 153.45;

}

@Override

public String getName() {

return "shit";

}

};

System.out.println(oF.getName());

System.out.println(oF.getPrice());

System.out.println(oF.getClass());

}

}

/*运行结果为:

shit

153.45

class RunC$1

*/

静态内部类

静态内部类是定义在一个类内且加了static关键字的类。静态内部类不能访问外部类的非静态成员变量和方法,因为外部类的非static成员必须通过具体的对象来访问,如果静态内部类可以访问非static的外部类成员,就破坏了这一原则。

class staClass{

private String cls_id;

static class Innersta{

void fun(){

// System.out.println(cls_id);

// 报错Non-static field 'cls_id' cannot be referenced from a static context

}

}

}

Java内部类手机专卖店_Java(20)内部类相关推荐

  1. Java内部类手机专卖店_Java:内部类

    看Thinking in Java中内部类的一章,有内部类和静态内部类,书中把后者叫做嵌套类.常见用法实例: 一般内部类(非静态) 1 public classInnerClassTest {2 pu ...

  2. Java内部类手机专卖店_JAVA——内部类的那些事儿

    obj3.func(); //3.2 访问静态内部类的静态方法(通过类名访问) Outer.StaInner.staFunc(); //4 局部内部类访问局部变量 Outer obj4 = new O ...

  3. java学习2018年_Java 20年

    java学习2018年 二十年前,在苏黎世的一间公寓里发生了两件事. 我的女儿迈出了第一步,一位年轻的博士后研究员(她的父亲)迈出了使用Java的第一步. 很难完全了解当时的Java. 在这些时代,T ...

  4. java内部类的定义_java定义内部类

    package test.jdk; public class InnerTest { private String instAtt = "实例变量"; private static ...

  5. java中保护类型_java – 当内部类访问受保护的外部类超级时,如何避免“IllegalAccessError”...

    我创建了以下类: public class BaseController { protected String field; protected void method() { System.out. ...

  6. java 随机手机验证码_Java实现随机生成手机短信验证码的简单代码

    这篇文章主要介绍了Java随机生成手机短信验证码的方法,涉及Java数学运算计算随机数及字符串操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了Java随机生成手机短信验证码的 ...

  7. java web 手机验证_Java 手机Web开发 身份验证

    Java web和手机端开发 遇到比较麻烦的就是身份验证 目前为止觉得最好的解决方案是 Java 中使用jwt 为什么要使用jwt,让网络数据更加安全,以防其他一些人无意恶搞 在这里简单说下:jwt是 ...

  8. java虚拟机手机下载_java虚拟机下载

    java虚拟机是一款可以运行Java代码的虚拟计算机软件.java虚拟机是根据规格描述将java解释器移植到指定计算机上,就能保证经过用户编译的任何Java代码能够在虚拟系统上完美运行. java虚拟 ...

  9. java实现手机充电_java – 如何知道手机是否正在充电

    我发现的一件事是,如果您的手机具有100%的电池电量,您将无法收到充电通知.有些人意味着充电,而其他人则意味着有外部能力,无论是100%.我把它们混为一体,如果有任何条件,那我就归于真. public ...

最新文章

  1. 韩国文档的编码方式_像韩国学生学习英语一样学习编码
  2. 全了!从Python入门到精通
  3. 一文看懂 AI 训练集、验证集、测试集(附:分割方法+交叉验证)
  4. 这些知识点你会吗?redis的分布式布隆过滤器含答案解析
  5. 微众WeCross 跨链平台(12)合约总结
  6. 去银行贷款,有中介和没中介的巨大差别
  7. 去除list集合中重复项的几种方法
  8. 【转】图文详解YUV420数据格式
  9. android webview 设置cookie时间,解决Android webview设置cookie和cookie丢失的问题
  10. C++基础知识(四)文件的基本操作
  11. MapInfo MIF/MID文件格式描述
  12. 调用DllRegisterServer进行COM组件的注册
  13. android小米手机拍照功能,小米手机 调用相机拍照后无法返回问题
  14. 计算机类专业都有什么区别?
  15. matlab图像自动标注程序,基于MATLAB/GUI的图像语义自动标注系统
  16. 【渝粤教育】电大中专Windows操作系统_1作业 题库
  17. STM32G474的启动模式NRST引脚特性
  18. 一名测试工程师的苦逼感想
  19. 银行网点WLAN无线认证解决方案
  20. WWF(Windows Workflow Foundation)的简介

热门文章

  1. JS中的7种设计模式
  2. 验证环境中的program为什么必须是automatic
  3. 机器学习典型步骤以及训练集、验证集和测试集概念
  4. MySQL 学习笔记(4)— 组合查询、子查询、插入数据、更新/删除表数据、增加/删除表中的列以及重命名表
  5. [ CodeVS冲杯之路 ] P1116
  6. 利用JS判断是手机端还是PC端 浏览网站
  7. 0709 C语言常见误区----------函数指针问题
  8. Delta3D———通过游戏管理器组件和消息的扩展创建自定义行为 《转》
  9. 理解面向过程和面向对象的程序设计方法
  10. 老齐学python的django 源代码_《跟老齐学Python:Django实战》真正的手把手“带”您学习...