Java学习笔记(35)—— 内部类

这里将自己学习java及其应用的一些笔记、积累分享一下,如果涉及到了文章、文字侵权,请联系我删除或调整。


一、内部类

1.1 概述

  • 内部类:嵌套定义在类内部,或方法内部,或局部代码块内部的类
  • 可分为:

非静态内部类

静态内部类

局部内部类

匿名内部类

1.2 非静态内部类

class A {

      class Inner {

      }

}

  • Inner对象,必须依赖于外部对象才能存在
  • 不能独立创建对象
  • Inner 对象,属于一个 A 对象
  • 非静态内部类中,不能定义静态成员

​​​​​​​A a1 = new A()

A a2 = new A()

Inner i = a1.new Inner();

1.3 静态内部类

class A {

       static class Inner {

       }

}

  • 静态内部类,可以独立创建对象

Inner i = new Inner();

1.4 局部静态类

  • 定义在局部代码块中的类型,只能在局部使用

​​​​​​​​​​​​​​class A {

        Weapon f() {

                class Inner implements Weapon {

               }

              Inner i = new Inner();

             return i;

      }

}

A a = new A();

Weapon w = a.f();

1.5 匿名内部类

Weapon w = new Weapon() {};

  • 大括号:匿名类
  • new:新建匿名类的对象
  • Weapon:父类型
  • 小括号:super()super(参数)

​​​​​​​​​​​​​​​​​​​​​1.6 练习:静态内部类、非静态内部类

package 内部类;

import 内部类.A.Inner1;

/*
 *	内部类测试 
 */
public class Test1_静态类与非静态类 {
	public static void main(String[] args) {
		/*	相关内部类使用方法:
		 * 	1.	A.Inner1;外部类类名.内部类名-调用
		 * 	2.	Inner1;先加载对应的类,通过类名可直接调用
		 */
		Inner1 d1 = new Inner1();// 通过方法1使用内部类
		System.out.println(d1);// 默认调用toString,显示地址
		
		/*
		 *	非静态内部类的使用方法与上述一样
		 */
		A a1 = new A();
		A a2 = new A();
		A.Inner2 d2 = a1.new Inner2();// 通过方法2使用内部类
		System.out.println(d2);
		
	}
}

class A{
	static class Inner1{
		
	}
	
	class Inner2{
		
	}
}

1.7 练习:局部内部类

package 内部类;

public class Test2_局部内部类 {
	public static void main(String[] args) {
		Weapon w1 = f1();// f1()方法代码中定义局部内部类并实现了Weapon接口,返回其对象
		System.out.println(w1);
		// 内部类.Test2_局部内部类$1AK47@659e0bfd
		/* 其中,内部类的类名被编译为“Test2_局部内部类$1AK47”,
		 * 其中,$1是编译器添加的内部类的编号*/
		w1.kill();
		System.out.println("-------------------------------------");
		
		Weapon w2 = f2("青龙偃月刀");// f2()方法,得到指定名字的武器
		System.out.println(w2);
		w2.kill();
	}

	// 局部内部类,匿名类实现
	private static Weapon f2(final String name) {// 局部内部类中,使用外面的一个局部变量,必须加final(1.8版本后缺省)
		// 匿名类-不命名的类,只用大括号括起来
		/* 匿名类的声明,在定义的同时新建对象:
		 * 	类名/接口 引用变量名 = new 父类/父接口(){...};
		 *	其中,	new 新建一个匿名类对象
		 *			父类/父接口,表示继承的类或接口
		 *			()表示调用父类构造方法,super()或super(参数);
		 *			{...}表示匿名类
		 *			;不能少,因为是赋值语句
		 */
		Weapon w = new Weapon(){
			@Override
			public void kill() {
			// 局部内部类中,使用外面的一个局部变量,必须加final(1.8版本后缺省)
				System.out.println("使用"+name+"攻击!");
			}
		};
		return w;
	}
	
	// 局部内部类,显示定义
	private static Weapon f1() {
		class AK47 implements Weapon{
			@Override
			public void kill() {
				System.out.println("AK47");
			}
		}
		// 局部的类,只能在局部使用
		// 但是他的对象,可以作为父类型向外传递
		AK47 ak = new AK47();
		return ak;
	}
}

1.8 练习:匿名内部类

ArrayList集合中存放一组数字格式的字符串, 并进行自定义的排序。例如"1" ,"10" ,"11" ,"2" ,"20" ,"21" ,"3"。

package 内部类;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Test3 {
	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		// 一次向list添加多个值
		Collections.addAll(list, 
		/* Collections.addAll(c, elements)
		* 向集合c添加内容elements,其中elements可以包含多个数据 
		*/
				"1","4","7","21","6","54",
				"41","53","12","76","16","34",
				"43","56","111","234","15","90");
		System.out.println(list);//默认toString
		Collections.sort(list);
		System.out.println("默认排序(字符编码):"+list);
		
		// 为Collections.sort()添加Comparator<T>接口子类对象,指定具体比较方法
		Comparator<String> c = new Comparator<String>() {// 定义匿名类并new对象
			@Override
			public int compare(String o1, String o2) {
				int a = Integer.parseInt(o1);
				int b = Integer.parseInt(o2);
				return a-b;
				}
		};
		// 利用实现接口的类对象,重新排序
		Collections.sort(list, c);
		/*
		 *	比较器对象c被传递到sort()方法内部,
		 *	在sort()内部会调用c.compareTo(...)
		 *	并根据该方法结果来判断数据的大小
		 */
		System.out.println("排序器:"+list);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值