黑马程序员——第六天(Java面向对象)

来源:互联网 发布:js原型和原型链的概念 编辑:程序博客网 时间:2024/04/29 19:09

--------------------- android培训、java培训、期待与您交流! ----------------------

一.面向对象(Static关键字)

static(静态)关键字

static关键字: 用于修饰成员(成员变量和成员函数)被修饰后的成员具备以下特点:随着类的加载而加载(随着类的消失而消失  说明它的生命周期最长 )优先于对象存在      (明确一点,静态是先存在 对象是后存在的 )被所有对象所共享可以直接被类名调用使用注意静态方法只能访问静态成员静态方法中不可以写this,super关键字主函数是静态的

多个对象当中存在着共同数据 

静态修饰的内容被对象所共享

当成员被静态修饰后  就多了一种调用方式

除了可以对象调用外,还可以直接被类名调用,

类名.静态成员

特有数据  随着对象存储

方法区  共享区  数据区

实例变量和类变量的区别:

1.存放位置

类变量随着类的加载而存在于方法区中

实例变量随着对象的建立而存在于堆内存中

2.生命周期

类变量生命周期最长,随着类的消失而消失

实例变量生命周期随着对象的消失而消失

静态使用注意事项:

1.静态方法只能访问静态成员

非静态方法既可以访问静态也可以访问非静态

2.静态方法中不可以定义this,super关键字

因为静态优先于对象存在,所以静态方法不可以出现this

3.主函数的静态的 

静态有利有弊

利:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象都存储一份

可以直接被类名调用,

弊:生命周期过长,访问出现局限性

静态虽好,只能访问静态

二.面向对象(main函数)

主函数:是一个特殊的函数,作为程序的入口,可以被jvm调用

主函数的定义:

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

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

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

main:不是关键字,但是是一个特殊的单词 可以被jvm识别

(String[] args):函数的参数  参数类型是一个数组  数组的元素是字符串  字符串类型的数组

主函数的固定格式的 jvm识别

args  arguments 参数

jvm 在调用主函数时,传入的是new String[0];

javac 启动编译器  java启动虚拟机

java MainDemo XX1 XX2 XX3...

三.面向对象(静态什么时候使用)

什么时候使用静态?

要从两方面下手:

因为静态修饰的内容有成员变量和方法

什么时候定义静态变量(类变量)呢?

当对象中出现共享数据时,(数据指的是值 而不是属性)

该数据被静态所修饰

对象中的特有数据要定义成非静态存在于堆内存中  

什么时候定义静态方法呢 ?

当功能内部没有访问到非静态数据(对象的特有数据)

那么该功能可以定义成静态的 

四.面向对象(静态的应用-工具类)

public class ArrayTool{/** * 空参数构造函数。 */private ArrayTool(){};/** * 获取一个整形数组中的最大值 * @param arr接受一个int类型的数组 * @return返回一个该数组中最大值 */public static int getMax(int [] arr){int max = arr[0];for (int i = 1; i < arr.length; i++) {max = (max > arr[i])? max : arr[i];}return max;}/** * 获取一个整形数组中的最小值 * @param arr接受一个int类型的数组 * @return返回一个该数组中最小值 */public static int getMin(int [] arr){int min = arr[0];for (int i = 1; i < arr.length; i++) {min = (min < arr[i])? min : arr[i];}return min;}/** * 给int数组进行选择排序 * @param arr接收一个int类型的数组 */public static void selectSort(int[] arr){for (int i = 0; i < arr.length-1; i++) {for (int j = i+1; j < arr.length; j++) {if(arr[i]>arr[j]){awap(arr, i, j);}}}}/** * 给int数组进行冒泡排序 * @param arr接收一个int类型的数组 */public static void bubbleSort(int[] arr){for (int i = 0; i < arr.length-1; i++) {for (int j = 0; j < arr.length-1-i; j++) {if (arr[j] > arr[j+1]) {awap(arr, j, j+1);}}}}/** * 给数组中元素进行位置的置换 * @param arr 接收一个int类型的数组 * @param i要置换的位置 * @param j 要置换的位置 */private static void awap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}/** * 用于打印数组中的元素打印形式是:[element1,element2,...] * @param arr接收一个int类型的数组 */public static void printArray(int[] arr){System.out.print("[");for (int i = 0; i < arr.length; i++) {if (i != arr.length-1)System.out.print(arr[i]+",");else System.out.println(arr[i]+"]");}}}
虽然可以通过建立ArrayTool的对象使用这些工具方法,对数组进行操作
发现了问题:
1.对象用于封装数据的,可是ArrayTool对象并未封装特有数据
2.操作数组的每一个方法都没有用到ArrayTool对象中的特有数据

这时就考虑,让程序更严谨,是不需要对象的
可以将ArrayTool中的方法都定义成static的,直接通过类名调用即可。

将方法都静态后 可以方便于使用,但是该类 还是可以被其他程序建立对象的 
为了更为严谨,强制让该类不能创建对象
可以通过将构造方法私有化来完成


五.面向对象(帮助文档的制作javadoc)

接下来,将ArrayTool.class文件发送给其他人,其他人只要将该文件设置到classpath路径下,就可以使用该工具类。

但是,很遗憾,该类中到底定义了多少个方法,对方不清楚,因为该类并没有使用说明书

开始制作程序的说明书 java的说明书通过文档注释来完成。

/**

*/

DOS命令  生成帮助文档

权限必须是public  才能生成  

javadoc -d c:\myhelp  -author -version ArrayTool.java

一个类中默认会有一个空参数的构造函数 

这个默认的构造函数的权限和所属类一致

如果类被public修饰,那么默认的构造函数也带public修饰符

如果类没有被public修饰,那么默认的构造函数,也没有public修饰


默认构造函数的权限是随着类的变化而变化的 


API  应用程序接口


六.面向对象(静态代码块)

格式:

static{

静态代码块的执行语句

}

特点:

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

用于给类进行初始化的

 

静态代码块  给类初始化

构造代码块  给对象初始化

构造函数     给对应对象初始化


七.面向对象(对象的初始化过程)

Person p = new Person("zhangsan",20);

该句话都做了什么事情?

1.因为new用到了Person.class文件,所以会先找到Person.class文件并加载到内存中 

2.会执行该类的静态代码块,如果有的话 。给Person.class类进行初始化

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

4.在堆内存中建立对象的特有属性,并进行默认初始化

5.对属性进行显示初始化

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

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

8.将内存地址付给栈内存中的p变量。


八.面向对象(对象调用成员过程)

非静态前面省略的是this.

静态前面省略的是类名.


九.面向对象(单例设计模式)

设计模式:(23种设计模式)JOF

解决某一类问题最行之有效的方法(最佳解决方案)

是在不断的劳动过程中  总结的经验

完全偏思想

模式的出现 就是把 复杂的模式 简单化


单例设计模式:解决一个类在内存中只存在一个对象。

只能持有一个对象  不可能出现第二个


对象在内存中的唯一性


想要保证对象唯一怎么做呢?

1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象

2.还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。

3.为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式


这三步怎么用代码体现呢?

1.将构造函数私有化

2.在类中创建一个本类对象

3.提供一个方法可以获取到该对象

public class SingleDemo {public static void main(String[] args) {Single single1 = Single.getInstance();Single single2 = Single.getInstance();}}class Single{private Single(){}//1.私有化构造函数private static Single single = new Single();//2.在类中创建一个本类对象public static Single getInstance(){//3.提供一个方法可以获取到该对象  Instance实例return single;}}

对于事物该怎么描述,还怎么描述(描述不会变)

当需要将该事物的对象保证在内存中唯一时,就将以上的三步加上即可。 


十.面向对象(单例设计模式方式二)

这个是先初始化对象

称为:饿汉式

Single类一进内存 就已经创建好了对象

class Single{private Single (){}private static Single single = new Single();public static Single getInstance(){return single;}}
对象是方法被调用时,才初始化

也叫做对象的延时加载

称为:懒汉式

Single类进内存 对象还没有存在  只有调用了getInstance()方法时,才建立对象 

class Single{private Single(){}private static Single single = null;public static Single getInstance(){if (single == null){synchronized(Single.class){if (single == null) single = new Single();}}return single;}}


获取对象是单例里首要做的事情

记住原则:

定义单例,建议使用饿汉式


---------------------- android培训、java培训、期待与您交流! ----------------------