Java的内部类和匿名内部类

内部类

内部类就是定义在类中的类,也成为嵌套类,包含内部类的类称为外部类。两者不能同名,一个外部类内可以用许多个内部类,理所应当都不能同名。

1.在外部类内调用内部类的用法与平时所遇见的类用法相同。

//示例代码:
public class out{
	private int age;
	public class Student{
		String name;
		public Student(String n,int a){
			name = n;
			age = a;		//访问外部类内的变量
		}
		public void output(){
			System.out.println(this.name+age);
		}
	}
	public void output(){
		Student stu = new Student("Java",24);
		stu.output();
	}
	public static void main(String[] args){
		Out g = new Out();
		g.output();
	}
}


//输出结果为:Java 24

2.在内部类的成员方法访问某一变量时,如果该类方法和内类都没有定义这个变量,则会调用外部类内的这个变量(age\color{blue}{比如说代码中的age})。在内部类内调用外部方法也是这样。

3.内部类的特征

1.内部类可以声明为 private 或 protect
2.内部类前面用final修饰,则表明不能被继承
3.内部类可以声明为abstract,但要被其他内部类继承
4.内部类也可以是一个接口,但是必须要被另一个内部类继承
5.内部类不仅可以定义在类中,也可以定义在程序块之内,不如方法或者循环体
6.内部类可以访问外部类的成员变量,包括静态和实例变量,也可以访问内部类方法所在的局部变量
7.如果内部类被定义为static,则不能引用外部成员或其他内部类的成员。非晶态类内部不能声明静态成员,只有静态类内部才可以声明静态成员



匿名内部类

创建类的用处就是new出对象,如果一个对象只使用一次,则可以使用匿名类。

1.匿名内部类只能继承一个父类或者接口,不能继承多个。继承不用extends或者implements,直接用new。

2.创建对象用的是父类里的无参构造函数,如果继承的是接口的话用的是object类里的无参构造方法,所以说在创建匿名内部类的时候不能有参数。

3.匿名内部类的作用就是简化代码或者是补充父类里面没有定义到的方法。

4.匿名内部类可以继承或者重写父类的方法,也可以创建自己的方法。

5.匿名内部类必须实现父类或者接口里的全部抽象方法。

6.匿名内部类里不能声明static成员或者static方法。




1.简单的匿名内部类

public class 匿名内部类 {
	public static void main(String[] args) {
		
		class inier{
			String name;
		}
		(
			new inier() {
				void setname(String n) {
					name=n;
					System.out.println(name);
				}
			}
		).setname("匿名内部类");
		inier qwe =new inier(); 
	}
}

2.匿名内部类实战

public class train{
	private int age;
	public class Student{
		String name;
		public Student() {} 
		public Student(String n,int a){
			name = n;
			age = a;		//访问外部类内的变量
		}
		public void output(){
			System.out.println(this.name+age);
		}
	}
	
	public void output(){
		Student stu = new Student("Java",24);
		stu.output();
		(new Student() {
			void hhh() {
				System.out.println("123");
			}
		}).hhh();
	}
	public static void main(String[] args){
		train g = new train();
		g.output();
		
	}
}

3.匿名内部类继承借口(可以用拉姆达表达式,此处先不提及)

interface qwer{
	void shape();
}

class mytipe{
	public void outshape(qwer s) {
		s.shape();
	}
}

public class 匿名继承接口 {
	public static void main(String[] args) {
		mytipe my = new mytipe();
		my.outshape(new qwer() {
			@Override
			public void shape() {
				System.out.println("匿名内部类,继承接口");
			}
		}
				);
		
	}
}
posted @ 2020-01-21 17:45  lcyok  阅读(352)  评论(0)    收藏  举报