java之单例设计模式,继承,final关键字总结
来源:互联网 发布:云霄生活网络 编辑:程序博客网 时间:2024/05/29 16:51
设计模式:解决某一问题最行之有效的方法。
单例设计模式:
解决一个类在内存中只存在一个对象,从而方便对实例个数的控制并节约系统资源。
想要保证对象唯一?
1,为了避免其它程序过多建立该类对象,先禁止其它程序建立该类对象。
2,还为了让其它程序可以访问到该类对象,只好在该类中自定义一个对象。
3,为了便于其他程序对自定义对象的访问,可以对外提供一些访问方式。
这三部怎么用代码实现呢?
1,将构造函数私有化(private)
2,在类中创建一个本类对象。
3,提供一个方法可以获取到对象。
两种形式:
1,饿汉式:先初始化对象
class single
{
private single() {}//将构造函数私有化(private)
private static single s=new single();//创建一个single类对象
public static single getinstance()//对外提供一个方法可以获取到对象。
{
return s;
}
}
2,懒汉式:对象方法被调用时才初始化,也叫对象延时加载。
class single
{
private single() {}//将构造函数私有化(private)
private static single s=null;//先不创建对象
public static single getinstance()//对外提供一个方法可以获取到对象。
{
if(s==null)
s=new single();
return s;
}
}
饿汉式:single类一进内存,就已经创建好对象。(开发一般用饿汉式)懒汉式:single类进内存,对象还没有存在,只有调用 getinstance方法时,才创建对象
继承
作用:提高代码复用性,让类与类之间产生关系。
注意:
千万不要为了获取替他类功能,简化代码而继承,必须是类与类之间有所属关系才可以继承。
Java语言中,只支持单继承,不支持多继承,多继承容易带来隐患,因为多个父类定义了相同功能,但功能内容不同时,子类对象不确定要运行哪一个。
如何使用一个继承体系中功能?
想要使用功能,先查阅体系父类的功能,因为父类定义的功能是该体系的共性功能
通过了解共性功能,就可以知道该体系的基本功能。
那么这个体系已经可以基本使用啦。
那么在具体调用时,要创建最子类的对象,为什么呢?
一是因为有可能父类不能创建对象。
二是创建子类对象可以使用更多的功能,包括基本的也包括特有的。
简单一句话:查阅父类功能,创建子类对象使用功能。
子父类中变量,函数的问题??
1.变量
如果子类中出现非私有的同名变量时,
子类要访问本类中变量用this.
子类要访问父类中同名变量用super.
super和this使用几乎一致。
this代表的是本类对象的引用。
super代表的是父类对象的引用。
2,子父类中函数
当子类出现和父类一模一样的函数时,
当子类调用该函数,会运行子类的内容。
如同父类函数被覆盖一样。
这种情况是函数的另一个特性:重写(覆盖)
当子类继承父类,沿袭了父类的功能到子类中。
但是子类虽具备该功能,但是功能的内容却和父类不一致,
这是,没有必要定义新功能,而是使用覆盖技术,保留父类定义的功能
并重写内容。
重写:
1,子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败
2,静态只能覆盖静态。函数的覆盖:静态函数只能覆盖静态函数
重载:只看同名函数的参数列表。
重写:子父类方法要一模一样。
子父类中构造函数
在对子类对象进行初始化时,父类构造函数也会运行
那是因为子类构造函数默认第一行有一条隐式语句super();
super():会访问父类中空参数的构造函数。而且子类中所有的
构造函数默认第一行都是super()
例子:
//创建一个父类
class Fu
{
Fu()
{
System.out.println("fu run");
}
}
//创建一个子类
class Zi extends Fu
{
Zi()
{
//隐藏一句super();
System.out.println("Zi run");
}
Zi(int x)
{
//隐藏一句super();
System.out.println("x="+x);
}
}
class Half
{
public static void main(String[] args)
{
//创建子类对象
Zi c1=new Zi();
Zi c2=new Zi(3);
}
}
运行结果:
fu run
Zi run
fu run
x=3
为什么子类一定要访问父类中的构造函数?
因为父类中的数据子类可以直接获取,所以子类对象在建立时
需要先查看如何对这些数据进行初始化的
如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来
指定。
注意:super语句一定定义在构造函数第一行
结论:
子类所有的构造函数,默认都会访问父类中空参数的构造函数。
因为子类每一个构造函数内部的第一行都有一句隐式super()
当父类中没有空参数的构造函数时,子类必须手动通过super或this语句来指定
要访问的构造函数。
当然,子类构造函数第一行也可以手动指定this语句来访问本类中的构造函数。
子类中至少会有一个构造函数会访问父类中的构造函数。
/*
this 作用
*/
//创建一个person类
class Person
{
private String name;
private int age;
Person(String name)
{
name=name;
}
public void speak()
{
System.out.println("name="+name);
}
}
class Half
{
public static void main(String[] args)
{
//创建一个person对象
Person p=new Person("wangwu");
p.speak();
}
}
输出结果:name=null;
若将name=name改为this.name=name.则输出结果为name=wangwu
/*
this 的使用
*/
class Person
{
private int age;
Person(int age)
{
this.age=age;
}
/*
需求:定义一个用于比较年龄是否相同的功能;
*/
public boolean compare(Person p)
{
return this.age==p.age;
}
}
class Half
{
public static void main(String[] args)
{
Person p1=new Person(20);
Person p2=new Person(25);
boolean c=p1.compare(p2);//对象p1调用的compare函数,所以语句 this.age相当于p1.age
System.out.println(c); //this相当于所调用的对象
}
}
final关键字,作为一个修饰符
1,可以修饰类,函数,变量。
2,final修饰的类不可以被继承。
3,final修饰的方法不可以被复写。
4,final修饰的变量是一个常量只能赋值一次,
既可以修饰成员变量,也可以修饰局部变量。
什么时候使用final关键字???
当在描述事物时,一些数据的出现值是固定的,那么这时
为了增强阅读性,常给这些值起个名字,方便阅读,
而当这个值不需要改变时,加上final修饰。作为常量
常量的书写格式:所有字母都大写,如果由多个单词组成
单词间通过_连接。
- java之单例设计模式,继承,final关键字总结
- 关于static静态的、继承、接口interface、final关键字、单例设计模式总结
- 黑马程序员—Java面向对象(单例设计模式、面向对象的继承、final关键字)
- java自学之路-----继承 单例设计模式
- 黑马程序员——Java面向对象(this关键字、静态、单例设计模式、继承)
- 总结:java设计模式之----单例模式singeton
- java设计模式总结之单例模式
- Java设计模式(1)之单例模式学习总结
- 黑马程序员——java基础--静态(函数、代码块)、单例设计模式、继承、final修饰符
- [总结]设计模式之-单例模式
- 设计模式总结之单例模式
- 设计模式总结之单例模式
- 设计模式之单例模式总结
- 设计模式之单例模式总结
- 设计模式之---单例模式总结
- 继承,设计模式,final
- java设计模式之单例设计
- java设计模式之单例模式
- Linux so 选择顺序
- MySql与SqlServer的一些常用用法的差别
- NSArray使用小结
- 快速排序算法实现
- 从下拉菜单设计细节看Amazon对用户体验的把握
- java之单例设计模式,继承,final关键字总结
- SSIM
- CareerCup 16.3 Philosopher Dinner -- DeadLock, Synchronized
- 如何在Android模拟器上访问本地的Web应用?
- linux mysql命令
- 平时Oracle常用的命令集锦
- Oracle 11g AWR 系列三:AWR baseline 的管理
- cocos2d-2.1
- POJ 1575/ZOJ 1698(模拟)