概念
有些类的定义中包含另一个类的定义。这种处于内部的类称为内部类(inner class)
非静态内部类
1.不能有静态属性,不能有静态方法。
package com.njlife123.qzmall.clazz;
public class Test {
class Inner{
// private static int i; 不能有静态属性
private String name;
/* public static void f1(){ 不能有静态方法
}*/
public void f1(){
System.out.println("f1");
}
}
}
其它类访问内部类
通过外部类的实例,
外部类名.内部类名 引用=外部类实例引用名.new 内部类名()
外部类名.内部类名 引用=new 外部类名().new 内部类名()
package com.njlife123.qzmall.clazz;
public class Test1 {
public static void main(String[] args) {
Test out = new Test();
Test.Inner inner = out.new Inner();
inner.f1();
}
}
外部类访问内部类
直接new出来就可以了。
package com.njlife123.qzmall.clazz;
public class Test {
class Inner{
// private static int i; 不能有静态属性
private String name;
/* public static void f1(){ 不能有静态方法
}*/
public void f1(){
System.out.println("f1");
}
}
/**
* 外部类Test的outF1方法访问Inner对象
* @return
*/
public Inner outF1(){
return new Inner();
}
}
内部类访问外部类
直接访问,包括私有
package com.njlife123.qzmall.clazz;
public class Test {
private int i;
static int a;
class Inner{
// private static int i; 不能有静态属性
private String name;
/* public static void f1(){ 不能有静态方法
}*/
/**
* 内部类可以随便访问外部类
*/
public void f1(){
System.out.println(i);
System.out.println(a);
}
}
/**
* 外部类Test的outF1方法访问Inner对象
* @return
*/
public Inner outF1(){
return new Inner();
}
}
静态内部类
可以有静态成员。
package com.njlife123.qzmall.clazz;
public class Test {
private int i;
static int a;
static class Inner{
private static int b;
private String name;
}
}
其它类访问内部类
外部类名.内部类名 引用=new 外部类名.内部类名()
访问内部类的静态成员: 内部类名.静态成员。
public static void main(String[] args) {
//创建内部类
Test.Inner inner = new Test.Inner();
//访问内部类静态属性
int a = Inner.b;
}
外部类访问内部类
内部类的非静态成员, 通过内部类的实例访问。
内部类的静态成员, 通过内部类名访问。
package com.njlife123.qzmall.clazz;
public class Test {
private int i;
static int a;
public void f(){
System.out.println(Inner.b);
Inner inner = new Inner();
System.out.println(inner.name);
}
static class Inner{
private static int b;
private String name;
}
}
内部类访问外部类
外部类的静态成员, 直接访问。
外部类的非静态成员, 通过外部类的实例访问。
package com.njlife123.qzmall.clazz;
public class Test {
private int i;
static int a;
public void f(){
System.out.println(Inner.b);
Inner inner = new Inner();
System.out.println(inner.name);
}
static class Inner{
private static int b;
private String name;
/**
* 内部类访问外部类,静态的可以直接访问,非静态的
* 要通过new访问。
*/
public void innerF(){
System.out.println(a);
Test test = new Test();
System.out.println(test.i);
}
}
}
匿名内部类
特点:
- 无构造函数;
- 类的访问修饰符只能是缺省的
- 不能含有静态成员
- 只能创建匿名内部类的一个实例
- 只能访问此方法中的final类型的变量
语法: new 接口/抽象类/父类(){
}
Thread使用匿名内部类
package com.njlife123.qzmall.clazz;
public class Test2 {
public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
System.out.println("匿名内部类");
}
};
}
}
Runnable使用匿名内部类
package com.njlife123.qzmall.clazz;
public class Test2 {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类");
}
};
}
}
自定义匿名内部类
package com.njlife123.qzmall.clazz;
public class Test2 {
public static void main(String[] args) {
IUser iUser = new IUser() {
@Override
public void eat() {
System.out.println("吃");
}
};
iUser.eat();
}
}
interface IUser{
void eat();
}
作者简介:一个有故事的程序员,我的微信号qiushuzhao222,欢迎大家找我聊天,记录你我的故事。