java内部类

前言: 今天上了java课,老师讲的内部类,局部类,匿名类还是没搞太清楚,打算自己搜资料来复习一遍。

参考文章:https://blog.csdn.net/qq7342272/article/details/6671433

内部类: 在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类局部内部类匿名内部类静态内部类。下面就先来了解一下这四种内部类的用法。

1.成员内部类:

成员内部类是最普通的内部类,它的定义为位于另一个类的内部,形如下面的形式:

public class Circle {
    double radius = 0;
    
    public Circle(double radius) {
        this.radius = radius;
    }
     
    class Draw {     //内部类
        public void drawSahpe() {
            System.out.println("drawshape");
        }
    }
}

在这里,Circle被称作为外部类,也叫做封装类。Draw 被称为内部成员类。

这里我们需要注意的几个点是

1、非静态成员内部类(也就是成员内部类)可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。

2、非静态成员内部类(也就是成员内部类)只能定义非静态成员属性和成员方法

3、静态成员内部类只可以访问外部类中的静态成员属性和成员方法

4、静态成员内部类能定义静态成员属性和方法,也能定义非静态成员属性和方法

问题:如果内部类和外部类的成员属性冲突了,是重名那该如何是好呢?

上面的代码已经解释清楚了,当内部类和外部类的成员属性冲突,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:

访问封装类的非静态成员(包括属性和方法)

外部类.this.成员

访问封装类的静态成员(包括属性和方法)

外部类.静态成员

问题:如何在外部类之外创建静态成员类或者是非静态成员类呢?

创建内部静态成员类:

外部类名.静态内部成员类名 实例变量名 = new 外部类名.静态内部类()

Circle c1 = new Circle();
Circle.Tool to1 = new Circle.Tool(); // 创建静态内部类成员

创建内部非静态成员类:

外部类名.非静态内部成员类名 实例变量名 = 外部类的实例名.new 非静态内部成员类名()

Circle c1 = new Circle();
Circle.Draw to2 = c1.new Draw(); // 创建非静态内部类成员

1.局部内部类: 局部内部类是在封装类的方法中定义的内部类,与局部变量类似,其作用域是定义它的代码块。

利用: 典型用法是与接口配合,用局部类来实现接口,并在方法中返回接口类型。

特征:

1、局部类的类名不能和外部类的类名相同

2、局部类可以abstract和final型

3、访问修饰符只能是缺省的,也就是不可以是public、private、protected

4、局部类不允许包含静态成员属性和方法

5、局部类中只能访问它所在方法中的final型变量,不能访问非final型的变量。

第五点的证明:

public class Inside {
	
	public void to_inside() {
		int cc=22;
		class Inside_one{
			public void inside_one_a() {
				System.out.println(cc);
			}
		}

		
		Inside_one i1 = new Inside_one();   //局部类创建实例
		i1.inside_one_a();
		
	}
}

这样子是无法进行访问的,这个原因是由于inside_one_a方法调用完毕之后就从栈中弹出了,但是这个时候由于局部内部类中使用了这个方法中的局部变量,而这个类还是不会立即回收的,所以只能将局部变量声明为final,表示常量,也意味着是持久的意思。


匿名内部类: 一个没有显式的名字的内部类

本质: 匿名内部类会隐式的继承一个类或者实现一个接口,或者说,匿名内部类是一个继承了该类或者实现了该接口的子类匿名对象。

格式new 父类(){子类内容};

匿名类的特点:

1、匿名类可以继承父类的方法,也可以重写父类的方法。

2、匿名类可以访问外部类的成员变量和方法,匿名类的类体不可以声明称static成员变量和static方法。

一个简单的匿名类的实现:

interface Cubic {
	int getCubic(int n);

}

class A {
	
	public void f(Cubic cubic) {
		double result = cubic.getCubic(4);
		System.out.println(result);
		
		
	}
}

public class Demo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		A a = new A();
		a.f(new Cubic() {
			public int getCubic(int n) {
				return n*n;
				
			}
		});
	}

}

参考文章:https://www.cnblogs.com/progor/p/8644634.html

参考文章:https://www.runoob.com/w3cnote/java-inner-class-intro.html

posted @ 2019-11-02 14:12  zpchcbd  阅读(177)  评论(0编辑  收藏  举报