java内部类的定义与分类示例详解

内部类

基本介绍

一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。是我们类的第五大成员,内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系

基本语法:

class Outer{

	class Inner{

	}

}

内部类的分类:

1.定义在外部类局部位置上(比如方法内):

1).局部内那类(有类名)

2).匿名内部类(没有类名,重点);

定义在外部类的成员位置上:

1)成员内部类(没用static 修饰)

2)静态内部类(使用static 修饰)

局部内部类的使用:

局部内部类记住三点会比较好学:

(1)局部内部类定义在方法中/代码块

(2)作用域在方法体或者代码块中

(3)本质仍然是一个类

说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名。

1.可以直接访问外部类的所有成员,包含私有的 如下演示

class Outer{
	private int num=99;
	private void f1(){
		System.out.println("真好");
	}
	{
		class Inner{
			public void k() {
				System.out.println(num);//可以直接访问到Outer类中的成员
				f1();//可以直接访问到Outer类中的成员
			}
		}
	}

}

2.不能添加访问修饰符,因为他的地位就是一个局部内部类,局部内部类是不能使用修饰符的,但是可以使用final修饰,因为局部变量也可以使用final

class Outer{
	private int num=99;
	private void f1(){
		System.out.println("真好");
	}
	{
        class Inner{//正确写法
			public void k() {
				System.out.println(num);
				f1();
			}
		}
	 	final class Inner{}//正确写法
        public class inner01{}//错误写法
        //总结除final外的任何修饰符,都是错误写法
	}

}

3.作用域:仅仅在定义他的方法或代码块中。

class Outer{
	private int num=99;
	private void f1(){
		System.out.println("真好");
	}
	{
		class Inner{
			public void k() {
				System.out.println(num);
				f1();
			}
		}
        Inner inner =new Inner();//正确写法
	}
    Inner inner =new Inner();//错误写法
	//总结出了方法或者代码块的作用域,都是错误写法因为找不到
}

4.局部内部类—访问—>外部类的成员[访问方式:直接访问]

class Outer{
	private int num=99;
	private void f1(){
		System.out.println("真好");
	}
	{
		class Inner{
			public void k() {
				System.out.println(num);//内部类可以直接访问到外部类的成员
				f1();
			}
		}
	}
}

5.外部类—访问—>局部内部类的成员 访问方式:创建对象,在访问(注意:必须在作用域内)

public class Usb {
	public static void main(String[] args) {
	}
}
class Outer{
	private int num=99;
	private void f1(){
		System.out.println("真好");
	}
	{
		class Inner{
			public void k() {
				System.out.println(num);
				f1();
			}
		}
        Inner inner=new Inner();//需要创建一个对象才可以访问内部类的成员,还必须时在他的作用域中创建
        inner.k();
	}
}

6.外部其他类–不能访问—>局部内部类(因为 局部内部类地位是一个局部变量)

public class Usb {
	public static void main(String[] args) {
        Inner inner=new Inner();//错误写法
	}
}
class Outer{
	private int num=99;
	private void f1(){
		System.out.println("真好");
	}
	{
		class Inner{
			public void k() {
				System.out.println(num);
				f1();
			}
		}
	}
}

7.如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

class Outer{
	private int num=99;
	private void f1(){
		System.out.println("真好");
	}
	{
		class Inner{
			private int num=9;
			public void k() {
				System.out.println(Outer.this.num);//类名.this可以找到这个类中的成员 this.可以找到类中的成员
				f1();
			}
		}
		Inner inner=new Inner();
		inner.k();
	}
}

匿名内部类:

匿名内部类的使用(重要)

(1)本质时类(2)内部类(3)该类没有名字(4)同时还时一个对象

说明:匿名内部类时定义在外部类的局部位置,比如方法中并且没有类名(表面没有名字,但是在底层系统还是给分配了名字的)

1.匿名内部类的基本语法

public class Test {
	public static void main(String[] args) {
		temp anonymous=new temp() {
			public void h1() {
				System.out.println("驱羊攻虎");
			}
		};
		anonymous.h1();
		System.out.println(anonymous.getClass());//输出匿名内部类的类名
	}
}
abstract class temp{
	public abstract void h1() ;
}

2.匿名内部类的语法比较奇特,请大家注意,因为匿名内部类既是一个类的定义同时他本身也是一个对象,因此从语法上看,他既有定义类的特征,也有创建对象的特征对前面代码分析可以看出这个特点,因此可以调用匿名内部类方法。

3.可以直接访问外部类的所有成员,包括私有的

public class Test {
    private static String str="以卵击石";
	public static void main(String[] args) {
		temp anonymous=new temp() {
			public void h1() {
				System.out.println("驱羊攻虎\r"+str);//可以直接访问外部类的所有成员,包括私有的
			}
		};
		anonymous.h1();
		System.out.println(anonymous.getClass());//输出匿名内部类的类名
	}
}
abstract class temp{
	public abstract void h1() ;
}

4.不能添加访问修饰符。因为他的地位就是一个局部变量而已。

5.作用域:匿名内部类与局部内部类一样 仅仅在定义它的方法或代码块中

6.匿名内部类----访问---->外部类成员[访问方式:直接访问]

7.外部其他类—不能访问---->匿名内部类(因为 匿名内部类地位是一个局部变量)

8.如果外部类和匿名内部类的成员重名时,匿名内部类访问的化,默认遵循就近原则,如果想要访问外部类的成员,则可以使用(外部类名.this.成员)去访问 如Test.this.str

成员内部类:

说明:成员内部类是定义在外部类的成员位置,并且没有static修饰

基本用法:

public class InnerClassTest {

    public class InnerClassA {

    }
}

1.可以直接访问外部类的所有成员,包含私有的

2.可以添加任意访问修饰符(public、protected、默认、private), 因为它的地位就事一个成员。

3.作用域:和外部类的其他成员一样,为整个类体,在外部类的成员方法中创建成员内部类对象,在调用方法。

4.成员内部类----访问---->外部类(比如:属性) [访问方式:直接访问](说明)

5.外部类—>访问---->内部类 (说明) 访问方式:创建对象,在访问

6.外部其他类----访问---->成员内部类

7.如果外部类和内部类的成员重名时,内部类访问的话,默认遵循就进原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

静态内部类的使用:

说明:静态内部类是定义在外部类的成员位置,并且有static修饰

public class InnerClassTest {

    static class InnerClassA {

    }

}

1.可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员

2.可以添加任意访问修饰符(public、protected、默认、private),因为它的地位就是一个成员

3.作用域:同其他成员,为整个类体

4.静态内部类—访问—>外部类(比如:静态属性)[访问方式:直接访问所有静态成员]

5.外部类—访问—>静态内部类 访问方式:创建对象、在访问

6.外部其他类—访问—>静态内部类

7.如果外部类和静态内部类的成员重名时,静态内部类访问的时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问

总结

到此这篇关于java内部类的定义与分类的文章就介绍到这了,更多相关java内部类定义与分类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JAVA 内部类详解及实例

    JAVA 内部类 一.什么是内部类? 一个类的定义放在另一个类的内部,这个类就叫做内部类 二.内部类有那些特性? 1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 . 2.内部类不能用普通的方式访问.内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 . 3.内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 . 三.内部类有哪几种? 1.成员内

  • java匿名内部类实例简析

    匿名类是不能有名称的类,所以没办法引用它们.必须在创建时,作为new语句的一部分来声明它们.这就要采用另一种形式的new语句,如下所示: new <类或接口> <类的主体> 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口.它还创建那个类的一个新实例,并把它作为语句的结果而返回.要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体.如果匿名类对另一个类进行扩展,它的主体可以访问类的成员.覆盖它的方法等等,这和其他任何标准的类都是一样

  • 老生常谈 java匿名内部类

    匿名内部类: 1.匿名内部类其实就是内部类的简写格式. 2.定义匿名内部类的前提: 内部类必须是继承一个类或者实现接口. 3.匿名内部类的格式:  new 父类或者接口(){定义子类的内容} 4.其实匿名内部类就是一个匿名子类对象.而且这个对象有点胖.    可以理解为带内容的对象. 5.匿名内部类中定义的方法最好不要超过3个. abstract class AbsDemo { abstract void show(); } class Outer { int x = 3; /* class I

  • java中匿名内部类详解

    java匿名内部类: 1:匿名内部类,匿名内部类也就是没有名字的内部类. 2:匿名内部类的作用 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写. 3:匿名内部类的实现 匿名内部类的两种实现方式:第一种,继承一个类,重写其方法:第二种,实现一个接口(可以是多个),实现其方法. 4:匿名内部类的创建 匿名类是不能有名称的类,所以没办法引用它们.必须在创建时,作为new语句的一部分来声明它们. package com.mianshi.test; /** * 类名称:Anonymou

  • 基于java内部类作用的深入分析

    提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦.学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地

  • java中关于内部类的使用详解

    内部类访问规则 •内部类可以直接访问外部类中的成员,包括私有.访问格式:外部类名.this•外部类要访问内部类必须创建内部类对象.•内部类在成员位置上,可以被成员修饰符修饰. 复制代码 代码如下: public class InnerClassDemo1 {     public static void main(String[] args){         Outer ou =new Outer();         ou.method();// 4  3         Outer.Inn

  • Java内部类之间的闭包和回调详解

    前言 闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象的引用,在此作用城内,内部类有权操作所有的成员,包括private成员. Java最引人争议的问题之一就是,人们认为Java应该包含某种类似指针的机制,以允许回调(callback).通过回调,对象能够携带一些信息,这些信息允许它在稍后的某个时刻调用初始的对象.如果回调是通

  • java内部类的定义与分类示例详解

    内部类 基本介绍 一个类的内部又完整的嵌套了另一个类结构.被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class).是我们类的第五大成员,内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系 基本语法: class Outer{ class Inner{ } } 内部类的分类: 1.定义在外部类局部位置上(比如方法内): 1).局部内那类(有类名) 2).匿名内部类(没有类名,重点); 定义在外部类的成员位置上: 1)成员内部类(没

  • Java中类的定义和初始化示例详解

    类的定义 类的定义格式 //创建类 class ClassName{ field ://成员属性/字段 method://方法 } class为定义类的关键字,ClassName为类的名字,{ }为类的主体: 例如: class Person{ public String name ; //成员属性 public int age; public void eat(){ // 方法 System.out.println("吃饭!"); } } 类的成员 类的成员包含,字段(成员变量),方

  • 简单了解Java方法的定义和使用实现详解

    这篇文章主要介绍了简单了解Java方法的定义和使用实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.概念 Java语言中的"方法"(Method)在其他语言当中也可能被称为"函数"(Function).对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到"随时任意使用",那么就可以将这些代码放在一个大括号"{}"当中,并且起一个名字.使用代码的时候,直接找到名

  • Java设计模式之建造者模式的示例详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 建造者模式的优势: 注意点 定义 建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象.建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可 以构建它们,用户不需要知道内部的具体构建细节. 案例 需求 女生每天化妆,假如只需要做发型,香水,衣服,并要求按照发型——>香水——>衣服的顺序进行,

  • Java设计模式之原型模式的示例详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 即实现了一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象的代价比较大时,则采用这种模式 案例 需求 张三要打印100000份照片 方案一 定义照片类 /** * 照片类 * @author:liyajie * @createTime:2022/2/15 11:47 * @version:1.0 */ @Data @AllArgsConstructor publi

  • Java设计模式之桥接模式的示例详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 定义 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”. 案例 需求 通过企业微信和qq的方式给员工发送消息 方案一 定义发送消息的接口 /** * 发送消息的接口 * @author:liyajie * @createTime:2022/2/21 10:33

  • Java设计模式之组合模式的示例详解

    目录 定义 原理类图 案例 需求 方案 分析 总结 定义 组合模式,又叫部分整体模式,它创建了对象组的数据结构(将对象组合成树状结构,用来表示部分整体的层级关系)组合模式使得用户对单个对象和组合对象的访问具有一致性 原理类图 Component :这是组合模式中的抽象构件,他里面定义了所有类共有的默认行为,用来访问和管理Component的子部件,Component可以是抽象类,也可以是接口 leaf :在组合模式中表示叶子节点,叶子节点没有子节点了,他是最末端存放数据的结构 Composite

  • Java设计模式之享元模式示例详解

    目录 定义 原理类图 案例 需求 方案:享元模式 分析 总结 定义 享元模式(FlyWeight Pattern),也叫蝇量模式,运用共享技术,有效的支持大量细粒度的对象,享元模式就是池技术的重要实现方式. 原理类图 Flyweight :抽象的享元角色,他是抽象的产品类,同时他会定义出对象的内部状态和外部状态 ConcreteFlyweight :是具体的享元角色,具体的产品类,实现抽象角色,实现具体的业务逻辑 UnsharedConcreteFlyweight :不可共享的角色,这个角色也可

  • Java实现HashMap排序方法的示例详解

    目录 简介 排序已有数据 按key排序 按value排序 按插入顺序存放 HashMap不按插入顺序存放 LinkedHashMap会按照插入顺序存放 简介 本文用示例介绍HashMap排序的方法. 排序已有数据 按key排序 使用stream进行排序(按key升序/降序) package org.example.a; import java.util.*; public class Demo { public static void main(String[] args) { Map<Stri

  • Java中枚举类的用法示例详解

    目录 1.引入枚举类 2.实现枚举类 3.枚举类的使用注意事项 4.枚举的常用方法 5.enum细节 1.引入枚举类 Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等. Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割. 示例: enum Color { RED, GREEN, BLUE; } 2.实现枚举类 接下来我们来看一个一个简单的DEMO示例: /** * java枚举 */ p

随机推荐