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修饰。作为常量
常量的书写格式:所有字母都大写,如果由多个单词组成
单词间通过_连接。



原创粉丝点击