--------------------------Inner Class---------------------------
1、Static Inner Class 静态内部类
是成员内部类的一种。
静态内部类中可以访问外部类静态成员,但不能访问外部类非静态成员
class Outer{
static int index = 200;
int a = 10;
static class Inner{
public void print(){
System.out.println(index); //不能访问a
}
}
}
public class TestStaticInner {
public static void main(String[] args) {
Outer.Inner in = new Outer.Inner();
in.print();
}
}
(1).静态内部类的实例不会自动持有外部类特定实例的引用,
在创建内部类的实例时,不必创建外部类的实例。
(2).静态内部类可以直接访问外部类的静态成员。
(3).在静态内部类中可以定义静态成员和实例成员。
(4).用户可以通过完整的类名直接访问静态内部类的静态成员。
2、Member Inner Class 成员内部类
class Outer{
private int index = 200;
class Inner{
private int index = 100;
public void print(){
int index = 50;
System.out.println(index); //50
System.out.println(this.index); //100
System.out.println(Outer.this.index); //200
}
}
}
public class TestMemberInner {
public static void main(String[] args) {
Outer out = new Outer();
Outer.Inner in = out.new Inner();
in.print();
}
}
(1).成员内部类不能有静态声明
(2).须先有外部类对象,再有内部类对象
(3).内部类可以访问外部类的私有成员
3、Local Inner Class 局部内部类
class Outer{
private int i1; //非静态
private static int i2;
public void test1(int i3){
final int i4 = 4;
class Inner{
public void test(){
System.out.println(i1);
System.out.println(i2);
//System.out.println(i3);
System.out.println(i4);
}
}
Inner in = new Inner();
in.test();
}
}
public class TestLocalInner {
public static void main(String[] args) {
Outer out = new Outer();
out.test1(5);
}
}
(1).局部内部类只能在当前方法中使用
(2).局部内部类不能包含静态成员
(3).局部内部类不能被public、proected和private这些关键字修饰,
只能被abstract、final修饰
(4).可以访问外部类的所有成员
4、Anonymous Inner Class 匿名内部类
interface Animal{
void eat();
}
public class TestAnonymousInner {
public static void main(String[] args){
System.out.print("请输入一个数字:");
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
Animal a=getAnimal(i);
a.eat();
feed(new Animal(){
public void eat(){
System.out.println("Tiger eat Sheep");
}
});
}
static Animal getAnimal(int a){
/*
class Dog implements Animal{
public void eat(){
System.out.println("Dog eat Bone");
}
}
class Cat implements Animal{
public void eat(){
System.out.println("Cat eat Fish");
}
}
if (a==0) return new Dog();
else return new Cat();
*/
if (a==0) return new Animal(){
public void eat(){
System.out.println("Dog eat Bone");
}
};
else return new Animal(){
public void eat(){
System.out.println("Cat eat Fish");
}
};
}
static void feed(Animal a){
a.eat();
}
}
----------------------------------------
interface IA{
public void m1();
}
public class Test {
public static void main(String[] args) {
IA ia = getIA();
ia.m1();
}
public static IA getIA(){
return
new IA(){
public void m1() {
System.out.println("ttt");
}
};
}
}
适用场合:
a、类名字不重要时
b、只需要new一个对象
c、要实现接口,或者继承类
1、Static Inner Class 静态内部类
是成员内部类的一种。
静态内部类中可以访问外部类静态成员,但不能访问外部类非静态成员
class Outer{
static int index = 200;
int a = 10;
static class Inner{
public void print(){
System.out.println(index); //不能访问a
}
}
}
public class TestStaticInner {
public static void main(String[] args) {
Outer.Inner in = new Outer.Inner();
in.print();
}
}
(1).静态内部类的实例不会自动持有外部类特定实例的引用,
在创建内部类的实例时,不必创建外部类的实例。
(2).静态内部类可以直接访问外部类的静态成员。
(3).在静态内部类中可以定义静态成员和实例成员。
(4).用户可以通过完整的类名直接访问静态内部类的静态成员。
2、Member Inner Class 成员内部类
class Outer{
private int index = 200;
class Inner{
private int index = 100;
public void print(){
int index = 50;
System.out.println(index); //50
System.out.println(this.index); //100
System.out.println(Outer.this.index); //200
}
}
}
public class TestMemberInner {
public static void main(String[] args) {
Outer out = new Outer();
Outer.Inner in = out.new Inner();
in.print();
}
}
(1).成员内部类不能有静态声明
(2).须先有外部类对象,再有内部类对象
(3).内部类可以访问外部类的私有成员
3、Local Inner Class 局部内部类
class Outer{
private int i1; //非静态
private static int i2;
public void test1(int i3){
final int i4 = 4;
class Inner{
public void test(){
System.out.println(i1);
System.out.println(i2);
//System.out.println(i3);
System.out.println(i4);
}
}
Inner in = new Inner();
in.test();
}
}
public class TestLocalInner {
public static void main(String[] args) {
Outer out = new Outer();
out.test1(5);
}
}
(1).局部内部类只能在当前方法中使用
(2).局部内部类不能包含静态成员
(3).局部内部类不能被public、proected和private这些关键字修饰,
只能被abstract、final修饰
(4).可以访问外部类的所有成员
4、Anonymous Inner Class 匿名内部类
interface Animal{
void eat();
}
public class TestAnonymousInner {
public static void main(String[] args){
System.out.print("请输入一个数字:");
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
Animal a=getAnimal(i);
a.eat();
feed(new Animal(){
public void eat(){
System.out.println("Tiger eat Sheep");
}
});
}
static Animal getAnimal(int a){
/*
class Dog implements Animal{
public void eat(){
System.out.println("Dog eat Bone");
}
}
class Cat implements Animal{
public void eat(){
System.out.println("Cat eat Fish");
}
}
if (a==0) return new Dog();
else return new Cat();
*/
if (a==0) return new Animal(){
public void eat(){
System.out.println("Dog eat Bone");
}
};
else return new Animal(){
public void eat(){
System.out.println("Cat eat Fish");
}
};
}
static void feed(Animal a){
a.eat();
}
}
----------------------------------------
interface IA{
public void m1();
}
public class Test {
public static void main(String[] args) {
IA ia = getIA();
ia.m1();
}
public static IA getIA(){
return
new IA(){
public void m1() {
System.out.println("ttt");
}
};
}
}
适用场合:
a、类名字不重要时
b、只需要new一个对象
c、要实现接口,或者继承类