首页 > 代码库 > 内部类
内部类
内部类
1内部类概述
将一个类定义在另一个类的里面,对里面的那个类就称为内部类
package InnerClassDemo;
/*
* 内部类访问特点
* 1 内部类可以直接访问外部类中的成员
* 2 外部类要访问内部类,必须建立内部类的对象
*
*
* 一般用于类的设计
*
* 分析事物时,发现该事物描述中还有事物,而且这个事物还在访问访问被描述事物的内容
* 这时就定义内部类来描述
*/
class Outer
{
private int num=3;
class Inner
{
void show()
{
System.out.println("show runs"+num);
}
}
public void method()
{
Inner in=new Inner();
in.show();
}
}
public class Demo {
public static void main(String[] args) {
new Outer().new Inner().show();
new Outer().method();
}
}
2内部类修饰符
核心思想:内部类相当于外部类的一个成员
package InnerClassDemo;
class Outer
{
private static int num=3;
static class Inner
{
void show()
{
System.out.println("show runs"+num);
}
//如果内部类定义了静态成员 那么内部类必须也是静态的
static void function()
{
System.out.println("function run.."+num);
}
}
public void method()
{
Inner in=new Inner();
in.show();
}
}
public class Demo {
public static void main(String[] args) {
//创建内部类对象
//Outer.Inner in=new Outer().new Inner();
//in.show();
//如果内部类是static的 相当于一个外部类
// Outer.Inner in=new Outer.Inner();
Outer.Inner.function();
}
}
3 内部类细节
package InnerClassDemo;
/*
* 类一旦嵌套 this就要区分 例如 Outer.this和Inner.this
*
* 为什么内部类能访问外部类中的成员呢?
* 那是因为内部类持有了外部类的引用(外部类名.this)
*/
class Outer
{
int num=3;
class Inner
{
int num=4;
void show()
{
int num=5;
System.out.println("show runs"+Outer.this.num);
}
}
public void method()
{
Inner in=new Inner();
in.show();
}
}
public class Demo {
public static void main(String[] args) {
new Outer().method(); //打印5
//指定this.num可以打印4 (相等于Inner.this)
// Outer.this 可以打印3
}
}
4局部内部类(内部类可以放在局部位置上)
/*
内部类在局部位置只能访问局部中被final修饰的局部变量
*/
package InnerClassDemo;
class Outer
{
int num=3;
void method()
{
Final int x=8; //访问方法中的局部变量要声明为final
class Inner
{
void show()
{
System.out.println("show...."+num);
System.out.println("show...."+x);
}
}
Inner in=new Inner(); //在内部创建对象
in.show();
}
}
public class Demo {
public static void main(String[] args) {
new Outer().method();
}
}
5 匿名内部类概述()
相当于成员内部类+定义对象
package InnerClassDemo;
/*
* 匿名内部类:就是内部类的简写格式
*
* 必须有前提:
* 内部类必须继承或者实现一个外部类或者接口
*
* 匿名内部类 其实就是一个匿名子类对象
*
*
*
*
*
*
*/
abstract class mydemo
{
abstract void show();
}
class Outer
{
int num=4;
class Inner extends mydemo
{
void show()
{
System.out.println("show ..."+num);
}
}
public void method()
{
// new Inner().show();
new mydemo(){
void show()
{
System.out.println();
}
void haha()
{
System.out.println("haha");
}
}.haha();
}
}
public class Demo {
public static void main(String[] args) {
new Outer().method();
}
}
内部类