Java中的内部类

一:什么是内部类;

  (1).什么是内部类呢?

  内部类( Inner Class )就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。

  (2).那为什么要将一个类定义在另一个类里面呢?独立的一个类不好吗?

  内部类的主要作用如下:

1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类

2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据

3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便

  (3)内部类有几种呢?

  内部类可分为以下几种:

  • 成员内部类
  • 静态内部类
  • 方法内部类
  • 匿名内部类

二:Java 中的成员内部类;

  内部类中最常见的就是成员内部类,也称为普通内部类。我们来看如下代码:

//外部类HelloWorld
public class HelloWorld{ private int a = 99;//外部类的私有属性
//内部类Inner
public class Inner{
int b = 2;
public void test(){
System.out.println("访问外部类中的a:"+a);
System.out.println("访问内部类中的b:"+b);
}
}
//测试成员内部类
public static void main(String[]args){
HelloWorld o = new HelloWorld();//创建外部类对象,对象名为o
Inner i = o.new Inner();//使用外部类对象创建内部类对象,对象名为i
i.test();//调用内部类对象的test方法
}
}

运行结果为:

从上面的代码中我们可以看到,成员内部类的使用方法:

1、 Inner 类定义在 HelloWorld类的内部,相当于 HelloWorld 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等

2、 Inner 类中定义的 test() 方法可以直接访问 HelloWorld类中的数据,而不受访问控制符的影响,如直接访问 HelloWorld类中的私有属性a

3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );

4、 编译上面的程序后,会发现产生了两个 .class 文件

HelloWorld.class

HelloWorld$Inner.class

  其中,第二个是外部类的 .class 文件,第一个是内部类的 .class 文件,即成员内部类的 .class 文件总是这样:外部类名$内部类名.class

另外,注意:

1、 外部类是不能直接使用内部类的成员和方法滴

  可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。

2、 如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字。如:

//外部类HelloWorld
public class HelloWorld{ int b = 1;
//内部类Inner
public class Inner{
int b = 2;
public void test(){
System.out.println("访问外部类中的b:"+HelloWorld.this.b);
System.out.println("访问内部类中的b:"+b);
}
}
//测试成员内部类
public static void main(String[]args){
HelloWorld o = new HelloWorld();//创建外部类对象,对象名为o
Inner i = o.new Inner();//使用外部类对象创建内部类对象,对象名为i
i.test();//调用内部类对象的test方法
} }

运行结果为:

三:Java 中的静态内部类;

  静态内部类是 static 修饰的内部类,这种内部类的特点是:

1、 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问 

2、 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员

3、 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();

举个例子:

//外部类HelloWorld
public class HelloWorld{ private int a = 99;//外部类的私有变量
static int b = 1;//外部类的静态变量
//静态内部类
public static class SInner{
int b =2;
public void test(){
System.out.println("访问外部类中的b:"+HelloWorld.b);
System.out.println("访问内部类中的b:"+b);
}
}
//测试静态内部类
public static void main(String[]args){
SInner si = new SInner();//直接创建内部类的对象
si.test();//调用test方法
}
}

运行结果为:

四:Java 中的方法内部类;

  方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。

举一个例子:

//外部类HelloWorld
public class HelloWorld{ //外部类中的方法
public void show(){
final int a =25;//常量
int b = 13;//变量
//方法内部类
class MInner{
int c =2;//内部类中的变量
public void print(){
System.out.println("访问外部类的方法中的常量a:"+a);
System.out.println("访问内部类中的变量c:"+c);
}
}
MInner mi = new MInner();//创建方法内部类中的对象
mi.print();//调用内部类中的方法
}
//测试方法内部类
public static void main(String[]args){
HelloWorld mo = new HelloWorld();
mo.show();//调用外部类的方法
}
}

注意:由于方法内部类不能在外部类的方法以外的地方使用,因此方法内部类不能使用访问控制符和 static 修饰符。

Java学习笔记二十:Java中的内部类的更多相关文章

  1. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  2. Java学习笔记二十四:Java中的Object类

    Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...

  3. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

  4. Java学习笔记二十九:一个Java面向对象的小练习

    一个Java面向对象的小练习 一:项目需求与解决思路: 学习了这么长时间的面向对象,我们只是对面向对象有了一个简单的认识,我们现在来做一个小练习,这个例子可以使大家更好的掌握面向对象的特性: 1.人类 ...

  5. Java学习笔记二十七:Java中的抽象类

    Java中的抽象类 一:Java抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就 ...

  6. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  7. Java学习笔记二十二:Java的方法重写

    Java的方法重写 一:什么是方法的重写: 如果子类对继承父类的方法不满意,是可以重写父类继承的方法的,当调用方法时会优先调用子类的方法. 语法规则 返回值类型.方法名.参数类型及个数都要与父类继承的 ...

  8. Java学习笔记三十:Java小项目之租车系统

    Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的“呱呱租车系统” 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金额.总载货量以及其车 ...

  9. Java学习笔记二十一:Java面向对象的三大特性之继承

    Java面向对象的三大特性之继承 一:继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方 ...

随机推荐

  1. Python学习---重点模块之json

    注意:JSON不能转换类,不能转换函数 重点方法示例 json.dumps():实现文件写入,字符串转换[写入文件当然是JSON字符串楼] 实际上,json.dumps()只是帮我们做了一个字符串的转 ...

  2. ZT 七大寡头

    网易评论人才辈出啊!!!看下面   http://comment.news.163.com/news_guoji2_bbs/9GRIIJA90001121M.html 关注 关注他的微博yftyfm ...

  3. OC基础数据类型-NSArray

    1.数组的初始化 NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @&quo ...

  4. csr867x开发日记——常用软件工具介绍

    xIDE xIDE开发环境(编译器)可以被用于以下操作 查看代码 构建新应用 调试 运行 重新配置 修改 Universal Front End 通用前端 通用前端(UFE)工具用于配置DSP,ADK ...

  5. anydesk重启脚本

    1.restart.sh: #!/bin/sh sh /home/zhoushuo/anydeskTest/stop.sh echo 'zhoushuo'|sudo -S /usr/bin/anyde ...

  6. CSS 优先级和特指度

    1.ID 选择符 > 类选择符 > 元素选择符.特指度高的优先级高 2.行内样式 > 内嵌样式 > 链接样式 3.设定的样式 > 继承的样式 特指度的计算: 特指度能够用 ...

  7. Oracle中的rownum不能使用大于>的问题

    标题:Oracle中的rownum不能使用大于>的问题 一.对rownum的说明 关于Oracle 的 rownum 问题,很多资料都说不支持SQL语句中的“>.>=.=.betwe ...

  8. 在CentOS实现mysql数据库的自动备份

    数据是一个比较重要的数据,经常需要备份,每次都手动比较麻烦.本脚本主要现实在CentOS中实现对数据库的备份和保留最近十五天的备份文件.避免太多无用陈旧的备份占用空间. #!/bin/bashid=& ...

  9. IDEA定位开发文件在左边工程中的文件路径

    IDEA新公司入职使用第七天,基本快捷键和BUG调试已经搞透了!从最开始的配置到现在的适应确实是一个不小的进步,前几天每天加班太忙没有时间更新博客,明天就是五一假期,现在将刚掌握的一点IDEA技术写出 ...

  10. Comparable 接口的使用

    //学生类 package test; public class Student implements Comparable<Student>{ private int age; priv ...