JAVA的接口与程序设计模式

165 阅读6分钟

接口

接下来我跟大家分享一下我在Java学习中对于接口的认识

1.接口的定义

接口 interfance在java中相当于特殊的抽象类,定义一个接口如下:

interfance InterfanceDemo{
    
}

在接口的应用中,内部的成员属性被public static final(公共的静态的常量)修饰,通常默认省略public static final 内部方法格式为(public abstract可以省略):

public abstract  返回值类型  方法名();

2.接口的使用

  • 接口的实现与类的继承非常像,但是内容不同,在子类继承父类就可以直接使用父类的内容

  • 类只能单继承,接口可以多实现,一个类需要继承父类后实现接口

  • 接口不能实例化

  • 在java中接口与接口之间可以继承,类和接口之间只能实现,接口之间可以多继承,类与接口之间可以多实现

public interfance InterfaceDemo01{
    public static final int a=5;
    int b=10;
    
    //公共抽象方法
    public abstract void haha();
    int hehe();
}

interfance InterfanceDemo02{
    void heihei;
}

//A中就包含了继承的所有接口中的内容
interfance A extends InterfanceDemo01,InterfanceDemo02{}
  • 实现使用关键字implements 继承使用关键字extends
  • 实现类的接口,也拥有接口中的能力,但是需要实现类去自己实现这个功能.

public class Demo01  extends Fu implements  InterfanceDemo01,InfanceDemo02{
    @Override
    public void haha(){
        System.out.println("啥,哈哈哈");
    }
    @Override
    public int hehe(){
        System.out.println("我就呵呵");
    }
    @Override
    public void heihei(){
        System.out.println("我想嘿嘿嘿");
    }
    //新增方法
    public void houhou(){
        System.out.println("呼呼呼");
    }
}
//抽象实现类
abstract class Demo implements InferfanceDemo01{
    @Override
    public void haha(){
        System.out.println("hhhhhhh");
    }
}
class Fu{}

程序设计模式

1.单例模式

1.定义:

保证一个类只能有一个对象,这个特点形式的类成为单例模式,但是不影响类中原有的功能

2.单例

单例的实现:

1.构造器私有化

2.私有的,静态的该类的引用,存储创建唯一的对象的

3.公共的静态的访问方式

单例的方式很多,我们来说说主要的两种单例

  • 懒汉式:在第一次调用的时候创建这个实例 ----线程不安全的,效率较高
public class Single{
    //2.私有的,静态的该类的引用
    private static Single=null;
    //1.私有的构造器
    private Single(){}
    //3.公共的静态的该类的引用
    public static Single newInstance(){
        if(single==null){
            single=new Single();
        }
        return single;
    }
}

  • 饿汉式:在类第一次加载完成之后,就创建这个实例 ----线程安全的,效率较低
public class SingleTon{
    //2.私有的,静态的该类的引用,存储创建唯一的对象的
    private static SingleTon single=new SingleTon();
    //1.构造器的私有化
    private SingleTon(){
        
    }
    //3.公共的静态的访问方式
    //返回值:当前类型的对象  参数:没有
    public static SingleTon newInstance(){
        return single;
    }
}

2.工厂模式

public class Factory {
	Computer co=null;
	public static void main(String[] args) {
		Factory fc=new Factory();
		
		Computer c=fc.factory("Lenovo");
		c.play();
	}
	
	public  Computer factory(String str){
		
		if("Lenovo".equals(str) ){
			co=new Lenovo();	
		}else{
			co=new Hasee();
		}
		return co;
	
	}
}
//电脑接口
interface Computer{
	void play();
}

class Lenovo implements Computer{

	@Override
	public void play() {
		System.out.println("打游戏快的很");
	}
	
}
class Hasee implements Computer{
	
	@Override
	public void play() {
		System.out.println("打游戏卡卡卡");
		
	}
	
}

内部类

内部类即在类的内部再定义一个类,当一个类是类中成员,又是另一个事物时,它就被称为内部类

1.分类

成员内部类:当内部类作为外部类的成员的时候,就是成员内部类

静态内部类:用static修饰的内部类就是静态内部类

私有内部类:被private修饰的内部类

局部内部类:方法中的内部类

匿名内部类:有些实现类没有自己的功能,就是为了重写抽象类,为了不浪费类名,不让项目中的类过多,所以使用匿名类

2.成员内部类

是成员就具有成员的特点,就是可以使用成员修饰符来修饰

是类就有类的特点,可以继承,实现...

内部类中可以使用外部的类的内容,包括私有的

在外部类中可以通过内部类的对象使用其成员

成员内部类中不能定义静态的内容,除了静态的常量

public class Outer01 {
	public static void main(String[] args) {
		Outer01 outer01=new Outer01();
		outer01.outer();
		
		
	}
	int a =5;
	
	class Inner extends Fu implements A{
		String name="小明";
		static final int  age=18;
		int a=10;
		
		public void inner(){
			int a=20;
			System.out.println("我是成员类中的成员方法");
			System.out.println(name);
			//外部类中
			System.out.println(Outer01.this.a);
			//内部类中
			System.out.println(this.a);
			//局部类中
			System.out.println(a);
		}
	}
	public void outer(){
		System.out.println("我是外部类中的成员方法");
		Inner in=new Inner();
		in.inner();
		System.out.println(in.name);
		System.out.println(Inner.age);
	}
}
class Fu{}
interface A{}

3.私有内部类

私有内部类可以使用外部类中的私有内容

外部类使用私有内部类中的私有内容,需要通过内部类对象使用

私有内部类只能在外部类中使用,不能在其它类中使用

public class Outer02 {
	public static void main(String[] args) {
		Outer02 outer02=new Outer02();
		outer02.outer();
		
	}
	private int a=5;
	//私有内部类
	private class Inner{
		private int b=10;
		
		private void inner(){
			System.out.println("我是私有内部类中的私有方法");
			System.out.println(a);
			System.out.println();
		
		}
	}

	private void outer(){
		System.out.println("我是外部类中的私有方法");
		Inner in=new Inner();
		in.inner();
		System.out.println(in.b);
	}
}
	

3.静态内部类

静态内部类使用外部类中的成员,需要通过外部类的对象使用,因为内部类是静态的

在几种内部类中,只有静态内部类才可以定义静态的内容.除了静态的常量

public class Outer03 {
	public static void main(String[] args) {
		Outer03.Inner in=new Outer03.Inner();
		in.inner();
		in.inner2();
		Outer03 a=new Outer03();
		a.outer();
	}
	
	
	private static String haha="外部类中的静态变量";
	private String hehe="外部类中的成员变量";
	
	//静态内部类
	static class Inner{
		static int a=5;
		int b=10;
		
		static void inner(){
			System.out.println(a);
			System.out.println(new Inner().b);
			System.out.println(haha);
			System.out.println(new Outer03().hehe);
		}
		void inner2(){
			System.out.println(a);
			System.out.println(b);
			System.out.println(haha);
			System.out.println(new Outer03().hehe);
			
		}
	}
	public void outer(){
		System.out.println(Inner.a);
		System.out.println(new Inner().b);
	}
}

4.匿名内部类

匿名内部类的唯一目的只是为了实现接口

匿名内部类有三种使用方式:

1.接口多态

2.没有应用接收匿名内部类的对象地址,只能在当前行使用

3.做方法的参数

public class AnonymousDemo {
	public static void main(String[] args) {
		//1.匿名内部类  接口多态
		Smoke s=new Smoke() {
			
			@Override
			public void smoke() {
				System.out.println("吐星星");	
			}
			
			@Override
			public void haha() {
				System.out.println("哈哈");
				
			}
		};
		s.smoke();
		s.haha();
		//2.没有应用接收匿名内部类的对象地址,只能在当前行使用
		new Smoke() {
			
			@Override
			public void smoke() {
				System.out.println("吐宝宝");
				
			}
			
			@Override
			public void haha() {
				System.out.println("呵呵呵");
				
			}
		}.haha();
		
		new Demo().smoke();
		
		//3.做方法的参数
		test(new Smoke() {
			
			@Override
			public void smoke() {
				System.out.println("变星星变宝宝");
				
			}
			
			@Override
			public void haha() {
				System.out.println("哈哈哈呵呵呵");
				
			}
		});
		
	}
	public static void test(Smoke s){
		s.smoke();
	}
}

interface Smoke{
	void smoke();
	void haha();
}
class Demo implements Smoke{

	@Override
	public void smoke() {
		System.out.println("我会吐烟圈");
		
	}

	@Override
	public void haha() {
	
		
	}
	
}