接口\设计模式\内部类的初步了解

接口

可以理解为特殊的抽象类

关键字interface -->接口

接口的优点

  1. 接口是功能体的集合
  2. 是一个引用数据类型
  3. 能够解耦
  4. 规定开发规范

jdk在1.7之前

属性:

必须是公共的静态的常量 public static final

public staic final 可以选择性省略(默认)

方法:必须是公共的抽象的方法

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

public absract 可以选择性省略

注意:

  1. 接口的实现与类的继承非常像,但是不一样在:

    1. 子类继承父类就可以直接使用父类的内容
    2. 实现类实现接口,也拥有接口中的能力,但是需要实现列自己去实现这个功能
    3. 接口实现的关键字是implement,继承的关键字是extends
  2. 类只能单继承,接口可以多实现,一个类需要继承父类后实现接口.
    1. 如果先接口后继承,会造成系统无法判断接口的个数.
  3. 接口也不能实例化
  4. 接口的使用只能通过类去实现接口
    1. 具体的实现类:重写了所有的抽象方法+按需新增
    2. 抽象类的实现:按需重写了抽象方法+按需新增,具体的子类才能使用
      1. 在抽象类中,可以全部实现,也可以部分实现
      //抽象实现类
      abstract class Demo02 implements InterfaceDemo02{
      //  @Override
      //  public void demo2() {
      //      // TODO Auto-generated method stub
      //
      //  }
      
      
      }

  5. 继承和实现的几种情况
    1. 接口和接口之间是可以继承的
    2. 类和接口之间只能实现
    3. 接口之间可以多继承
    4. 类和接口之间可以多实现
//定义一个接口InterfaceDemo02
interface InterfaceDemo02{
    public void demo1();
}
//定义一个接口InterfaceDemo03
interface InterfaceDemo03{
    public void demo2();
}
//定义一个接口InterfaceDemo04 并继承InterfaceDemo02及InterfaceDemo03
interface InterfaceDemo04 extends InterfaceDemo02,InterfaceDemo03{
}

实现了接口

public class Demo implements InterfaceDemo02, InterfaceDemo03 {//与只实现InterfaceDemo04作用相同
    @Override
    public void demo2() {
        System.out.println("实现了接口02");
    }
    @Override
    public void demo1() {
        System.err.println("实现了接口03");
    }
}

jdk1.8中新增的内容

在接口中可以定义方法体的方法

  1. 默认方法:default关键字修饰(必须是显式的)

    1. 使用:通过实现类使用
  2. 静态方法
    1. 使用:接口名使用
public interface InterfaceDemo05 {
    //默认方法
    public default void moren(){
        System.out.println("我是默认方法");
    }
    //静态方法
    public static  void test(){
        System.out.println("我是静态方法");
    }
}
//实现类
class Impl implements InterfaceDemo05{
}

测试

public class Test {
    public static void main(String[] args) {
        //默认方法通过类实现
        Impl i=new Impl();
        i.moren();
        //静态方法通过接口名.方法调用
        InterfaceDemo05.test();
    }
}

设计模型

单例模式

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

实现

  1. 构造器私有化
  2. 私有的 静态的该类引用,存储创建唯一的对象
  3. 公共的 静态方法方式

两种方式

饿汉式

当第一次调用的时候才创建这个实例 ---线程不安全,效率较高

示例

//饿汉式
public class SingTon {
//1.构造器私有化
    private SingTon(){
    }
//2.私有的,静态的该类的引用,存储创建唯一的对象
    //在类的第一次加载时候,创建一个唯一的实例
    private static SingTon single=new SingTon();
?
//3.公共的 静态的方法方式
//返回值:当前数据类型  参数:没有
    private static SingTon newInstance(){
        //将当前创建的实例返回出去
        return single;
    }
}

懒汉式

在类的第一次加载完成之后,就创建这个实例 ---线程安全,效率较低

示例

//懒汉式
public class Single {
    //1.私有的构造函数
    private Single(){
    }
    //2.私有的 静态的 该类的引用,存储创建唯一的对象
    //先创建一个对象的默认参数为null
    private static Single single=null;
    //3.公共的静态的该类的引用
    public static Single newInstance(){
        //先判断实例是不是为空,如果为空则新建
        //如果不为空则返回上一次对象的地址
        if(single==null){
            Single single=new Single();
        }
            return single;
        }
}

代理模式

静态代理:

  1. 真实角色和代理角色实现相同的接口|继承相同的父类
  2. 代理角色持有真实角色的引用:成员属性进行维护
  3. 代理行为

注意:减少与真实角色的交流,降低耦合度,起到功能的扩展,方便后期维护

/*经理要通过人事招人,相当于  技术部经理 找了 人事当代理
真实角色:经理
代理:人事  
行为:招人(人事和经理都需要实现)
代理模式就是把真实角色作为代理角色的一个成员变量
*/
public class StaticProxy {
    public static void main(String[] args) {

    }
}
//经理
class Manager implements Hiring{
    @Override
    public void hiring() {
        System.out.println("我是经理,我要招人");
    }
}
//人事
class Hr implements Hiring{
    Manager manager;
    //完全可以通过构造函数把真实角色引入到这个代理角色中
    public Hr(Manager manager) {
        super();
        this.manager = manager;
    }
    @Override
    public void hiring() {

        System.out.println("我是人事,我要初试");
        //重头戏 把真实角色当成代理模式的一个成员
        this.manager.hiring();
        System.out.println("成功录取");
    }
}
//行为:招人
interface Hiring{
    void hiring();
}
//测试
class Test{
    public static void main(String[] args) {
        Manager m=new Manager();
        Hr h=new Hr(m);
        h.hiring();
    }
?
}

工厂模式

/*
 *需求:我们直接从工厂拿车,如果是两轮输出两轮
 *      四轮输出四轮 
 * 
 */
public class Factory {
?
    public static void main(String[] args) {
        Car two=new TwoCar();
        Car four=new FourCar();
        Factory f=new Factory();
        two.make();
        f.factory(two);
        two.run();
        four.make();
        f.factory(four);
        four.run();




    }
    /*
     有一家工厂可以造两个轮子也可以造四个轮子
    一工厂是可以生产车的,这个是一个功能(方法)
    结果:确定这个是方法
    二工厂是可以生产不同的车的,可以创建不同的对象
    结果:确定方法体的内容
    三工厂无论生产哪种类型的车都是车,所以返回值一定是车
    结果:确定返回值类型
    四工厂生产车,需要给输入值
    结果:确定参数
    */
    //看传入的是否是 TwoCar或ForCar的一个实例
    public static Car factory(Car srt){
        if(srt instanceof TwoCar){
            System.out.println("在造两轮");
        }
        if(srt instanceof FourCar){
            System.out.println("在造四轮");
        }
            return srt;
    }
}
interface Car{
    void make();
    void run();
}
class TwoCar implements Car{
?
    @Override
    public void make() {
        System.out.println("我是造两轮的模板");
    }
?
    @Override
    public void run() {
        System.out.println("乌龟");
    }

}
class FourCar implements Car{
?
    @Override
    public void make() {
        System.out.println("我是造四轮的模板");
    }
?
    @Override
    public void run() {
        System.out.println("飞一样的感觉");
    }
}

内部类

  1. 成员内部类
  2. 静态内部类
  3. 私有内部类
  4. 局部内部类
  5. 匿名内部类

成员内部类

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

外部成员----------内部类

特点:

  1. 是成员就具有成员的特点,就是可以使用成员修饰符修饰
  2. 是类就有类的特点,可以继承及实现
  3. 内部类可以使用外部列的内容,包括私有的
  4. 在外部类中可以通过内部类的对象使用其成员
  5. 成员内部类中不能定义静态内容除了静态常量

私有内部类

  1. 私有内部类可以使用外部类中的私有内容
  2. 外部类中可以使用私有内部了中的私有内容,需要通过内部类对象使用
  3. 私有的内部类中只能在外部类中使用,其他类中无法使用

静态内部类

  1. 只有静态内部类中可以定义静态的内容,除了静态的内容
  2. 静态内部类中使用外部类中的成员,通过外部类对象使用,因为内部类是静态

局部内部类

  1. 方法中的内部列
  2. 不能使用成员修饰符 public static(final可以)
  3. 局部只能在它当前定义的方法中使用,通过对象使用
  4. 如果想要在局部内部类中使用当前方法的参数,这个参数必须被final修饰,在jdk1.8中final可以省略,但是默认

匿名内部类

  1. 匿名内部类
  2. 匿名对象的内部类
  3. 方法的参数

原文地址:https://www.cnblogs.com/wuzhaoming/p/11741231.html

时间: 2024-11-08 17:17:43

接口\设计模式\内部类的初步了解的相关文章

Java核心技术 第六章 接口和内部类

Java核心技术  第六章  接口与内部类 接口: 任何实现Comparable接口的类都需要包含compareTo方法,并且这个方法的参数必须是一个Object对象,返回一个整数数值. 在Java SE 5.0中,Comparable接口已经改进为泛型类型. 接口中所有的方法自动的属于public.因此,在接口中声明方法时,不必提供关键字public. 接口中决不能含有实例域,也不能在接口中实现方法. 要让一个类使用排序服务,必须让它实现compareTo方法,因此必须实现Comparable

第11章 接口与内部类

1.接口的定义和实现2.内部类的使用3.接口和内部类的意义 Java程序设计中的接口,也是一种规范.这个接口定义了类应该做什么?但不关心如何做?即接口中只有方法名,没有具体实现的方法体. 用关键字"interface"来声明. interface school{ void setSchoolName(String schoolName); void setClassName(String schoolClassName);} 类实现接口时要使用implements关键字.class s

接口和内部类

接口的定义:接口不是类,是对类的一组需求描述. 如何实现接口:1.将类声明为实现给定的接口(implements) 2.对接口中的所有方法进行定义(实现) 接口的特性:1)接口变量必须引用实现了接口的类对象 2)可以使用 instanceof 检查一个对象是否实现了某个接口 3)与可以建立类的继承关系一样,接口也可以被扩展 例如:public interface Powerd  extends Moveable 4)接口中不能包含 实例域 和 静态方法,但可以包含常量. 5)接口中的方法 自动被

[Java学习笔记] Java核心技术 卷1 第六章 接口与内部类

第6章 接口与内部类 6.1 接口 一个类可以实现一个或多个接口,并在需要接口的地方,随时使用实现了相应接口的对象. 在接口声明中,方法自动public,可以不写修饰符.在实现接口时必须把方法声明为public. 一个接口中可以包含多个方法,还可以定义常量,自动设置public static final 声明在接口中的内部类自动成为static和public类. 接口中不能含有实例域,也不能在接口中实现方法.提供实例域和方法实现的任务应该由实现接口的那个类来完成. 可以将接口看成是没有实例域的抽

Java面向对象程序设计--接口和内部类

1.接口的定义: In the Java programming language, an interface is not a class but a set of requirements for classes that want to conform the interface. 说明: 1) Interface 不是class,虽然interface具有class的一些特点,例如能够继承,能够定义相同类型的变量,而且和C++的abstract class非常像,但Java 的inter

51CTO大数据学习003-抽象类、接口、内部类

今天学习完了大数据第七天的课程.总结一下抽象类.接口.内部类的内容. 接口的使用,可以降低代码的耦合性,抽象类,体现了Java编程的面向对象特性.Java中只支持单继承,即每个类只能继承一个上级父类,但是可以传递.接口可以实现多个,这也从另外一个角度实现了类的多继承. 实现接口使用关键字implements,抽象类使用abstract关键字.接口中的方法,全是抽象方法,而抽象类中可以有抽象方法,也可以没有抽象方法.抽象类不能实例化.子类继承抽象类,需要实现父类中的抽象方法.接口中的方法,全部都用

9.接口与内部类

一.抽象类 不可以被实例化为对象 必须被继承 不能用final修饰 属于后期(动态)绑定 在设计阶段要确定好是否定义抽象类 例子:哺乳动物类 abstruct class buru(){} 2.抽象方法 是不完整的方法,只有声明,但没有方法主体 仅代表一种类型或功能,而不是具体的实现细节 子类必须重写父类的抽象方法 如果不想重写,那子类也必须是抽象类 二.接口 例子:虽然球类和轮胎类没有直接联系,但是可以赋予他们一种通用的行为:弹跳 可以解决单继承的缺陷 接口中的方法也没有方法体body,方法时

Java基础语法<九> 接口与内部类

1 接口  interface implement 接口的所有方法自动地属于public.因此,在接口中声明方法时,不必提供关键字public. 接口可以包含多个方法,接口中可以定义常量.接口中的域将被自动设为public static final. SwingConstants就是只定义了常量,而没有定义方法,任何实现了SwingConstant接口的类都自动地继承了这些常量,并可以在方法中直接地引用一些常量. 1.1 接口的特性 接口不是类,尤其不能使用new运算符实例化一个接口 但是可以声

黑马程序员——JAVA学习笔记四(继承、接口、内部类)

1,    通过extends关键字让类与类之间产生继承关系.多个类中存在相同属性和行为时,将这些内容抽取到单独的一个类中,那么多个类无需定义这些属性和行为,只要继承那个类即可,已存在的类叫做超类,基类,或父类.新类称为子类,派生类,孩子类. 子类可以直接访问父类中的非私有的属性和行为.子类无法继承父类中私有的内容.JAVA不支持多继承,只支持单继承,多实现. 继承提高了代码复用性,让类与类之间产生了关系.为多态提供了前提. 2,    super关键字代表父类中成员变量内存空间的标示.两个作用