内部类,单例,工厂,代理

  • 内部类

在一个类中定义的类就是内部类

  • 成员内部类

 *         1.Outer01$Inner.class class文件名   $ 代表内部类的意思
 *      2.内部类也是类,是类就可以继承,实现接口...
 *      3.成员内部类处于成员位置,就可以使用成员修饰符进行修饰
 *      4.在内部类中可以直接使用外部类中的成员变量
 *      5.在外部类中不可以直接使用内部类中的成员,需要通过对象使用
 *      6.在成员内部类中不可以定义静态的内容,除了static final修饰的变量
 *      7.成员内部类要定义在类中成员的位置

           内部类声明成静态的,就不能随便的访问外部类的成员变量了,

       此时内部类只能访问外部类的静态成员变量 。

public class Outer {
	// 成员属性
	int age = 19;
	String name = "卢双双";
	static double d = 2.2;

	// 成员内部类
	class Inner extends Test implements Face {
		// 内部成员属性
		int num = 555;
		static final char ch = 'a';

		// 内部类成员方法
		public void inMethod() {
			System.out.println("内部类成员方法" + a);
			System.out.println("内部类静态变量ch	" + ch);
			// 测试内部类中使用外部类中的成员属性
			System.out.println("外部类age" + age);
			System.out.println("外部类静态属性" + d);
			// 测试内部类中使用外部类中的成员方法
			outMethod();
		}

		@Override
		public void face() {
			System.out.println("重写的face");

		}
	}

	// 成员方法
	public void outMethod() {
		System.out.println("外部类的成员方法");
		// 创建内部类对象调用内部属性
		Inner in = new Inner();
		System.out.println("使用内部类的成员属性" + in.num);
		System.out.println("使用内部类的成员属性" + in.ch);
		// in.ch='ddd';常量
		in.face();
		//in.inMethod();  不能循环调用
	}
}

interface Face {
	void face();
}




/*
 * 测试成员内部类
 * 		使用内部类是有公式的
 */
public class Test {
	int a = 7;

	public static void main(String[] args) {
		Outer out = new Outer();

		// 内部类创建对象的 ----第一种方式
		Outer.Inner in = out.new Inner();
		System.out.println(in.num);
		in.inMethod();

		// 内部类创建对象的 ----第二种方式
		Outer.Inner in2 = new Outer().new Inner();
		System.out.println(in2.num);
		in2.inMethod();

		OuterDemo.Inner in3 = new OuterDemo().new Inner();
		in3.innerTest();
	}
}
  • 静态内部类

 *         静态内部类可以定义静态内容和非静态内容
 *         静态内部类中不可以直接使用外部类中的非静态内容,可以
 *     直接使用静态内容
 *         
 *         静态内部类的使用:
 *             StaticInner.Inner in = new StaticInner.Inner();

public class StaticInner {
	public static void main(String[] args) {
		//静态内部类的使用方式
		System.out.println(StaticOuter.Inner.ch);
		//通过创建对象使用静态内部类的成员
		StaticOuter.Inner in = new StaticOuter.Inner();
		in.inMethod();
		in.inMethod2();
	}
}
//外部类
class StaticOuter{
	String type = "藏獒";
	static int a = 5;
	
	//静态内部类
	static class Inner{
		//成员属性
		double d = 1210.11;
		//静态属性
		static char ch = 'a';
		
		//静态方法----不可以直接使用静态内部类的非静态属性
		static void inMethod(){
			System.out.println("内部类静态方法");
			Inner in = new Inner();
			System.out.println(in.d);
			System.out.println(ch);
			System.out.println(new StaticOuter().type);
			new StaticOuter().outMether();
		}
		
		//成员方法---静态内部类中不可以直接使用外部类中的非静态内容
		public void inMethod2(){
			System.out.println("内部类非静态方法");
			System.out.println(d);
			System.out.println(a);
			System.out.println(ch);
			StaticOuter in = new StaticOuter();
			System.out.println(in.type);
			in.outMether();
		}
	}
	public void outMether(){
		System.out.println("静态外部类的成员方法");
	}
}
  • 私有内部类

 * 私有内部类:
 *         1.私有的内容只能本类中使用;
 *         2.私有内部类无法在其他外部类中使用或者访问,
 *     只能在当前外部类中通过创建对象使用.

public class PrivateInner {
	public static void main(String[] args) {
		// 创建私有内部类的对象
		// PrivateOuter.Inner in = new PrivateOuter().new Inner();
		PrivateOuter p = new PrivateOuter();
		p.outMethod();
	}
}

// 外部类
class PrivateOuter {
	private String name;
	private int age;

	// 内部类
	private class Inner {
		// 成员属性
		private String s = "哈哈";
		private int i = 123;

		// 私有内部类的方法
		private void inMethod() {
			System.out.println("私有内部类的私有方法");
		}
	}

	// 成员方法
	public void outMethod() {
		System.out.println("外部类中的成员方法");
		// 创建内部类对象
		Inner in = new Inner();
		System.out.println(in.i);
		in.inMethod();
	}
}

 

  • 局部内部类

 * 局部内部类
 *         在一个方法中定义的内部类,就是局部内部类
 *         局部内部类在外部无法使用,只能在定义的方法中通过东西使用
 *         如果想要使用局部内部类的成员属性,可以使用方法的返回值
 *         局部内部类不能被public  static  private   protected 成员修饰符修饰
 *         局部内部类想使用当前定义中的参数,必须在前面加final
 *  JDK1.8 后,可以省略,默认有final

public class PartInner {
	public static void main(String[] args) {
		PartOuter out = new PartOuter();
		out.test(5);
		out.outMethod1();
	}
}

// 外部类
class PartOuter {
	// 方法
	Object test(final int i) {
		// 局部变量
		int a = 10;// 方法中的局部变量不能被调用
		// i++;

		// 局部内部类
		class Inner {
			private int b = 3;

			public int inMethod() {
				System.out.println("局部内部类方法");
				System.out.println(i);
				System.out.println("方法内" + b);
				return -1;
			}
		}
		Inner in = new Inner();
		System.out.println("方法外" + in.b);
		return in.inMethod();
	}

	void outMethod1() {
		System.out.println("外部类成员方法");
		// Inner in = new Inner();
		// - Inner cannot be resolved to a type
	}
}
  • 匿名内部类

匿名内部类就是没有名字的局部内部类,

不使用关键字class, extends, implements, 没有构造方法。

匿名内部类隐式地继承了一个父类或者实现了一个接口。

匿名内部类使用得比较多,通常是作为一个方法参数

/*
 * 匿名内部类
 */
public class AnonymousInner {
	public static void main(String[] args) {
		// Father fa = new Son();

		// 匿名内部类 ---第一种使用方式:只能使用一次
		new Father() {// 匿名内部类 Father就是匿名内部类的父接口或者父类

			@Override
			public void laugh() {
				System.out.println("富士山下");
			}

			@Override
			public void eat() {
				System.out.println("淘汰");
			}

		}.eat();// = new Son.eat();

		// 匿名内部类 ----第二种方式
		// 接口多态
		Father fa = new Father() {

			@Override
			public void laugh() {
				System.out.println("一条大河波浪宽");
			}

			@Override
			public void eat() {
				System.out.println("风吹稻花香两岸");
			}

		};
		fa.eat();
		fa.laugh();

		// 匿名内部类 ----第三种方式
		test(new Father() {

			@Override
			public void laugh() {
				System.out.println("我吃车厘子!!!");
			}

			@Override
			public void eat() {
				System.out.println("我吃披萨!!!");
			}

		});
	}

	static void test(Father fa) {
		fa.eat();
		fa.laugh();
	}
}

// 接口 Father
interface Father {
	void laugh();

	void eat();

}

// 实现类
/*
 * class Son implements Father {
 * 
 * @Override public void laugh() {
 * 
 * }
 * 
 * @Override public void eat() {
 * 
 * } }
 */
  • 单例

 * 单例模式: 一个类只能创建一个对象
 * 
 * 单例模式分类:
 *         1.饿汉式:第一次加载类就创建一个对象
 *         2.懒汉式:当第一次调用功能的时候才会创建对象(线程不安全--锁解决)
 * 
 * 步骤:
 *         1.私有构造器
 *         2.定义一个私有的,静态的,该类的,引用
 *         3.提供一个静态的,公共的方法,返回给用户一个对象

  • 懒汉式

public class SingleTon {
	//1.私有构造器:不想让其他类直接通过调用构造器创建对象
	private SingleTon(){
		
	}
	//2.定义一个私有的,静态的,该类的,引用
	private static SingleTon singleTon=null;
	//3.公共的静态的方法,返回给用户一个对象
/*	public static SingleTon getInstance(){
		if (singleTon==null) {
			singleTon=new SingleTon();
		}
		return singleTon;
	}*/
	
	public static SingleTon getInstance(){
		if (singleTon==null) {
			//创建对象  A  B  C  
			synchronized (SingleTon.class) {//双重锁
				if (singleTon==null) {
					singleTon=new SingleTon();
				}
			}
		}
		return singleTon;
	}
	
	
}

 

  • 饿汉式

/*
 * 饿汉式:第一次加载就创建对象
 */
public class SingleTon2 {
	// 1.私有的构造器
	private SingleTon2() {

	}

	// 2.私有的静态的该类的引用
	private static SingleTon2 singleTon = new SingleTon2();

	// 公共的静态的方法
	public static SingleTon2 getInstance() {
		return singleTon;
	}
}
public class Test0809 {
	public static void main(String[] args) {
		// 测试懒汉式
		// SingleTon s=new SingleTon();--私有构造器无法创建对象
		SingleTon s1 = SingleTon.getInstance();
		SingleTon s2 = SingleTon.getInstance();
		System.out.println(s1 == s2);

		// 饿汉式
		SingleTon2 s3 = SingleTon2.getInstance();
		SingleTon2 s4 = SingleTon2.getInstance();
		System.out.println(s3 == s4);
	}
}

 

  • 工厂模式

 * 简单工厂模式:
 *         1.工厂角色
 *         2.抽象产品角色
 *         3.具体产品角色

public class Factory11 {
	public static void main(String[] args) {
		Car car = factory("BMW");
		car.run();
	}

	// 工厂角色
	public static Car factory(String type) {
		Car car = null;
		if (type.equals("BMW")) {
			car = new BMW();
			//return new BMW();
		} else {
			car = new QQ();
		}
		return car;
	}
}

// 抽象产品角色
interface Car {
	void run();
}

// 具体产品角色
class BMW implements Car {

	@Override
	public void run() {
		System.out.println("宝马在跑...");
	}

}

class QQ implements Car {

	@Override
	public void run() {
		System.out.println("qq在跑...");
	}
}
  • 静态代理

 * 静态代理:
 *     1.真实角色和代理角色持有相同的接口
 *     2.代理角色持有持有真实角色的引用
 *     3.代理行为

public class StaticPox12 {
	public static void main(String[] args) {
		// 1,真实角色
		Boss boss = new Boss();
		boss = null;
		// 2.代理角色
		Hr hr = new Hr(boss);
		hr.addUser();
	}
}

// 接口 录用人
interface AddUser {
	void addUser();
}

// 真实角色
class Boss implements AddUser {

	@Override
	public void addUser() {
		System.out.println("项目经理说录用...");
	}

}

// 代理角色 功能的拓展
class Hr implements AddUser {
	// 2.代理角色持有持有真实角色的引用
	private Boss boss;

	// 无参构造
	public Hr() {
		// TODO Auto-generated constructor stub
	}

	// 在有代理角色之前就应该存在真实角色
	public Hr(Boss boss) {
		super();
		this.boss = boss;
	}

	@Override
	public void addUser() {
		System.out.println("通知求职者来面试");
		boss.addUser();
		System.out.println("谈薪资...");
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值