Java基础-学习笔记(十)——内部类(嵌套类)

1、内部类的含义

在一个类的内部再定义一个类,就叫做嵌套类。被嵌套的类(内部类)可以直接访问嵌套它的类(外部类)的成员函数和属性,哪怕是私有的。但是反过来就不行,外部的类不能直接访问内部类的成员。

也就是说:

1)内部类可以直接访问外部类的成员

2)外部类不可以直接访问内部类的成员,需要先创建内部类的对象,又该对象来调用内部类的成员和方法。

内部类的定义和普通类没什么区别,不过和外部类不一样的是,它可以被protected和private进行修饰

 1 class Outer
 2 {
 3     int out_i=33;
 4     void test()
 5     {
 6         Inner in = new Inner();
 7         in.display();
 8     }
 9     class Inner
10     {
11         void display()
12         {
13             System.out.println("the out_i is "+out_i);
14         }
15     }
16 }
17 class TestOuter
18 {
19     public static void main(String [] args)
20     {
21         Outer obj=new Outer();
22         obj.test();
23     }
24 }
25 /*
26 F:\java_example>java TestOuter
27 the out_i is 33*/

首先调用这个display()函数打印出out_i时,它首先会在display()函数中找是否有该变量,没有就到Inner类中去找,最后再到Outer类中找该变量

2、内部类的用途

内部类使程序代码更为紧凑,更具模块化。

当A类中的程序代码要用到B类的实例对象,而B类中的程序代码又要访问A类中的成员.将B类作为A的内部类,代码要容易编写很多。

如果我们把内部类Inner,直接拿到外面来,还是要实现这个功能,通过在Outer类中生成Inner对象来调用其display方法,输出outer类的成员变量out_i。代码如下所示:

class Outer
{
    int out_i=33;
    void test()
    {
        Inner in = new Inner(this);
        in.display();
    }

}
class Inner
    {

        Outer outer;
        public Inner(Outer outer)
        {
            this.outer=outer;
        }
        void display()
        {
            System.out.println("the out_i is "+outer.out_i);
        }
    }
class TestOuter
{
    public static void main(String [] args)
    {
        Outer obj=new Outer();
        obj.test();
    }
}
/*
F:\java_example>java TestOuter
the out_i is 33*/

3、外部程序引用内部类

 1 class Outer
 2 {
 3     int out_i=33;
 4     void test()
 5     {
 6         Inner in = new Inner();
 7         in.display();
 8     }
 9 public class Inner
10     {
11         int inner_i=3;
12         void display()
13         {
14             System.out.println("the out_i is "+out_i);
15         }
16     }
17 }
18 class TestOuter
19 {
20     public static void main(String [] args)
21     {
22         Outer obj=new Outer();
23         //obj.test();
24         Outer.Inner in = obj.new Inner();
25         System.out.println("the inner_i_i is "+in.inner_i);
26     }
27 }
28 /*
29 F:\java_example>java TestOuter
30 the inner_i_i is 3*/

内部类声明为public,在外部可以创建其外部类Outer的实例对象,再通过外部类Outer的实例对象创建Inner类的实例对象,最后通过Inner类的实例对象来调用其成员。

4、内部类用static修饰

内部类用static修饰后,就相当于是外部类了,不再是内部类

5、内部类并非只能在类中定义,也可以在几个程序块的范围之类定义内部类。例如,在方法中,甚至在for循环体内部都可以嵌套

在方法中定义的内部类只能访问方法中的final类型的局部变量,因为局部变量的作用域只在这个方法内,我们在外部程序调用时,这个局部变量内存已经被收回,所以需要用final修饰,final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期

 1 class Outer
 2 {
 3     int out_i=33;
 4     void test()
 5     {
 6         final int x=2;
 7         class Inner
 8         {
 9             int inner_i=3;
10             void display()
11             {
12                 System.out.println("the out_i is "+out_i+" and x is "+x);
13             }
14         }
15         Inner in = new Inner();
16         in.display();
17     }
18
19 }
20 class TestOuter
21 {
22     public static void main(String [] args)
23     {
24         Outer obj=new Outer();
25         obj.test();
26     }
27 }
28 /*
29 F:\java_example>java TestOuter
30 the out_i is 33 and x is 2*/

时间: 2024-10-10 16:20:16

Java基础-学习笔记(十)——内部类(嵌套类)的相关文章

Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类

final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢?要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变.final是个修饰符,它可以用来修饰类,类的成员,以及局部变量. final的特点 final修饰类不可以被继承,但是可以继承其他类. class Yy {} final clas

Java基础学习笔记十九 IO

File IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据读出来继续使用呢?其实要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘.光盘.U盘等)上. 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作.当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作.因此我们把这种输入和

Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权限修饰符,默认访问, 类,方法,成员变量 private 权限修饰符,私有访问, 方法,成员变量 static 静态修饰符 方法,成员变量 final 最终修饰符 类,方法,成员变量,局部变量 abstract 抽象修饰符 类 ,方法 我们编写程序时,权限修饰符一般放于所有修饰符之前,不同的权限修饰

Java基础学习笔记十五 集合、迭代器、泛型

Collection 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. 集合中存储的元素必须是引用类型数据 集合继承关系图 ArrayList的继承关系: 查看ArrayList类发现它继承了抽象类AbstractList同时实现接口List,而List接口又继承了Collection接口.Collec

Java基础学习笔记十八 异常处理

什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 异常的继承体系 在Java中使用Exception类来描述异常. 查看API中Exception的描述,Exception 类及其子类是 Throwable 的一种形式,它用来表示java程序中可能会产生的异常,并要求对产生的异常进行合理的异常处理. Exception有继承关系,它的父类是Throwable.Thr

Java基础学习笔记十四 常用API之基本类型包装类

基本类型包装类 Java中有8种基本的数据类型,可是这些数据是基本数据,想对其进行复杂操作,变的很难.怎么办呢?在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类型,考试成绩需要转换成double类型等.那么,想实现字符串与基本数据之间转换怎么办呢?Java中提供了相应的对象来解决该问题,基本数据类型对象包装类:java将基本数据类型值封装成了对象.封装成对象有什么好处?可以提供更多

Java基础学习笔记十六 集合框架(二)

List List接口的特点: 它是一个元素存取有序的集合.例如,存元素的顺序是11.22.33.那么集合中,元素的存储就是按照11.22.33的顺序完成的. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理). 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素. List接口的常用子类有: ArrayList集合 LinkedList集合 List接口的特有方法(带索引的方法)1.增加元素方法 add(Object e):向集合末尾

JAVA基础学习笔记(2)

看了几天的视频了,都没时间来写下学习笔记,今天来写下第二次的学习笔记,前几天看的给忘记了,就写最新看到的吧 主要内容:1.类的变量与函数(方法) 2.对象的存储方式 3.新建一个对象及对象的赋值与调用 4.空对象 5.匿名对象 1.类的变量与函数(方法) class Dog      //类名 { String name;  //变量的声明 int age; String color; void bark()   //方法的定义(返回值为空,不带参数) { System.out.println(

java基础学习笔记day01

java基础学习笔记day01 1.软件开发: 软件:按照特定顺序组织的计算机数据和指令的集合 开发:软件的制作过程 软件开发:借助开发工具和计算机语言制作软件 2.java概述: java之父:詹姆斯·高斯林 JDK:java开发环境 jre:java运行环境 JVM:java虚拟机 java跨平台是因为,JVM能在不同的平台运行,JVM是跨平台的 JavaSE:标准版 JavaME:手机端,物联网 JavaEE:企业版,互联网项目 3.java语言特点: 简单性 解释性 面向对象 高性能 分

Java基础学习笔记

File 的高级获取功能 String[] list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录 示例 import java.io.File; class FileDemo9 { public static void  main(String[] args) { //获取E:下所有目录或者文件名称 File file=new  File("E:\\");//1.构建文件对象 String[]  fileNames=file.list();//2.获取E