内部类 基本设计模式(单例 工厂)

内部类

局部内部类

局部内部类等同于局部变量

注意 : 局部内部类 在访问外部方法中的局部变量的时候需要加final修饰(1.8之前),从1.8开始 final可以省略

局部内部类中,不能有静态声明

如果是成员方法中的局部内部类,可以访问外部类中所有 的属性

如果是静态方法中局部内部类, 不可以直接访问外部类的成员属性

以下是成员方法局部内部类和静态方法局部内部类的代码

package com.tleducation.OuterClass;

import org.omg.CORBA.PRIVATE_MEMBER;


public class OuterClass1 {
/*
 * 局部内部类等同于局部变量
 * 里面不能声明 静态变量
 * 如果在成员方法内   可以访问外部所有属性
 * 如果是在静态方法内  访问成员属性的时候需要实例化对象访问
 */
	
	
	//成员属性
	public int age=1;
	public static String name="张三";
	
	
	public static void main(String[] args) {
		OuterClass1.m1();
		OuterClass1 outerClass1 = new OuterClass1();
		outerClass1.m2();
	}
	
	//静态方法
	public static void m1(){
	   int a=2;
	   //声明局部内部类    不能加权限修饰符
	  class Aaa{
		  public void m3(){
			  //如果外部调用成员属性  要声明对象调用   
			  OuterClass1 outerClass1 = new OuterClass1();
			  int age2 = outerClass1.age;
                 System.out.println(age2);	
                 //可以直接调用静态属性
                 System.out.println(OuterClass1.name);
                 System.out.println(a);
		  }
	  }
	  //调用局部内部类方法的时候只能在此静态方法内调用
	  Aaa aaa = new Aaa();
	  aaa.m3();
	}
	
	
	//成员方法
	public void m2(){
	class Bbb{
		public void m4(){
			System.out.println(OuterClass1.name);
			System.out.println(age);
		}
	}
	
	//只能在此成员方发内调用局部类
	Bbb bbb = new Bbb();
	bbb.m4();
	}
}


``

匿名内部类

匿名内部类 : 指在方法调用时,实参需要传入某个接口对象的时候,不传入对象,传入一个匿名的实现类

如果方法定义形成 一般是个接口,那么调用的时候,就需要传入其实现类的对象

但是可以不实现这个接口,不传递实现类对象,传递一个匿名内部类,这个类,没有名字,不能复用

默认的匿名内部类类名 : 外部类类名$1 一次类推

那么既然是没有名字的类,那么我们自然无法创建对象,但是传入匿名内部类的 时候回自动创建一个对象

package com.tleducation.OuterClass;
/**
* 匿名内部类
* @author 樊振华
* @Date 2021年1月19日
*/
public class OuterClass2 {

   
   public static void main(String[] args) {
   	
   	// 匿名内部类写法
   			// 少定义一个类
   			// 但是无法重复使用
   	//此方式为直接进行匿名内部类调用   
   	m1(new Anmals() {
   		
   		@Override
   		public void shout() {
          System.out.println("wangwangwang");				
   		}
   	});
   }
   
   public static void m1(Anmals anmals){
   	anmals.shout();
   }
   
}


//定义一个接口
interface Anmals{
   void shout();
}

设计模式

代表了最佳的实现方式,是一些有经验的开发人员,通过开发中总结出来的一些经验和错误,用来解决一系列问题
是前辈们对代码开发经验的总结,不是特定的语法结构,而是一套用来提供可复用性,可维护性,可读性,健壮性,安全性的解决方案

就是在编码实践中发现很多的编码方式经常会被用到,于是就总结出来 形成固定的结构
如果开发中,用到了一些设计模式的话,就等于使用了他人总结的经验成果,可以避免很多问题

目前比较成熟的设计模式 有23种

单例模式

单例模式 : 只让某个类创建一个对象

实现步骤 :

	首先我们要控制创建对象的数量,就不能让用户决定创建和不创建,应该由我们去控制

	构造方法是用来创建对象的,想要把创建对象的权利 控制在我们手中的话,那么就不能让用户直接访问我们的构造方法

	1 构造方法私有化
			我们已经把构造方法私有化了,就意味着用户创建不了对象了
			那么这个时候,我们应该创建一个对象给用户,怎么给?
			对外提供一个公共的静态方法,调用该方法就能返回一个对象,
	2 创建一个公共的静态的方法用来返回当前类的对象,并且保证 只实例化一次
		当调用处通过该方法获取对象的时候,先判断是否已经创建了对象,如果没有就创建一个并存储
			如果已经创建  就直接返回该对象
			所以 需要 一个存储对象的变量,这个变量必须是和类生命周期相关的
			如果是一个局部变量的话,方法每次调用,都会重新初始化局部变量,所以 每次都会创建对象
			如果是个成员变量,那么问题更严重,静态方法中不能直接操作成员变量
			所以 只能是静态变量,并且这个变量要私有化不能被外部访问,外衣用户直接更改变量的值咋办?
	3 创建一个私有化的静态变量,用于存储当前类的对象(变量的类型,是当前类类型)

根据对象不同的创建时机,分为两种情况
1 懒汉模式 : 第一次获取对象的时候,再创建对象

package com.tiliedu.单例;
//此为懒汉式单例
public class Singleton {
 //私有化构造方法    目的是防止外部访问
	private Singleton(){
		
	}
	//定义一个静态成员变量          
	private static Singleton a;
	//定义一个公共的返回类对象的成员方法
	public static Singleton getInstance(){
		//判断静态成员是否有对象
		if (a==null) {
			a=new Singleton();
			
		}
	 return a;
	}
	
}

2 饿汉模式 : 加载类的时候,就创建对象

package com.tiliedu.单例;

public class Singleton1 {
//私有化构造方法  防止外部访问
	private Singleton1(){
		
	}
	//私有化静态成员变量
	private static Singleton1 a=new Singleton1();
	//定义一个公共的get方法  目的是给外部属性访问
	public static Singleton1 getInstance(){
		return a;
	}
}

工厂模式

工厂模式 : 把创建对象的语句单独封装成一个工厂模式

这样 所有用到这个对象的地方,都去工厂中获取,把类之间强依赖关系变弱,灵活度更高

定义一个接口 两个实现类实现这个接口
然后创建一个工厂对象 可以任意调用这两个实现类

接口

package com.tiliedu.单例;

public interface User {
public abstract void does();
}

实现类
package com.tiliedu.单例;

public class Teacher implements User{

	@Override
	public void does() {
System.out.println("老师教学");		
	}

}



package com.tiliedu.单例;

public class Students implements User{

	@Override
	public void  does() {
   System.out.println("学生学习");		
   
	}

}


工厂

package com.tiliedu.单例;
/*
 * 工厂类
 */
public class Factory {
public static void getUser(){
	
}
}


测试类
public class Aa{
	public static void main(String[] args) {
		getAaa(new Students());
		getAaa(new Teacher());
		
	}
	public static void getAaa(User user){
		user.does();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值