Java学习--内部类(一)

一. 内部类的定义和特点

class Outer{
privite int num = 5; class Inner{
public void Display(){
System.out.println(num);
}
} public void method(){
Inner i = new Inner();
i.Display();
}
}

这里写了一个类Outer,它有一个私有变量,一个成员方法method(),和一个内部类Inner。在内部类Inner中访问了外部类Outer的私有变量。内部类是这样定义的: 
把类定义在其他类的内部,这个类就被称为内部类,比如上例中的Inner。 
内部类的访问特点是: 
内部类可以直接访问外部类的成员,比如上例中的num,包括私有;外部类要访问内部类的成员,必须创建内部类对象。 
内部类的分类:
成员内部类
局部内部类

二. 成员内部类

首先说一下成员内部类和局部内部类的区别。

class Outer{
privite int num = 5;
// 成员位置
class Inner{
} public void method(){
//局部位置
class Inner2{
}
}

成员位置:在成员位置定义的类,被称为成员内部类,如 class Inner。 
局部位置:在局部位置定义的类,被称为局部内部类,如class Inner2。

如何访问成员内部类的成员呢?这里直接给出答案: 外部类名.内部类名 对象名 = 外部类对象.内部类对象

class Outer{
privite int num = 5; class Inner {
public void Display() {
System.out.println(num);
}
}
}
class InnerDemo{
public static void main(String[] args) {
// 需要访问Inner类Display方法
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}

对于成员内部类,必须通过一级一级的类进行访问。

成员内部类的修饰符private和static。
private是为了数据的安全性。当内部类里的成员变量和方法不想让外部类或者其他人访问时,将内部类声明为private即可。这时的就要将内部类的实例化放在外部类中。

class Computer {
private class Cpu {
public void operator() {
System.out.println("更改CPU");
}
} public void method() {
if(管理者) {
Cpu c = new Cpu();
c.operator();
}
}
}

这样当我们要访问内部类Cpu中的operator方法时,因为不是任何一个人都可以更改cpu,就将内部类声明为私有的,我们也不能通过上面讲的外部类名.内部类名 对象名 = 外部类对象.内部类对象来访问,因为这个成员内部类是private,私有的,不允许外部类的对象来访问这个private的Cpu类。这时就可以通过在Computer内部声明一个成员方法来实现内部类的实例化,在Computer类的内部来访问这个私有的内部类。 
static是为了方便访问数据。这里需要注意的是静态内部类访问的外部类数据必须是静态类型的。

class Outer {
private static int num = 10; public static class Inner {
public void show() {
System.out.println(num);
}
}
public static void show2() {
System.out.println(num2);
}
}

这里要访问内部类里的show方法就外部类名.内部类名 对象名 = new 外部类名.内部类名(),即Outer.Inner o = new Outer.Inner(),因为内部类就是相当于一个成员方法,所以这里外部类Outer不需要实例化就可以直接调用.Inner(),即new Outer.Inner();当我们要访问show2()方法时,直接Outer.Inner.show2(),因为都是静态的。

三. 局部内部类

局部内部类的定义在上面已经说过。

class Outer {
private int num = 10; public void method() {
class Inner {
public void show() {
System.out.println(num);
}
} Inner i = new Inner();
i.show();
}
} class InnerDemo {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}

在上例中可以看出:
局部内部类可以直接访问外部类的成员
在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
局部内部类还有一个重要的特点需要知道。那就是局部内部类访问局部变量时,局部变量需要用final关键字修饰。

class Outer{

    private int num = 10;
  Object method() {
final int num2 = 20;
class Inner {
public void show() {
System.out.println(num);
System.out.println(num2);
}
} Inner i = new Inner();
return i;
}
}

final关键字表示最终类型。如果不加final关键字,当函数执行完毕后,局部变量就消失了,但类产生的对象i是在堆上,这样对象就访问了一个不存在的变量。这是编译不通过的。这种矛盾是由局部内部类可以访问局部变量但是局部内部类对象和局部变量的生命周期不同而引起的。

Java学习--内部类(一)的更多相关文章

  1. java学习——内部类(一)

    内部类 把一个类放在另一个类中定义,这个定义在其他内部的类被称为内部类,包含内部类 的类被成为外部类,Java从JDK1.1开始引入了内部类的定义. 内部类的作用: 内部类提供了更好的封装,可以把内部 ...

  2. Java学习——内部类

    内部类的访问规则:1,内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有了 一个外部类的引用,格式 外部类名.this2,外部类要访问内部类,必须建立内 ...

  3. java学习——内部类(二)

    使用内部类 内部类一共有三种使用方法: 1.在外部类中使用内部类 在外部类中使用内部类,与平常使用内部类没有区别,可以直接通过内部类的类名来定义变量,通过new调用内部类的构造方法来创建实例. 唯一的 ...

  4. Java学习笔记之---内部类

    Java学习笔记之---内部类 (一)成员内部类 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化 内部类的访问修饰符可以任意,但是访问范围会受到影响 内部类可以直接访问外部类的成员, ...

  5. 【Java学习笔记之二十五】初步认知Java内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  6. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  7. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  8. 深入理解Java:内部类

    什么是内部类? 内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public ...

  9. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

随机推荐

  1. ThroughRain第一次冲刺(每天更新)

    第一次冲刺时间: 11月14-11月23 第一次冲刺目标及分配: 1.注册登录界面            认领:王大华 2.界面跳转                  认领:梁仕标 3.点餐界面   ...

  2. 补全Gemfile缺少到javascript gem

    如果缺少某个gem,查看并修改Gemfile文件 第一步要先修改源 source 'https://ruby.taobao.org' 下面补全这两个gem gem 'execjs' gem 'ther ...

  3. windows registry => control pannel

    User Variables HKEY_CURRENT_USER\Environment System Variables HKEY_LOCAL_MACHINE\SYSTEM\CurrentContr ...

  4. Mysql的基础使用之SQL原生语句的使用:表的 创建 删除 修改 (一)

    上一篇主要讲的是关于Mysql的分支MariaDB在Linux下的安装 顺利安装完成的小伙伴,就可以接着来试试SQL的魅力了 红色为命令 蓝色为自定义名 查看数据库 MariaDB [(none)]& ...

  5. Windows访问Ubuntu14.04远程桌面全攻略

    最近接到一个任务,在Ubuntu系统下开发一个串口读写程序.开发要在台式机上进行,安装UbuntuKylin 14.04,并且在串口连接了设备.个人使用的是笔记本电脑,系统是Windows8.1.自然 ...

  6. C# 自动Ping 测试服务器运行状况

    通过小程序自动Ping配置文件中的IP地址,间隔时间.IP地址.手机号码通过配置文件获得. 废话不多说,上代码. using Newtonsoft.Json; using Newtonsoft.Jso ...

  7. YbSoftwareFactory 代码生成插件【二十四】:MVC中实现动态自定义路由

    上一篇介绍了 公文流转系统 的实现,本篇介绍下MVC下动态自定义路由的实现. 在典型的CMS系统中,通常需要为某个栏目指定个友链地址,通过指定友链地址,该栏目的地址更人性化.方便记忆,也有利用于搜索引 ...

  8. gerrit add review标签

    添加verifyed标签 http://blog.csdn.net/terence427/article/details/16840697

  9. 取字符串拼音首字母(js)

    //取字符串拼音首字母 function makePy(str) { if (typeof(str) != "string") throw new Error(-1, " ...

  10. [译]Dynamics AX 2012 R2 BI系列-Cube概览

    https://msdn.microsoft.com/EN-US/library/dd252604.aspx     Cube是一个多维度的结构,它是BI应用开发的基础.本文描述了cube的组成部分, ...