Java学习个人备忘录之内部类
内部类: 将一个类定义在另一个类的里面,对里面那个类就称为内部类.
class Outer
{
private int num = 3;
class Inner //它想访问Outer中的num, 如果在外面就需要创建一个对象,然后通过公开的接口访问,但是现在Outer内部, 就可以直接访问了.这样方便
{
void show()
{
System.out.println("show run..." + num);
}
}
//如果现在想访问Inner就需要这样
public void method()
{
Inner in = new Inner();
in.show();
}
//内部类由于在内部, 相当于定义在了成员的位置上, 所以可以用成员修饰符, 如:
//private class Test{}
static class Inner
{
static void function()
{
System.out.println("function run......"+num);
}
}
}
内部类访问特点:
1. 内部类可以直接访问外部类中的成员.
2. 外部类要访问内部类, 必须建立内部类的对象.
一般用于类的设计。
分析事物时, 发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容。
这时就把还有的事物定义成内部类来描述。
class InnerClassDemo
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method();
//直接访问外部类中的内部类中的成员.
Outer.Inner in = new Oouter().new Inner();
in.show();
//如果内部类是静态, 那就相当于一个外部类了.
Outer.Inner in = new Outer.Inner();
in.show();
//如果内部类是静态的,成员是静态的.
Outer.Inner.function(); //如果内部类中定义了静态成员,该内部类也必须是静态的. }
}
细节
class Outer
{
int num = 3;
class Inner
{
int num = 4;
void show()
{
int num = 5;
System.out.println(num);//5
System.out.println(this.num);//4
System.out.println(Outer.this.num);//3
}
}
void method()
{
new Inner().show();
}
} class InnerClassDemo2
{
public static void main(String[] args)
{
new Outer().method();
}
}
为什么内部类能直接访问外部类中成员呢?
那是因为内部类持有了外部类的引用-----外部类名.this
内部类可以存放在局部位置上
class Outer
{
int num = 3;
Object method()
{
final int x = 9;
class Inner
{
void show()
{
System.out.println("show..."+num);
}
}
Object in = new Inner();
return in;//0x0045
}
}
class InnerClassDemo3
{
public static void main(String[] args)
{
Outer out = new Outer();
Object obj = out.method();//0x0045
}
}
内部类在局部位置上只能访问局部中被final修饰的局部变量。
匿名内部类, 就是内部类的简写格式.
必须有前提:
内部类必须继承或者实现一个外部类或者接口.
匿名内部类: 其实就是一个匿名子类对象.
格式: new 父类or接口(){子类内容}
abstract class Demo
{
abstract void show();
} class Outer
{
int num = 4;
class Inner extends Demo //这是正常情况
{
void show()
{
System.out.println("show...."+num);
}
}
public void method()
{
new Demo()//这个就叫匿名内部类
{
void show()
{
System.out.println("show...."+num);
}
}
}
}
匿名内部类的应用
interface Inter
{
void show1();
void show2();
} class Outer
{
public void method()
{
new Inter()
{
public void show1()
{}
public void show2()
{}
}.show1(); //调用了show1的方法, 相当于 new Inner().show1(); //或者用下面的方法
Inter in = new Inter()
{
public void show1()
{}
public void show2()
{}
}
in.show1();
in.show2();
}
}
通常的使用场景之一:
当函数参数是接口类型时,而且接口中的方法不超过三个.
可以用匿名内部类作为实际参数进行传递.
class InnerClassDemo5
{
public static void main(String[] args)
{
show(new InterImpl());
}
public static void show(Inter in)
{
in.show1();
in.show2();
}
}
class InterImpl implements Inter
{
}
对象的初始化过程
class Fu
{
int num = 9;
{
System.out.println("Fu");
} Fu()
{
super();
//显示初始化
//构造代码块初始化
show();
}
void show()
{
System.out.println("fu show..."+num); //被覆盖,运行子类
}
}
class Zi extends Fu
{
int num = 8;
{
System.out.println("Zi");
}
Zi()
{
super();
//显示初始化
//构造代码块初始化
show();
}
void show()
{
System.out.println("zi show..."+num);
}
} class Inner
{
public static void main(String[] args)
{
new Zi();
}
}
/*
Fu
zi show...0
Zi
zi show...8
*/
Java学习个人备忘录之内部类的更多相关文章
- java面向对象、构造方法 之内部类
UML类图 UML Unified Modeling Language (UML)又称统一建模语言或标准建模语言 在一个类中 属性表示这类事物的性质(描述它的数据) 方法表示这类 ...
- Java学习个人备忘录之线程间的通信
线程间通讯多个线程在处理同一资源,但是任务却不同. class Resource { String name; String sex; } //输入 class Input implements Ru ...
- Java学习个人备忘录之多线程
进程:正在进行中的程序(直译). 线程:就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中可以有多个执行路径,称之为多线程. 一个进程中至少要有一个线程. 开启多个线程是为了同时运行多部分代 ...
- Java学习个人备忘录之异常
概述 异常:是在运行时期发生的不正常情况. 在java中用类的形式对不正常情况进行了描述和封装对象. 描述不正常的情况的类,就称为异常类. 以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问 ...
- Java学习个人备忘录之接口
abstract class AbsDemo { abstract void show1(); abstract void show2(); } 当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类 ...
- Java学习个人备忘录之继承
继承的好处1. 提高了代码的复用性.2. 让类与类之间产生了关系,给第三个特征多态提供了前提. java中支持单继承,不直接支持多继承,但对C++中的多继承机制进行改良.java支持多层继承. C继承 ...
- Java学习个人备忘录之文档注释
文档注释 单行注释用 // 多行注释有两种,第一种是 /* 内容 */,第二种是/** 内容 */. 这两种多行注释的区别是/** 内容 */这种注释可以生成一个该文件的注释文档,下面是演示代码. A ...
- Java学习个人备忘录之数组工具类
下面主要讲解一个针对数组操作的工具类. a.java -- 工具类文件 //按理来说要先编译本文件, 然后再编译主函数 class ArrayTool { /* 获取整型数组的最大值 */ publi ...
- Java学习个人备忘录之关键字static
被static标记的东西会放在内存中被共享的,对象用到时,就会来取的. class Person { String name; //成员变量,实例变量 static String country = ...
随机推荐
- JavaBen 中 如何将字段设置为 "text" 文本类型
@Lob @Column(name="FEEDBACK_MESSAGE",columnDefinition="TEXT", nullable=true) pub ...
- 关于Hibernate基于version的乐观锁
刚刚接触SSH框架,虽然可能这个框架已经比较过时了,但是个人认为,SSH作为一个成熟的框架,作为框架的入门还是可以的. 马马虎虎学完了Hibernate的基础,总结一点心得之类的. 学习Hiberna ...
- systemd的新特性及常见的systemd unit类型分析
systemd概述 )systemd是一种新的linux系统服务管理器,用于替换init系统,能够管理系统启动过程和系统服务,一旦启动起来,就将监管整个系统.在centos7系统中,PID1被syst ...
- jsp页面通过EL表达式获取list大小兼容性处理
1.jsp页面通过EL表达式获取list大小,中间件用tomcat7时,下面这个写法是可以的 <input id="test" type="hidden" ...
- python开发的学生管理系统
python开发的学生管理系统(基础版) #定义一个函数,显示可以使用的功能列表给用户 def showInfo(): print("-"*30) print(" 学生管 ...
- python类的封装
Python之类的封装 1. 什么是封装 装:往容器/名称空间里存入名字 封:代表将存放于名称空间中的名字给藏起来,这种隐藏对外不对内(怎么做到的,在下文解释) 2. 为何要封装 封数据属性:不想要给 ...
- LeetCode:35. Search Insert Position(Easy)
1. 原题链接 https://leetcode.com/problems/search-insert-position/description/ 2. 题目要求 给定一个已经排好序的数组和一个目标值 ...
- CLR via c#读书笔记九:字符、字符串和文本处理
1.在.NET Framework中,字符总是表示成16位unicode代码值(关于unicode.utf8等可以到http://www.ruanyifeng.com/blog/2007/10/asc ...
- Python Road
引子 雁离群兮不知所归,路遥远兮吾将何往 Python Road[第一篇]:Python简介 Python Road[第二篇]:Python基本数据类型 Python Road[第三篇]:Pyth ...
- 「日常训练」 Longest Run on a Snowboard (UVA-10285)
题意 其实就是一条二维的LIS,但是还是做的一愣一愣的,多努力. 考虑$dp[i][j]$为从(i,j)出发的二维LIS的最大值,那么$dp[i][j]=max\{dp[i−di[k]][j−dj[k ...