内部类大体概念

成员内部类

public class Animal {
	private String sname = "动物";
	private int age = 3;
	public static String master = "Mr Zhou";
	public void eat() {
		System.out.println("Animal eat方法");
	}
	/**
	 * 成员内部类
	 *
	  *不能和外部类重名,内部类可以用final和public修饰
	  *内部类中不能含有静态的属性,和静态方法,和静态代码块
	  *内部类中可以有静态常量
	 */
	public class Face{
		private String color = "黄色";
		private String sname = "大花脸";
		private static final int s = 0;
	
		public void smile() {
			System.out.println("Animal.Face.smile");
			System.out.println(sname);//调用内部类的sname属性
			System.out.println(this.sname);//调用内部类的sname属性
			System.out.println(Animal.this.sname);//调用外部类的sname属性(访问外部类成员,通过类名.this.成员)
			eat();//调用外部类的成员方法
			System.out.println(Animal.master);
			System.out.println(age);
		}
		
	}
	
	public static void main(String[] args) {
		Animal a = new Animal();//先创建外部类对象
		//Face f = a.new Face();
		Animal.Face face = a.new Face();//创建好外部类对象后再创建内部类对象
		face.smile();
	}

}

静态内部类

public class Animal1 {
	private String sname = "动物";
	private int age = 3;
	public static String master = "Mr Zhou";
	//静态内部类,位置和外部类中的静态属性和静态方法相同
	static class Body{
		private String sname = "身体";
		private  int height = 180;
		public void sport() {
			System.out.println("Animal1.Body.sport()");
			System.out.println(height);
			System.out.println(sname);
			System.out.println(master);
			//System.out.println(Animal1.this.sname);静态内部类中不能访问外部类中的非静态成员
			show();
		}
	}
	
	public void eat() {
		
	}
	public static void show() {
		
	}
	
	public static void main(String[] args) {
		Body b = new Animal1.Body(); //创建静态内部类对象可以直接用外部类名.内部类名创建
		Body b1 = new Body();
		b1.sport();
		
	}

}

局部内部类

public class Animal2 {
	private String sname = "动物";
	private int age = 3;
	public static String master = "Mr Zhou";
	/**
	 * 局部内部类位置和局部变量相同
	 * 局部内部类中不能定义静态变量,静态方法,静态代码块
	 * 局部内部类只能在定义该类的方法或者代码块中使用
	 * 局部内部类可以访问外部类中所有的属性和方法
	 * 局部内部类是一个独立的类,会编译成一个独立的class文件
	 * 局部内部类只能用final或者abstract修饰
	 */
	public void sleep() {
		int num = 5;//如果在局部内部类中使用局部变量,这个变量是常量(被final修饰的)
		
		 class Eye{//局部内部类可以用final和abstract修饰
			private int sight = 1;
			private  String sname = "双眼皮";
		
			
			public void watch() {
				System.out.println("Animal2.sleep().Eye.watch()");
				System.out.println(sname);
				System.out.println(Animal2.this.sname);
				System.out.println(master);
				System.out.println(num);
				eat();
			}
		}
		Eye e = new Eye();
		e.watch();
	}
	public void eat() {
		
	}
	public static void main(String[] args) {
		Animal2 a = new Animal2();
		a.sleep();
	}

}

匿名内部类

public interface InterfaceA {
	void eat();

}
public class SmailFace {

}
public class Test {
	static String name = "zhangsan";
	/**
	 * 匿名内部类:
	 * 匿名内部类必须继承一个父类或者实现一个接口
	 * 匿名内部类没有使用class关键字,我们不知道类名,这个类名JVM创建的
	 * 匿名内部类是一个特殊的局部内部类,可以写在方法中
	 * 匿名内部类只能使用一次
	 * 匿名内部类不能定义构造方法
	 * 匿名内部类不能是抽象类
	 * 匿名内部类可以访问外部类的成员
	 * 
	 */
	public static void main(String[] args) {
		int num = 3;
		new InterfaceA() {
			
			@Override
			public void eat() {
				System.out.println("eat方法");
				//num++;
				System.out.println(num);
				System.out.println(name);
			}
		}.eat();

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值