单例模式 继承 java_六、java基础-单例模式_继承_覆盖_多态

1、单例模式:

1)提出原因

是由gof 也就是四人组提出来的。为了保证jvm中某一类型的java对象永远只有一个,同时也是为了节省内存的开销。因为外面程序可以通过new的方法直接调用类里面的构造方法。导致该类的对象不止一个。

2)定义

单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

A、构造方法私有化;

B、对外提供一个公开的、静态的、获取当前类型对象的方法

C、提供一个当前类型的静态变量。

3)分类

A、饿汉式单例模式:在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public classCustomerSingleton {private static CustomerSingleton instance = new CustomerSingleton();//静态私有成员,已初始化

privateCustomerSingleton()

{//私有构造函数

System.out.println("私有构造函数执行");

}public static CustomerSingleton getCustomerInstance() //静态,不用同步(类加载时已初始化,不会有多线程的问题)

{returninstance;

}

}

View Code

B、懒汉式单例:类加载时不初始化

当调用getInstance方法的时候,底层的对象才会考虑创建,所以显得比较懒

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public classUserSingleton {//提供一个当前类型的静态变量

public static UserSingleton intance=null;//构造方法私有化

privateUserSingleton(){

System.out.println("构造函数私有化");

}//对外提供一个公开获取Singleton 对象的方法

public staticUserSingleton getInstance(){if(intance==null){

intance=newUserSingleton();

}returnintance;

}

}

View Code

2、继承

1)继承的语法:java中类只支持单继承,一个类继承了A类就无法再继承B类,继承是面向对象的重要概念。一个类没有现实的继承其他类,默认继承sun提供的java.lang.object

[修饰符列表] class  子类名   extends   父类名{

类体;

}

备注:

java语言中子类继承父类,会将父类中所有的数据全部继承,包括私有的也能继承过来;

但是在子类中无法直接访问父类中的私有数据。但是可以间接访问,构造方法无法被子类继承。

3、方法的覆盖

1)什么时候方法要进行覆盖?

如果父类中的方法已经无法满足当前子类的业务需求,需要将父类中的方法进行覆盖重新子类如果重写父类的方法之后,子类对象一定调用的是重写之后的方法。覆盖指的是成员方法和成员变量无关。

2)发生方法覆盖的条件:

第一:发生在具有继承关系的两个类之间

第二:必须具有相同的方法名,相同的返回值类型,相同的参数列表

第三:重写的方法不能比被重写的方法拥有更低的访问权限

第四:重写的方法不能比被重写的方法抛出更宽泛的异常

第五:私有的方法不能被覆盖(因为私有方法无法被子类访问,所以不能重写;必须是public的方法才能被覆盖,如果定义成了final是不可以被重写的)

第六:构造方法无法被覆盖,因为构造方法无法被继承。

第七:静态的方法不存在覆盖

第八:覆盖指的是成员方法,和成员变量无关。

4、多态

向上转型:子转父(父类型的引用,指向子类型的对象);

向下转型:父转子(子类型的引用,指向父类型的对象);

多态编译期是静态绑定,而运行期是动态绑定

5、多态的经典例子

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public classPerson {public voidfeed (Animal a){

a.eat();

}

}public classAnimal {public voideat(){

}

}public class Dog extendsAnimal {public voideat(){

System.out.println("狗在吃肉");

}

}public class Cat extendsAnimal {public voideat(){

System.out.println("猫在吃鱼");

}

}public classTest01 {public static voidmain(String[] args) {

Person p1=newPerson();

Dog d1=newDog();

Cat c1=newCat();

p1.feed(d1);

p1.feed(c1);

}

}

View Code

更多设计模式理解,可参看博文:https://www.cnblogs.com/jiarui-zjb/p/9637308.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值