0
点赞
收藏
分享

微信扫一扫

内部类知识点

腊梅5朵 2022-02-19 阅读 104
java学习

1.内部类定义

定义在一个类类体当中的类,被称为内部类

public class 内部类{
    public static void main(String[] args){
        Animal an = new Animal();
        an.Bird bird = an.new Animal();
        //不想新建animal对象则可以
        Animal.Cat cat = new Animal().new Cat();
        cat.catch();
        bird.fly();
    }
}

class Animal{
    Object animal = new Object();
    class Bird{
        public void fly(){
            System.out.println("鸟会飞");
        } 
    }
    class Cat{
        public void catch(){
            System.out.println("猫会抓老鼠");
        }
    }
}

2.内部类作用

为了共享数据。

2.1数据共享方式

静态变量,内部类,参数传递

3.内部类分类 *

根据能够共享外部类的哪些内容分为四类

1.静态内部类,仅能共享外部类的静态成员(属性+方法),但因为即使不是内部类也能共享静态成员,因此静态内部类是为了描述类与类之间关系的

public class TestStaticInnerClass{
	public static void main(String[] args){
		A.C c = new A.C();
		c.test();
	}
}

class A{
	static int i = 10086;
	int j = 1;
	static class C{
		public void test(){
			System.out.println(i);
			//System.out.println(j);调用不了外部类的非静态成员
		}
	}
}

2.成员内部类,可以共享外部类的所有(静态和非静态)成员(属性+方法)

public class TestMemberInnerClass{
	public static void main(String[] args){
		A.C cc = new A().new C();
		cc.test();
	}
}
class X{
	int i = 7;
}
class A{
	int i = 3;
	private void print(){
		System.out.println("abc");
	}

	class C extends X{
		int i = 5;
		A a = new A();
		public void test(){
			System.out.println(i);//5
			System.out.println(this.i);//5
			System.out.println(C.this.i);//5

			System.out.println(A.this.i);//3

			System.out.println(super.i);//7
			System.out.println(C.super.i);//7
			a.print();//私有的也能共享
		}
	}
}

3.局部内部类,如果存在于静态方法中,则共享外部类的静态成员。如果存在于非静态方法中,则共享外部类所有(静态+非静态)成员(属性+方法)。此外,它们都可以共享外部类那个方法的局部变量但是JDK8.0之前必须加以final修饰,JDK8.0之后不需要,因为默认是final的

*:有位置限定: 定义完成之后 其所在方法结束之前!

public class TestLocalInner{
	public static void main(String[] args){
		Outer o = new Outer();
		o.test1(100);
		System.out.println("=============");
		o.test2(50);
	}
}
class Outer{
	int a = 3;
	static int b = 5;
	public static void test1(int c){
		class Inner{
			public void test(){
				//System.out.println(a);无法调用非静态成员
				System.out.println(b);
				System.out.println(c);
			}
		}
		Inner in = new Inner();
		in.test();
	}

	public void test2(int c){
		int d = 7;
		class Inner{
            d = 11;
			int x = 9;
			public void test(){
				System.out.println(a);//true (取决于外部类方法是否是非静态的)
				System.out.println(b);//true
				System.out.println(c);//true (取决于JDK版本 8.0之前必须加final)
				System.out.println(d);//true (取决于JDK版本 8.0之前必须加final)
				System.out.println(x);//true
			}
		}
		Inner in = new Inner();
		in.test();
	}
}

4.匿名内部类(这个匿字手写的时候忘了咋写,就很尴尬

匿名内部类能共享的数据取决于其所在的位置,也就是它是上面三种的某一种。

匿名内部类同样可以产生.class文件,但是其名字是由数字编号命名的。

匿名内部类如何实现接口:
        new 接口(){
            完成抽象方法的具体实现~
        };

    匿名内部类如何继承父类:     
        new 父类(给父类构造方法传参){
            完成抽象方法的具体实现~
        };

public class TestAnonyInner{
	public static void main(String[] args){
		Person p = new Person("张三"){
			@Override
			public void eat(){
				System.out.println("张三吃午饭");
			}
		};
		p.eat();
	}
}
abstract class Person{
	String name;
	public Person(String name){
		this.name = name;
	}
	public abstract void eat();
}
举报

相关推荐

Java内部类知识初析

0 条评论