• 今天主要说些内部类的相关基础知识,如果能做出下面这个小题目,再下面的内容不看也罢(面试题答案在最后)
    内部类面试题:补全下列代码,实现目标输出,其中描述阶段的数字只能调用已有变量,不能用其他方式
public class TestInner1 {
	public static void main(String[] args) {
		//调用
	}
}

class Programmer{
	private int n = 1;
	class Bald{
		private int n = 2;
		
		public void expert() {
			int n = 3;
			System.out.println("level " + *** + ":programmer");
			System.out.println("level " + *** + ":bald");
			System.out.println("level " + *** + ":expert");
		}
	}
}

输出目标:

level 1:programmer
level 2:bald
level 3:expert
  • 内部类(一般内部类是为了增强安全性,不易被外界访问)
    1.访问特点:

    ①内部类可直接访问外部类的成员,包括私有
    ②而外部类想要访问内部类的成员,需要先创建对象
    2.(1)成员内部类
①直接访问内部类:外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
eg:

package javaBasic;

public class TestInner {
	public static void main(String[] args) {
		new Stripling().new Diligent().need();
	}
}

class Stripling{
	class Diligent{
		public void need() {
			System.out.println("Make a great effort to pass CET-6 at one time!");
		}
	}
}

②成员内部类被静态修饰后的访问方式是:外部类名.内部类名 对象名 = new 外部类名.内部类名();
eg:

package javaBasic;

public class TestInner {
	public static void main(String[] args) {
		new Stripling. Diligent().need1();
	}
}

class Stripling{
	private int num1 = 1;//static的内部类Diligent不能访问外部类的非static成员
	private static int num2 = 2;
	
	public static class  Diligent{
		public void need() {
			System.out.println(num2 + "\nMake a great effort to pass CET-6 at one time!");
		}
		
		public static void need1() {
			System.out.println(num2 + "1\nMake a great effort to pass CET-6 at one time!");
		}
	}
}

3.局部内部类
         ①局部内部类访问局部变量必须用final修饰
         a.局部变量是随着方法的调用而调用,随着调用完毕而消失
         b.相比之下,堆内存的内容不会立即消失(堆内存随着垃圾回收器的作用而消失)
         c.综合a、b,我们需要用final修饰,变量变常量——内存中存储的是对应的数据值

4.匿名内部类:继承了相应的类或者实现了相应接口的子类匿名对象,功能上可理解为内部类的简化写法
            ①前提:存在一个类(可是具体类也可是抽象类)或接口
            ②格式:new 类名或者接口名(){
                重写方法;
            }

  • 顺序问题:package>import>class
  • 修饰符:

    ①权限修饰符:private,default,protected,public
    ②状态修饰符:static,final
    ③抽象修饰符:abstract
  (1)类:
    ①权限修饰符:private,default,protected,public
    ②状态修饰符:final(因为内部类可以看做外部类的成员,则内部类可以用static修饰)
    ③抽象修饰符:abstract
  (2)成员变量:
    ①权限修饰符:private,default,protected,public
    ②状态修饰符:static,final
  (3)构造方法:
    ①权限修饰符:private,default,protected,public
  (4)成员方法:
      ①权限修饰符:private,default,protected,public
    ②状态修饰符:static,final
    ③抽象修饰符:abstract
  (5)the other组合方式:
      成员变量:public static final//静态成员常量
      成员方法:public static
                public final
                public abstract

  • 面试题答案:
package javaBasic;

public class TestInner1 {
	public static void main(String[] args) {
		new Programmer().new Bald().expert();
	}
}

class Programmer{
	private int n = 1;
	class Bald{
		private int n = 2;
		
		public void expert() {
			int n = 3;
			System.out.println("level " + Programmer.this.n + ":programmer");//通过外部类名限制this范围
			System.out.println("level " + this.n + ":bald");
			System.out.println("level " + n + ":expert");
		}
	}
}