码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员——面向对象(static静态应用)-第13天

时间:2015-08-16 09:29:03      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:java学习笔记   面向对象   静态static   黑马程序员   

----------- android培训java培训java学习型技术博客、期待与您交流! ------------

 面向对象(static静态应用)

1、面向对象(static静态什么时候使用)

静态什么时候使用

要从两方面下手:

它修饰的内容有成员变量和函数。

 

什么时候定义静态变量?

当对象出现共享数据时(共享值,name是共享变量,country中”CN”是,数据),该数据被静态修饰。

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

 

什么时候定义静态函数?

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

class Person

{

String name;

public void show()//这个功能没有访问对象特有的数据name的。可以用static修饰。

{

system.out.println("haha");

}

}

class Demo

{

public static void main(String[] args)

{

Person p=new Person();

p.show();//显示haha

}

}

 

对比:

class Person

{

String name;

public static void show()//这个功能没有访问对象中的特有数据name的。

{

system.out.println("haha");

}

}

class

{

public static void main(String[] args)

{

Person.show();//也是显示haha。直接调用类名.功能函数()

}

 

 

2、面向对象(static静态的应用-工具类)

class Demo

{

public static void main(String[] args)

{

int[] arr={3,4,1,8};//数组

int max=getMax(arr);//max获得数组元素中的最大值

system.out.println("max="+max);

}//函数封装,提高复用。

public static int getMax(int[] arr)

{

int max=0;//令max为0,即数组的下标为0

for(int x=1;x<arr.length;x++)

{

if(arr[x]>arr[max])

max=x;

}

return arr[max];

}

}

 

对比下面的Test类。发现功能是一样的(即功能重复)。

class Test

{

public static void main(String[] args)

{

int[] arr={3,4,1,8};

int max=getMax(arr);

system.out.println("max="+max);

}

public static int getMax(int[] arr)

{

int max=0;

for(int x=1;x<arr.length;x++)

{

if(arr[x]>arr[max])

max=x;

}

return arr[max];

}

}

见图1.

技术分享

每个应用程序中都有共性的功能。

可以将这些功能进行抽取,独立封装

以便复用。

技术分享

//下面的这个类中包含了多个功能函数。

class ArrayTool

{//定义获取数组最大值方法函数

public int getMax(int[] arr)

{

int max=0;

for(int x=1;x<arr.length;x++)

{

if(arr[x]>arr[max])

max=x;

}

return arr[max];

}//获取最小值的功能函数

public int getMin(int[] arr)

{

int min=0;

for(int x=1;x<arr.length;x++)

{

if(arr[x]<arr[min])

min=x;

}

return arr[min];

}//普通排序法:

public int selectSort(int[] arr)

{

for(int x=0;x<arr.length-1;x++)//防止角标越界,x=arr.length-1时,y= arr.length越界。

{

for(int y=x+1;x<arr.length;x++)//y=x+1;(y=1,减少了比较次数,如:arr[0]>arr[0];y=1+x;每比较完一次后,下一次比较的次数减少一次。)

{

if(arr[x]>arr[y])

{

swap(arr,x,y);

}

}

}

}//冒泡排序法:

public void bubbleSort(int[] arr)

{

for(int x=0;x<arr.length-1;x++)

{

 for(int y=0;x<arr.length-x-1;x++)//每排序完一轮后,下一次排序比较的次数减少1次。随x减少。

{

if(arr[y]>arr[y+1])

{

swap(arr,y,y+1);

}

}

}

public void swap(int[] arr,int a,int b)

{

int temp=arr[a];

arr[a]=arr[b];

arr[b]=temp;

}

}

先是在DOS下编译上面的文件会产生ArrayTool.class文件。见图3.

技术分享

class ArrayToolDemo

{

public static void main(String[] args)

{

int[] arr={3,1,87,32,8};

ArrayTool tool=new ArrayTool();//ArrayTool调用的就class文件

int max=tool.getMax(arr);

system.out.println("max="+max);

}

}

然后编译ArrayToolDemo。结果见图4。

技术分享

发现产生ArrayToolDemo.class和ArrayTool.class以及它们的java文件是在同一个目录下。见图5

技术分享

如果直接编译ArrayToolDemo。会出现什么情况?见图6

技术分享

发现同时出现两个。说明:虚拟机会自动先找ArrayTool.java文件并编译成ArrayTool.class。然后编译ArrayToolDemo

 

虽然可以通过建立ArrayTool的对象使用这些工具,对数组进行操作。

发现了问题:

1,对象是用于封装数据,可是ArrayTool没有封装特有数据。

2,操作数组的每一个方法都没有用到ArrayTool对象中的特有数据。

 

这时就考虑,让程序更严谨。是不需要对象的。

可以将ArrayTool中的方法都定义成atatic的。直接通过类名调用即可。

 

class ArrayTool

{//获取最大值

public static int getMax(int[] arr)

{

...

}

public staticint getMin(int[] arr)

{

...

}//普通排序法:

public static int selectSort(int[] arr)

{

...

 

class ArrayToolDemo

{

public static void main(String[] args)

{

int[] arr={3,1,87,32,8};

int max=ArrayTool.getMax(arr);

system.out.println("max="+max);//同样也是打印max=87;

}

 

尽管方法都已经静态了,但是其它用户和程序还是可以通过该类建立对象。这样内存中就会存在多余的对象(占用空间,即“垃圾”)。

可以将构造函数私有化来完成。(这样可以防止不知道该函数功能的程序员建立对象,不让他们建立)

 

class ArrayTool

{

private ArrayTool(){}//构造函数私有化。

public static int getMax(int[] arr)

{

...

}

public static int getMin(int[] arr)

{

...

}

private void swap(int[] arr,int a,int b)//这个也可以私有化。只在本类中被内部函数调用。

{

int temp=arr[a];

arr[a]=arr[b];

arr[b]=temp;

}

 

class ArrayToolDemo

{

public static void main(String[] args)

{

int[] arr={3,1,87,32,8};

int max=ArrayTool.getMax(arr);

system.out.println("max="+max);//同样也是打印max=87;

}

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

黑马程序员——面向对象(static静态应用)-第13天

标签:java学习笔记   面向对象   静态static   黑马程序员   

原文地址:http://blog.csdn.net/dianziagen/article/details/47696167

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!