黑马程序员——java基础--静态(函数、代码块)、单例设计模式、继承、final修饰符

时间:2023-02-11 19:27:29
------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


1、静态关键字:static

   1)用法:

      static是一个修饰符,用于修饰成员(成员变量、成员函数),当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用:类名.静态成员。

  2)特点:

     随着类的加载而加载,消失而消失,生命周期最长,优先于对象存在;

     被所有对象所共享,可直接被类名锁调用。

  3)实例变量和类变量区别:

A、类变量随类加载而存在于方法区中,实例变量随对象的建立而存在于堆内存中。

B、生命周期:类变量最长,随类的消失而消失;实例变量随对象消失而消失。
  4)静态使用注意事项:

A、静态方法只能访问静态成员;非静态方法既可以访问静态也可以访问非静态。

B、静态方法中不可以定义this、super关键字,因为静态优先于对象存在。

C、主函数是静态的。
  5)主函数:

主函数是一个特殊的函数,是固定格式的,作为程序的入口,可以被虚拟机调用。

public:代表该函数的访问权限是最大的。

static:代表主函数随着类的加载就已经存在了。

void:主函数没有具体返回值。

main:不是一个关键字,但是一个特殊词,可以被虚拟机识别。

(String[] args):函数的参数类型是一个数组,该数组中的元素是字符串。
  6)什么时候使用静态?

分两方面:静态变量(类变量)和静态函数

静态变量:

    当对象中都出现共享数据时,该数据被静态锁修饰。对象特有数据要定义成非静态。

静态函数:

    当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。静态不能访问非静态。
2、说明书

将class文件发给他人使用,别人只要将文件设置到classpath路径下就可以使用,但是我们必须建立使用说明书以介绍class内容。

Java的说明书通过文档注释来完成。

/**

对类的描述信息

@author   作者

@version   版本

*/

生成:javadoc -d  目标盘  文件夹  -author  -vesion  xxx.java
3、静态代码块

格式:

Static

{

              静态代码块中的执行语句;

}

特点:

    随着类的加载而执行,只执行一次,并优先于主函数。

执行顺序:

    静态代码块>主函数>构造代码块>构造函数
4、对象的初始化过程

1)new要用到class文件,先找到并加载到内存;

2)执行该类中static代码块,对class文件初始化;

3)在堆内存中开辟空间,分配内存地址;

4)建立对象的特有属性,进行默认初始化;

5)对属性进行显示初始化;

6)对对象进行构造代码块初始化;

7)对对象进行对应的构造函数初始化;

8)将内存地址赋给栈内存中的变量。

5、单例设计模式

   要保证对象的唯一:

A、     将构造函数私有化;

B、     在类中创建一个本类对象(私有);

C、     对外提供一个方法可以获取到该对象。

 1)饿汉式

   private Single(){}

   private static  final  Single s = new Single();

   public static  Single  getInstance()

   {

         return s;

   }

 2)懒汉式:延迟加载

   private Single(){}

   private static  final  Single s = null;

   public static  synchronized  Single getInstance()

   {

       if(s==null)

          s = new Single();

       return s;

   }

6、继承(extends)

   继承简化了代码,提高了代码的复用性,让类与类之间产生了关系,有了多态的特性。

   Java支持单继承,多层继承。

   具体调用时,要创建最子类的对象:

1)有可能父类不能创建对象;

2)创建子类对象可以使用更多的功能,包括特有功能。

7、super关键字

  1)如果子父类中出现了非私有的同名变量时,子类访问本类变量用this,子类访问父类中同名变量用super。

 

  2)子父类中的函数:当子类出现和父类一模一样的函数时,子类对象调用该函数会运行子类函数内容,父类的函数被覆盖。这也体现了函数的一个特性:重写(覆盖)。

 

  3)注意事项:

     覆盖时要注意子类权限必须大于等于父类权限;

     静态只能覆盖静态;

     重写是子父类方法要一模一样,重载是只看同名函数的参数列表。

 

  4)在对子类对象进行初始化时,父类的构造函数也会运行,因为子类的构造函数默认第一行有一条隐式的语句:super();它会访问父类中空参数的构造函数,而且子类中所有的构造函数都默认第一行有super()。

 

  5)子类为什么一定要访问父类中的构造函数呢?

    因为父类中的数据子类可以直接获取,子类对象在建立时,需要先查看父类是如何对这些数据初始化的,所以子类在对象初始化时要先访问一下父类中的构造函数。如果访问父类中制定的构造函数,可以手动定义super语句的方式来指定,一定定义在子类构造函数的第一行。当然子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数,子类中至少有一个构造函数会访问父类中的构造函数。

    这就叫做子类实例化过程。

8、final关键字

  1)final可以修饰类、方法和变量(成员变量、静态变量和局部变量);

  2)final修饰的类不可以被继承;

  3)final修饰的方法不可以被覆盖;

  4)final修饰的变量是一个常量,只能被赋值一次;

  5)内部类只能访问被final修饰的局部变量。