
Java 内部类的几种分类
发布日期:2021-05-10 13:30:48
浏览次数:17
分类:精选文章
本文共 3608 字,大约阅读时间需要 12 分钟。
目录
一,内部类
概述:
内部类可以直接访问外部类的成员,包括私有的;外部类要访问内部类的成员,必须先创建对象;
内部类创建对象:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
二,普通内部类
没有static修饰,且定义在外部类的类体中
特点:
1.普通内部类中的方法可以直接使用外部类的实例变量和实例方法。
2.在常规内部类中可以直接用内部类创建对象
public class OuterClass { private int num = 100; public static void main(String[] args) { OuterClass.InnerClass in = new OuterClass().new InnerClass(); in.test(); } private void print(){ System.out.println("外部类的私有方法"); } private void makeInner(){ //在外部类方法中创建内部类实例 InnerClass in2 = new InnerClass(); in2.test(); } class InnerClass { public void test(){ print(); System.out.println(num); System.out.println("普通内部类"); } }}
三,私有内部类
内部类使用private修饰
public class OuterClass2 { private int num = 10; private class InnerClass2{ public void test(){ System.out.println(num); System.out.println("普通内部类"); } } //私有内部类的使用 public void outerMethod(){ InnerClass2 ic = new InnerClass2(); ic.test(); }}
使用私有内部类:
public class Demo { public static void main(String[] args) { OuterClass2 oc =new OuterClass2(); oc.outerMethod(); }}
四,静态内部类
内部是使用static修饰,不能直接访问外部类的实例变量与实例方法,只有通过对象引用才能访问。
public class OuterClass3 { public void print(){ System.out.println("外部类OuterClass3"); } public static void hello(){ System.out.println("外部类的静态方法"); } /*由于static内部类不具有任何对外部类实例的引用, 因此static内部类中不能使用this关键字来访问外部类中的实例成员, 但是可以访问外部类中的static成员。这与一般类的static方法相通*/ static class InnerClass1{ public void test1(){ System.out.println("内部类InnerClass1"); new OuterClass3().print(); hello(); } } static class InnerClass2{ public static void test2(){ System.out.println("内部类InnerClass2"); new OuterClass3().print(); hello(); } }}
静态内部类的使用:
public static void main(String[] args) { OuterClass3.InnerClass1 ic1 = new OuterClass3.InnerClass1(); ic1.test1(); //使用静态内部类中静态方法 OuterClass3.InnerClass2.test2();}
五,局部内部类
在方法体或语句块(包括方法、构造方法、局部块或静态初始化块)内部定义的类
定义局部内部类是需注意以下几点:
1,方法定义局部内部类同方法定义局部变量一样,不能使用private、protected、public等访问修饰说明符修饰,也不能使用static修饰,但可以使用final和 abstract修饰
2,方法中的内部类可以访问外部类成员。对于方法的参数和局部变量,必须有final修饰才可以访问。原因:当调用有局部内部类的方法时,局部变量或者方法参数没有final修饰,它的生命周期和方法的生命周期一样,当方法弹栈时这个局部变量也会消失,那么如果局部内部类对象还没有马上消失,想使用这个局部变量或者方法参数,就没有了;如果使用final修饰会在类加载的时候进入常量池,即使方法弹栈常量池中的常量还在,也可以继续使用;
3,static方法中定义的内部类可以访问外部类定义的static成员
public class OuterClass4 { public void method(){ //局部内部类不能加任何访问修饰符,因为它只对局部块有效。 class Inner{ public void test(){ System.out.println("局部内部类中的方法"); } } //局部内部类的使用 Inner i = new Inner(); i.test(); }}
六,匿名内部类
类似内部类的简化写法,格式:new 类名或者接口名(){};
public class OuterClass5 { class InnerClass implements Inter{ public void print() { // TODO Auto-generated method stub System.out.println("内部类"); } } public void test(){ //实现Inter接口的匿名内部类 new Inter() { public void print() { // TODO Auto-generated method stub System.out.println("实现了一个接口的匿名内部类"); } }.print(); //继承User类的匿名内部类 new User(){ public void login() { // TODO Auto-generated method stub System.out.println("继承一个类的匿名内部类"); } }.login(); //父类引用指向子类对象,把匿名内部类对象赋值实现的接口 Inter i = new Inter() { public void print() { // TODO Auto-generated method stub System.out.println("实现接口的匿名内部类对象,并赋值给Inter接口"); } }; i.print(); }}class User{ public void login(){ System.out.println("用户登录"); }}interface Inter{ public void print();}
匿名内部类当作参数使用
public class OuterClass6 { public static void main(String[] args) { DemoBook db = new DemoBook(); db.readBook(new Book() { public void read() { // TODO Auto-generated method stub System.out.println("Android类的书"); } });//匿名内部类当作参数使用 }}abstract class Book{ public abstract void read();}class DemoBook{ public void readBook(Book b){ b.read(); }}
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月26日 21时34分13秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
spring-boot-2.0.3之redis缓存实现,不是你想的那样哦!
2021-05-09
httprunner学习23-加解密
2021-05-09
jenkins学习13-凭据管理(删除多余的凭据)
2021-05-09
有道云笔记 同步到我的博客园
2021-05-09
阿里云“网红"运维工程师白金:做一个平凡的圆梦人
2021-05-09
AnalyticDB for PostgreSQL 6.0 新特性介绍
2021-05-09
Alibaba Cloud Linux 2 LTS 正式发布,提供更高性能和更多保障!
2021-05-09
李笑来必读书籍整理
2021-05-09
vue书籍整理
2021-05-09
记Java中有关内存的简单认识
2021-05-09
Mybatis配置解析
2021-05-09
http头部 Expect
2021-05-09
Hadoop(十六)之使用Combiner优化MapReduce
2021-05-09
C#实现outlook自动签名
2021-05-09
《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
2021-05-09
CoreCLR源码探索(八) JIT的工作原理(详解篇)
2021-05-09
使用promise封装wx:requset()
2021-05-09
LeetCode 637 二叉树的层平均值-简单
2021-05-09