Java基础---内部类详解

内部类

概念:定义在类内部的类,可以在类中方法外,也可以在类中方法中

根据定义位置的不同,分为成员内部类和局部内部类

成员内部类又划分为:
普通的成员内部类
静态的成员内部类
私有的成员内部类

另外还有匿名内部类

普通的成员内部类

定义在成员位置上
class 外部类类名 {
  class 内部类类名 {
      内部类成员;
  }
}
说明:1.成员内部类可以直接访问外部类的成员,包括私有成员
     2.外部类想要访问内部类成员,需要创建内部类对象
     3.外部类以外,要创建内部类对象,必须先创建外部类对象
      格式:外部类类名.内部类类名 内部类对象名 = new 外部类类名().new 内部类类名()
          或者  外部类类名 外部类对象名 = new 外部类类名()
               外部类类名.内部类类名 内部类对象名 = 外部类对象名.new 内部类类名()
     4.成员内部类中不能定义静态方法,因为成员内部类相当于成员变量,是随着外部类对象的创建而存在,而静态方法在        类加载的时候就会存在。
package com.DaYu;

public class Demo01 {
//成员内部类
	public static void main(String[] args) {
		Computer_1 com = new Computer_1();
//		com.show();
//		在其他类中,要访问内部类中的成员,必须先创建外部类的对象
		Computer_1.Cpu cpu = com.new Cpu();
		cpu.run();
		Computer_1.Cpu cpu2 = new Computer_1().new Cpu();
        cpu2.run();
	}
}

class Computer_1 {
	//外部类的属性
    private String brand = "联想";
	
    // 成员内部类
	class Cpu {
		String cpubrand = "AMD";
		//内部类的构造方法
        public Cpu() {
			
		}
        //内部类的方法
		public void run() {
			System.out.println(brand + "cpu型号" + cpubrand);
		}
	}
	//外部类的空参构造
	public Computer_1(){
        
	}
	//外部类中的方法
    public void show() {
   //在外部类中要访问内部类中的成员,必须先创建内部类的对象
		Cpu c = new Cpu();
		c.run();
	}
}

私有的成员内部类

定义在成员位置上,只是加上修饰符private
class 外部类类名 {
	private class 内部类类名 {
		内部类成员
	}
}
说明:私有的成员内部类,在其他类中,无法创建对象,只能在外部类中定义一个公共的访问方法,在其中创建内部类的对象,从而间接访问内部类的成员。

静态的成员内部类

1、也是一个成员内部类,在成员内部类的前面加上一个static关键字
2、访问特点
	(1)成员内部类是外部类的静态成员,所可以通过外部类名的方式直接访问,而不需要创建外部类的对象
	(2)静态内部类中的非静态成员,需要将所在的内部类对象创建出来之后,才能被访问
	(3)一个类是否需要创建对象,不是取决于该类本身是否为静态,而是取决于类中的成员是否为静态
3、静态成员内部类的对象创建格式:
	外部类名.内部类名 内部类对象名 =  new 外部类名.内部类名();
package com.DaYu;

public class Demo02 {
//静态的成员内部类
	public static void main(String[] args) {
		Computer_3.HardDisk c3 =  new  Computer_3.HardDisk();
		c3.show();
		System.out.println(Computer_3.age);
		System.out.println(Computer_3.HardDisk.romSize);
	}
}

class Computer_3 {
	private String brand = "神舟";
	static int age;
	static class HardDisk {
		String Hardbrand = "三星";
		static String romSize = "500G";
		public HardDisk() {
			
		}
		
		public void show() {
			System.out.println(Hardbrand + romSize);
		}
	}
	
}

局部内部类

1、定义在方法中的类
2、局部内部类的访问说明
	方法中的局部变量,外界都不能访问到
	所以方法中定义的内部类,外界也没有办法访问到
3、解决方式
	在方法内部,创建内部类的对象,访问内部类中的成员
	外界调用局部内部类所在的方法,间接的创建局部内部类的对象,间接访问局部内部类中的成员
	注意:局部内部类在使用方法中定义的局部变量的时候,默认加上了final,不能进行二次赋值
package com.DaYu;

public class Demo03 {
//局部内部类
	public static void main(String[] args) {
		Computer_4 com = new Computer_4();
		com.lookMovie();
		System.out.println();
	}
}

class Computer_4 {
	private String brand = "华硕";

	public Computer_4() {
		super();
	}

	public void lookMovie() {
		final String movieName = "战狼";
//		局部内部类
		class DisPlay {
			String tbrand = "TCL";

			public DisPlay() {
				super();
			}

			public void show() {
				brand = "";
//				局部内部类中,访问局部变量的时候,局部变量默认加上final
//				movieName = "风云"; 无法二次赋值
				System.out.println(brand +"不要打扰我,我正在使用" + tbrand + "显示器看" + movieName);	
			}
		}

		DisPlay dis = new DisPlay();
		dis.show();
	}

	public void test() {
//		System.out.println(movieName); 无法访问
//		DisPlay dis = new DisPlay();  无法创建
	}
}

匿名内部类

1、没有名字的内部类
2、匿名内部类的使用前提:
	必须继承一个类或者实现一个接口!!!
3、格式:
	new 父类类名或者接口名(){
		父类方法的实现或者接口内容的实现;
	};
4、本质:
	匿名内部类就是创建了一个类或接口的子类对象
package com.DaYu;

public class Demo01 {
	public static void main(String[] args) {
       //匿名内部类,看成MyFu的一个子类对象
		new MyFu() {
			@Override
			public void test() {
				System.out.println("匿名内部类");
			}
			
		}test();
		
        //实现了MyInter接口的一个子类对象
		MyInter mi = new MyInter() {
			
			@Override
			public void inte_2() {
				System.out.println("inte_2");
			}
			
			@Override
			public void inte_1() {
				System.out.println("Inte_1");
			}
		};
		mi.inte_1();
		mi.inte_2();

		//实现了MyInter接口的一个子类对象
			new MyInter() {
			
				@Override
				public void inte_2() {
					System.out.println("inte_2");
				}
				
				@Override
				public void inte_1() {
					System.out.println("Inte_1");
				}
			}.inte_1();
	}
}

//接口
interface MyInter {
	public abstract void inte_1();
	public abstract void inte_2();
}

//父类
abstract class MyFu{
	public abstract void test();
}
package com.DaYu;

import java.util.Scanner;

public class Demo2 {
	 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个整数 系统会为你分配一位老师");
        int input = scanner.nextInt();
        Teacher teacher = School.getTeacher(input);
        teacher.teach();
     } 
}
//定义一个学校类
class School {
 // 选课系统的方法  接收一个整数  可以选老师
 	public static Teacher getTeacher(int a) {
 // 把两个老师 作为两个局部内部类 
         if (a % 2 == 0) {
            return new Teacher() {
                     @Override
                     public void teach() {
                       System.out.println("教java");
                     }
                   };
          } else {
                  return new Teacher() {
                          @Override
                           public void teach() {
                           System.out.println("抽烟喝酒烫头");
                          }
                        };
             }
     } 
}                     
//接口
interface Teacher {
 void teach();
}

猜你喜欢

转载自blog.csdn.net/qq_41401295/article/details/106519431