内部类概述

  • 把类定义在其他类的内部就称为内部类
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系统:Centos7环境搭建Redis单台和哨兵集群环境

    本文源码:GitHub·点这里 || GitEE·点这里 一.环境和版本 Linux:centos7 三台 三台Linux服务 192.168.72.129 192.168.72.130 192.16 ...

  2. Java入门系列之类继承、抽象类、接口(五)

    前言 C#和Java关于类.抽象类.接口使用方式基本相似,只是对应关键字使用不同罢了,本节呢,我们只是对照C#和Java中关于这三个概念在具体使用时,看看有哪些不一样的地方. 类继承 C#和Java在 ...

  3. ZooKeeper(五):事务处理之更新数据逻辑解析

    通过前些文章,我们已经完全从整体架构和数据接入方面理解了ZK的前情工作.接下来,我们就来看ZK的正式工作吧. 本文以 setData /a data 这个命令作为出发点,来观察zk是如何处理来自客户端 ...

  4. SpringCloud的入门学习之概念理解、Ribbon负载均衡入门

    1.Ribbon负载均衡,Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端.负载均衡的工具. 答:简单的说,Ribbon是Netflix发布的开源项目,主要功能 ...

  5. 架构视角 - DDD、TDD、MDD领域驱动、测试驱动还是模型驱动?

    提出问题 「领域驱动设计」之于微服务,好比麦当劳之于汉堡(个人更喜欢肯德基,汉堡要大些,麦当劳的汉堡,想吃顿饱饭,请先给我上6个

  6. PEMDAS 操作順序

    關於計算子 Operator 的操作順序,在"像計算機科學家一樣思考Python"這書 [1] 寫的明白扼要.它以 PEMDAS 這幾個簡單的英文字開頭表明: P (Parenth ...

  7. Violet音乐社区需求分析说明书

    目录 一.引言 1.1 编写目的 1.2 开发背景 1.3 开发工具 二.项目需求 2.1 角色定义 2.2 模块划分 2.3 功能概述 2.4 数据流图 三.前端页面 四.软件要求 4.1 性能要求 ...

  8. linux学习(七)Shell编程中的变量

    目录 shell编程的建立 shell的hello world! Shell的环境变量 使用和设置环境变量 Shell的系统变量 用户自定义变量 @(Shell编程) shell编程的建立 [root ...

  9. Redux API

    Redux API ​ Redux的API非常少.Redux定义了一系列的约定(contract),同时提供少量辅助函数来把这些约定整合到一起. ​ Redux只关心如何管理state.在实际的项目中 ...

  10. mock 模拟数据在框架中的简单使用

    首先在框架中需要安装mock模块 cnpm i mockjs -S 其次在src文件夹下新建mock文件夹,在mock文件夹中新建一个index.js文件 代码如下: const Mock = req ...