内部类概述

  • 把类定义在其他类的内部就称为内部类
class A{

	class B{

	}

}

B就称为内部类,A称为外部类。

  • 内部类的访问特点

    1. 内部类直接访问外部类成员,包括私有。
    2. 外部类要访问内部类要创建对象。
    3. 内部类可用static修饰,它可以看作外部类的成员。
  • 内部类的位置

    1. 成员位置:在成员位置定义的类,称为成员内部类。

    2. 局部位置:在局部位置定义的类,称为局部内部类。

      class Outer{
      
      	private int num = 10;
      
      	//成员内部类
      
      	class Inner1{
      
      	}
      
      	public void method(){
      
      		//局部内部类
      
      		class Inner2{
      
      		}
      
      	}
      
      }
      
      

    • 成员内部类

      • 访问方式:外部类名.内部类名 对象名 = 外部类对象.内部类对象 (因为一般非静态成员可只能通过对象访问)

        Outer.Inner obj = new Outer().new Inner();

      • 修饰符

        private :保证数据的安全行。

        static :为了方便访问数据。

        注意:静态内部类访问外部成员时,只能访问外部的静态成员。

        此时访问内部类的方式为:外部类名.内部类名 对象名 = new 外部类名.内部类名(); (因为静态成员可直接通过类名访问)

        eg: Outer.Inner obj = new Outer.Inner();

      • 注意:

        1.内部类与外部类没有继承关系。

        2.内部类若要访问外部类的非静态成员,要通过外部类名限定this对象。(Outer.this)

        class Outer{
        
        	public int num = 10;
        
        	class Inner1{
        
        		public int num = 20;
        
        		public void show(){
        
        			int num = 30;
        
        			System.out println(num);
        
        			System.out println(this.num);
        
        			System.out println(outer.this.num);
        
        		}
        
        	}
        
        }

        out:

        30

        20

        10

    • 局部内部类

      1.可直接访问外部类的成员。

      2.在局部位置,可创建内部类对象,通过对象调用内部类的方法,来使用局部内部类的功能。

      • 局部内部类访问局部变量的注意事项:

        1.局部内部类访问的局部变量必须要被final修饰。

        2.原因:局部变量随着方法的调用而调用,方法调用完毕就消失。而堆内存的内容不会立即消失,所以,要用final修饰局部变量。加入final修饰后,所有调用这个变量的地方就变成常量数据,常量在内存中存在是固定的,故即使局部变量随着方法调用而消失,数据依旧存在。

        class Outer{
        
        	private int num1 = 10;
        
        	public void method(){
        
        		//局部内部类
        
        		final int num2 = 20;
        
        		class Inner{
        
        			public void show(){
        
        				System.out.println(num1);
        
        				//从内部类访问本地变量num2;num2需要被申明为最终类型。
        
        				System.out.println(num2);
        
        			}
        
        		}
        
        	}
        
        }
        
        
  • 匿名内部类

    内部类的简化写法

    前提:存在一个类(抽象类)或接口。

    格式:

    ​ new 类名(抽象类名)或接口名(){

    ​ 重写方法;

    ​ }

    本质:是一个继承该类或实现改接口的子类的匿名对象。

    interface Inter {
    public abstract void show();
    public abstract void show2();
    } class Outer {
    public void method() {
    new Inter(){
    public void show() {
    System.out.println("show");
    }
    //只调用一个匿名内部类的方法时直接在new出的对象后面加要调用的方法名。
    }.show();
    //若要调用匿名内部类的多个方法则把匿名内部类变成有名的。(通过多态)
    Inter i = new Inter(){
    public void show() {
    System.out.println("show");
    }
    public void show2() {
    System.out.println("show2");
    }
    }
    i.show();
    i.show2();
    }
    }
    class Main {
    public static void main(String[] args) {
    Outer o = new Outer();
    o.method();
    }
    }
    • 匿名内部类的应用
    interface Inter {
    public abstract void show();
    } class InterTest {
    //接口作为形参,要的不是接口而是接口的实现类
    public void method(Inter p) {
    p.show();
    }
    } class InterImp implement Inter {
    public void show() {
    System.out.println("show");
    }
    } class Outer {
    public static void main(String[] args) {
    InterTest it = new InterTest();
    Inter i = new InterImp();
    it.show(); //匿名内部类在开发中的使用
    //匿名内部类的本质是继承该类或实现改接口的子类的匿名对象。
    //作用:方法结束匿名内部类就被回收节省资源。
    it.show(new Inter() {
    public void show() {
    System.out.println("show");
    }
    });
    }
    }
    • 匿名内部类的案例

    补齐代码:

    interface Inter { void show();}

    class Outer {

    //补齐代码

    }

    class Main {

    public static void main(String[] args){

    Outer.method().show();

    }

    }

    //要求输出“hello world”

 interface Inter { void show();}

 class Outer {
//补齐代码
public static Inter method(){
return new Inter(){
public static void show(){
System.out.println("hello world");
}
};
}
} class Main {
public static void main(String[] args){
Outer.method().show();
//由Outer.method()可以看出method()为静态方法,而Outer.method().show();
//则说明method()方法的返回值类型为Inter所以
}
}

Javase之内部类概述的更多相关文章

  1. JAVA基础之内部类

    JAVA基础之内部类 2017-01-13 1.java中的内部类都有什么?! 成员内部类 局部内部类 匿名内部类 静态内部类 2.内部类详解 •成员内部类 在一个类的内部再创建一个类,成为内部类 1 ...

  2. JavaSE(七)之内部类

    上一篇我们学习了接口还有访问控制,在以后的工作中接口是我们经常要碰到的,所以一定要多去回顾.接下来介绍一下内部类.很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次 这个时候我们就可以使 ...

  3. JavaSE 学习笔记之内部类(九)

    内部类:如果A类需要直接访问B类中的成员,而B类又需要建立A类的对象.这时,为了方便设计和访问,直接将A类定义在B类中.就可以了.A类就称为内部类.内部类可以直接访问外部类中的成员.而外部类想要访问内 ...

  4. Java 之内部类

    概述 内部类修饰符 内部类的细节 局部内部类 匿名内部类及其应用 匿名内部类细节 内部类概述 将一个类定义在另一个类的里面, 里面的那个类就称为内部类(内置类, 嵌套类). class Outer { ...

  5. java之内部类(InnerClass)----非静态内部类、静态内部类、局部内部类、匿名内部类

    提起java内裤类(innerClass)很多人不太熟悉,实际上类似的概念在c++里面也有,那就是嵌套类(Nested Class),关于这俩者的区别,在下文中会有对比.内部类从表面上看,就是在类中定 ...

  6. ThinkInJava之内部类

    一:内部类概述 将一个类的定义放在另一个类的内部,这就是内部类.内部类是Java一种非常有用的特征,因为他允许你把一些逻辑相关的数据组织在一起,并控制它的可见性. 二:内部类的创建 我们都知道类的创建 ...

  7. Java类成员之内部类

    内部类含义: 在Java中允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类. Inner class 一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称. Inner ...

  8. Java系列之内部类

    今天温习一下 Java 中的内部类,内部类一般有如下几种:静态内部类.成员内部类.匿名内部类和方法内部类,下文中将主要介绍静态内部类和成员内部类,主要内容如下: 概述 静态内部类 成员内部类 匿名内部 ...

  9. JavaSE(一) 语言概述

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 目录 1 基础常识 2 Java语言版本迭代概述 3 Java语言应用的领域 4 Java语言的特点 5 ...

随机推荐

  1. Linux系统目录结构知识

    1.Linux目录结构: 逻辑上所有的目录只有一个顶点 /(根),所有目录的起点.根下面是一个类似倒挂的树的层次结构. 目录的结构和分区设备是没有关系的,也就是不同的目录可以跨越不同的磁盘设备或分区. ...

  2. PostgreSQL学习之路一

    PostgreSQL的扩展PostGIS是最著名的开源GIS数据库. 安装PostgreSQL是第一步. 1.下载PostgreSQL的二进制安装文件 PostgreSQL官网–>Downloa ...

  3. ASP.NET MVC教程六:两个配置文件详解

    前言 在新建完一个MVC项目之后,你会发现整个整个项目结构中存在有两个web.config文件,如下图所示: 这两个配置文件,一个位于项目的根目录下面,一个位于Views文件夹下面,这两个配置文件有什 ...

  4. Wpf Dispatcher.BeginInvoke((Action)delegate{}));

    <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/w ...

  5. Web前端基础(14):jQuery基础(一)

    1. jQuery概述 1.1 为什么要使用jQuery 在用js写代码时,会遇到一些问题: window.onload 事件有事件覆盖的问题,因此只能写一个事件. 代码容错性差. 浏览器兼容性问题. ...

  6. JS Switch

    JS Switch switch 语句用于基于不同的条件来执行不同的动作. switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; defa ...

  7. [PHP] 循环查看php-fpm的内存占用情况

    在webmail的业务中进行发信,如果携带了附件,会把附件拼接内嵌到邮件正文里,这时会极大的占用内存,可以使用以下命令查看fpm的进程内存占用 ps --no-headers --sort -rss ...

  8. 004.MongoDB数据库基础使用

    一 数据库管理 1.1 创建数据库 [root@uhost ~]# mongo --host 172.24.9.225 --port 27017 -u useradmin -p useradmin & ...

  9. 实战项目-用例评审-问题总结-Dotest-董浩

    实战项目-用例评审-问题总结 内部班项目用例评审,总结的问题:供大家参考!提升用例最好的方式,可以互相执行下(评审),就会明白自己的差距或者需要避免的点在哪里.(前提是会) 1)覆盖率 原型中提到的一 ...

  10. springmvc+hibernate+layui+Jackson开发的一个小例子

    今天用springmvc+hibernate+layui开发了一个增删改查的例子,运行效果如下图: 下面是spring-servlet.xml的配置文件 主要的一些文件路径 数据库一张表,user表, ...