JAVA面向对象(六)—— Java内部类、匿名内部类

文章目录

一、Java内部类

1、创建内部类对象语法

外部类名.内部类名  对象名 = new  外部类名().内部类名()

2、访问规则
(1)内部类可以直接访问外部内的成员,包括私有。 之所以能够访问外部类中的成员,是因为内部类中持有了一个外部类的引用, 格式 外部类名.this
(2)外部内要访问内部类,必须建立内部类对象
3、访问格式
Demo

public class Outer{
	private String name = "张三";
	private int age = 10;
	public void eat() {
		
	}
	//创建一个内部类
	class Inner{
		public  void sleep() {
			System.out.println(name + "在睡觉");
		}
	}
}
//main函数类
public class Demo {
	public static void main(String[] args) {
		Inner in = new Outer().new Inner();
		in.sleep();
	}
}

(1)当内部类定义在外部内的成员位置上,而且非私有,可以在外部其他类中直接建立内部类对象。 格式:

外部类名.内部类名  变量名 = 外部类对象.内部类对象; 
Outer.Inter  in = new Outer().new Inner();

(2)当内部类在成员位置上,就可以被成员修饰符所修饰。比如:
private:将内部类在外部类中进行封装。
static:内部类就具备静态的特性。
① 当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限
② 在外部其他类中,直接访问static内部类的非静态成员:

new Outer( ).Inner( ).function( );

③ 在外部其他类中,直接访问static内部类的静态成员:

Outer.Inner( ).function( );

二、Java匿名内部类

1、概念
匿名内部类是指没有名字的内部类。
2、格式:

new 接口名/父类/抽象类( ){
	重写方法 
};

(1)这个类如果是接口,会自动实现;
(2)如果是抽象类/普通类,会继承这个抽象类;
(3)不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现;
3、要调用对象,直接在后面用.类名调用。
Demo1

public abstract class Smoking{
	public abstract void smoke();
}
//main函数类
public class Demo1 {
	public static void main(String[] args) {
		new Smoking() {
			@Override
			public void smoke() {
				System.out.println("请勿吸烟");
			}
		}.smoke();
	}
}

Demo2

public interface Smoking{
	void smoke();
}
public class Demo2 {
	public static void main(String[] args) {
		new Smoking() {
			@Override
			public void smoke() {
				System.out.println("请勿吸烟");
			}
		}.smoke();
	}
}

另外,调用的方式也可以是下面这种

public abstract class Smoking{
	public abstract void smoke();
}
//main函数类
public class Demo2 {
	public static void main(String[] args) {
		Smoking smoking = new Smoking() {
			@Override
			public void smoke() {
				System.out.println("请勿吸烟");
			}
		};
		//用这个对象来调用方法
		smoking.smoke();
	}
}
上一篇:静态代理与动态代理


下一篇:pytest 学习笔记(一)