单例设计模式

一个类只能存在一个对象实例,并且该类只有一种取得其对象实例的方法;

另外单例设计模式还分两种:

  • 懒汉式
  • 饿汉式

    饿汉式

    class Single_E{ 
        private String name;
        private static Single_E instance = new Single_E("粘豆包");
        private Single_E(String name){
            this.name = name;
        }
        public static Single_E getInstance(){
            return instance;
        }
    }

    懒汉式

    class Single_L{
      private String name;
      private static Single_L instance;
      public static Single_L getInstance(){
          if(instance == null){
              instance = new Single_L("粘豆包");
          }
          return instance;
      }
      private Single_L(String name){
          this.name = name;
          System.out.println("创建对象");
      }
    }

java 动态绑定机制

java的动态绑定机制

  • 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
  • 当调用对象属性时,没有动态绑定机制,哪里声明哪里使用
public class Main {
    public static void main(String[] args) {
        A a=new B();
        System.out.println(a.sum());
        System.out.println(a.sum1());
    }
}

class A{
    public int i = 10;
    
    public int sum(){
        return getI() + 10;
    }
    
    public int sum1(){
        return i + 10;
    }
    public int getI(){
        return i;
    }
}

class B extends A {
    public int i= 20;
    
    public int sum() {
        return i+ 20;
    }
    public int getI() {
        return i;
    }
    public int sum1(){
        return i+ 10;
    }
}

这里我们需要注意的是如果如上代码不做任何修改的话,打印的结果是:

40
30

现在我们对代码进行一定的修改然后再次查看打印结果

public class Main {
    public static void main(String[] args) {
        A a=new B();
        System.out.println(a.sum());
        System.out.println(a.sum1());
    }
}

class A{
    public int i = 10;
    
    public int sum(){
        return getI() + 10;
    }
    
    public int sum1(){
        return i + 10;
    }
    public int getI(){
        return i;
    }
}

class B extends A {
    public int i= 20;
    
    public int getI() {
        return i;
    }
    public int sum1(){
        return i+ 10;
    }
}

打印结果是

30
30

这个结果猛一看上去可能会有点晕,不太符合我们的预期,其实造成这样的显现是因为java的动态绑定机制。

修改代码以后运行类型虽然是B但是B中没有了SUM()方法,所以我们会向上查找父类的方法,在父类中找到了SUM()所以我们会运行父类中的SUM()方法,但是父类中的SUM()方法调用了一个getI()这里就容易把人搞晕了,因为这里父类和子类都有getI()这个方法,具体调用哪一个呢?

以为有java的动态绑定机制,所以会运行B类中的getI()方法,也就最终导致了运行结果为30


粘豆包
1 声望0 粉丝

生命不息,战斗不止!