单例设计模式
一个类只能存在一个对象实例,并且该类只有一种取得其对象实例的方法;
另外单例设计模式还分两种:
- 懒汉式
饿汉式
饿汉式
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。