JAVA基础(18)-内部类

内部类


      是在一个类的内部定义的新类型。即内部类,与之相反的类称之为外部类。
  内部类可以根据位置不同进行以下划分:
         1、成员内部类
         2、方法内部类(局部内部类)
         3、带static修饰词的类   静态内部类
         4、没有名称的类:匿名内部类  
 
     最不常用的内部类:方法内部类静态内部类
             方法内部类:定义在方法中,相当于局部变量,仅限于在方法中使用,定义时不能使用修饰词,可以直接访问外部类的非静态成员变量

练习代码

/**
 * 方法内部类的学习
 * */
public class A {
	char gender;
	public void run() {
		class B{
			String name;
			int age;
			public B(String name,int age) {
				this.name = name;
				this.age = age;
			}
			public void showB() {
				System.out.println(name+","+age+","+gender);
			}
		}
		B b = new B("翠花",13);
		b.showB();
	}
	public static void main(String[] args) {
		A a = new A();
		a.run();
	}
}


             静态内部类:也是以类的成员来定义的,只不过多了一个修饰词static,可以直接访问外部类的静态成员
 练习代码

/**
 * 静态内部类
 * @author michael
 *
 */
public class C {
	String name;
	D d  = new D(12);
	public void run() {
		
	}
	static class D{
		int age;
		public D(int age) {
			this.age = age;
		}
		//静态内部类可以直接访问外部类的静态成员
		public void showD() {
			//System.out.println(age+","+name);
		}
	}
}


     相对而言,成员内部类和匿名内部类比较常用。
             成员内部类:以类的成员来定义,可以使用任何修饰词来修饰。

                     成员内部类访问外部类的成员,方法内隐藏一个指向外部类对象的引用。
                     外部类名.this.
                     成员内部类的使用:
                             创建对象:要先创建一个外部类的对象outer,然后使用外部类对象去使用new调用内部类的构造器实例化,Inner  inner = outer.new Inner(有参传参);    
                             外部类访问成员内部类的成员:在外部类添加一个内部类的成员变量进行访问  
练习代码

public class Mom {
	char gender;
	int age;
	/**添加一个内部类的成员变量*/
	Baby baby;
	public Mom(char gender,int age) {
		this.gender = gender;
		this.age = age;
		baby = new Baby('m');
	}
	public void sport() {
		System.out.println("正在走路");
		/**访问成员变量的信息*/
		System.out.println("为了肚子里的对象:"+baby.toString()+","+baby.gender);
		baby.show();
	}
	/**以成员的身份来定义胎儿类型*/
	class Baby{
		char gender;
		public Baby(char gender) {
			this.gender = gender;
		}
		/**展示自己的行为*/
		public void show() {
			/**内部类访问外部类的成员
			 * 
			 * 方法内隐藏一个指向外部类对象的引用。
			 *       外部类名.this.
			 * */
			System.out.println("妈妈的年龄:"+Mom.this.age+",我自己的性别:"+gender);
		}
	}
}


             匿名内部类:没有名字的类型,写在外部类的方法中,只用一次,不需要定义类的结构,通常都是为了实现接口,抽象类或某一现有的类的子类,子类没有名称,所以称之匿名  
                    当我们先使用接口\抽象类的子类时,因为我们用一次,我们就可以不去定义子类的结构,因此我们可以使用匿名内部类的写法,没有子类名称,我们   可向上造型 =后是new 父类的子类(可以有参){

                                                                                             重写接口/抽象类中所有的抽象方法,或重写某一个实现方法

                                                                                             };

练习代码

public class Test01 {
	public static void main(String[] args) {
		InterX x = new InterX() {
			@Override
			public void sum(int a, int b) {
				System.out.println("和:"+(a+b));
				
			}
			@Override
			public void product(int a, int b) {
				System.out.println("乘积:"+(a*b));
				
			}
			
		};
		x.sum(10, 5);
		x.product(10, 5);
	}
}
interface InterX{
	
	public void sum(int a,int b);
	public void product(int a,int b);
	
}

猜你喜欢

转载自blog.csdn.net/woainiqazwsx123/article/details/81591331