【黑马程序员】面向对象(二) 第六天

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

知识点

(来自百度百科)有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main()。因为在程序开始执行时必须调用main() ,所以它被声明为static。
声明为static的变量称为静态变量类变量。可以直接通过类名引用静态变量,也可以通过实例名来引用静态变量,但最好采用前者,因为后者容易混淆静态变量和一般变量。静态变量是跟类相关联的,类的所有实例共同拥有一个静态变量。
声明为static的方法称为静态方法类方法。静态方法可以直接调用静态方法,访问静态变量,但是不能直接访问实例变量和实例方法。静态方法中不能使用this关键字,因为静态方法不属于任何一个实例。静态方法不能被子类的静态方法覆盖。

01)static静态关键字

public class PersonDemo {
	public static void main(String[] args) {
		Person p = new Person();
		p.show();
		System.out.println(p.country);//通过引用调用。
		System.out.println(Person.country);//通过类名直接调用
	}
}
class Person{
	String name;//成员变量,实例变量。
	static String country = "CH";//静态变量。被static修饰的属性在方法区(共享区、数据区)被创建。被所有创建的对象所共享。
	void show(){
		System.out.println(name + "的国籍是:" + country);
	}
}
运行结果如下图所示:


02)main函数


public class MainDemo {
	public static void main(String[] args) {//参数args是可以更改的。arsg、ag、xx都可以。【args】只是一种习惯。
		String[] arr = {"hah", "huohuo", "heh", "hihi", "hiahia"};
		MainTest.main(arr);//通过类之间调用静态方法(main)。
	}
}
class MainTest{
	public static void main(String[] args) {
		System.out.println("一共有"+ args.length + "个元素,分别是:");
		for (int i = 0; i < args.length; i++){
			System.out.print(args[i] + " ");
		}
	}
}
运行结果如下图所示:


03)何时使用静态?(static)

要从两方面考虑:因为静态修饰的内容有成员变量函数(方法)。
如果想让一个类的所有实例共享数据,就要使用静态变量(类变量)。( 对象中的特有数据要定义成非静态存在堆内存中。)
什么时候定义静态函数呢?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
public class PersonDemo_2 {
	public static void main(String[] args) {
//		Person_2 p = new Person_2();
//		p.show();//如果只是调用show()方法,楼上的创建对象将变的无意义。
		Person_2.show();//直接通过类名调用。
	}
}
class Person_2{
	String name;
	public static void show(){//因为方法不访问name变量,所以需要修饰为static。
		System.out.println("Welcome to Java!");
	}
}
运行结果如下图所示:


04)静态的应用——工具类




代码:
首先创建工具类:ArrayTool。
然后创建测试类:ArrayToolDemo。运行。
public class ArrayTool {//工具类
	private ArrayTool(){}//私有化。
	
	public static int getMax(int[] arr){//获取最大值。
		int max = arr[0];
		for (int i = 1; i < arr.length; i++){
			if (arr[i] > max)
				max = arr[i];
		}
		return max;
	}
	
	public static int getMin(int[] arr){//获取最小值。
		int min = arr[0];
		for (int i = 1; i < arr.length; i++){
			if (arr[i] < min)
				min = arr[i];
		}
		return min;
	}
	
	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])
					swap(arr, i, j);
			}
		}
	}
	
	public static void bubbleSort(int[] arr){//冒泡排序:降序。
		for (int i = arr.length - 1; i > 0 ; i--){
			for (int j = i - 1; j > -1 ; j--){
				if (arr[i] > arr[j])
					swap(arr, i, j);
			}
		}
	}
	
	private static void swap(int[] arr, int a, int b){//位置置换。
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}
	
	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] + "]");
		}
	}
}
创建测试类:ArrayToolDemo。运行。
public class ArrayToolDemo {
	public static void main(String[] args) {
		int[] arr = {31, 321, 4325, 6, 412, 4, 423};
		/*
		//为了让程序更严谨,就不需要通过创建对象来调用方法,所以ArrayTool类中的方法都可以修饰为static。
		ArrayTool tool = new ArrayTool();
		int max = tool.getMax(arr);
		System.out.println("Max is: " + max);
		int min = tool.getMin(arr);
		System.out.println("Min is: " + min);
		tool.printArray(arr);//排序前
		tool.selectSort(arr);
		tool.printArray(arr);//排序后
		tool.bubbleSort(arr);
		tool.printArray(arr);//排序后
		*/
		
		int max = ArrayTool.getMax(arr);
		System.out.println("Max is: " + max);
		int min = ArrayTool.getMin(arr);
		System.out.println("Min is: " + max);
		ArrayTool.printArray(arr);//排序前
		System.out.println("--------------分割线---------------");
		ArrayTool.bubbleSort(arr);//升序
		ArrayTool.printArray(arr);//排序后
		System.out.println("--------------分割线---------------");
		ArrayTool.selectSort(arr);//降序
		ArrayTool.printArray(arr);//排序后
	}
}
运行结果如下图所示:


05)帮助文档的制作。


/**
 * 这是一个可以对数组进行操作的工具类,该类中提供了获取最值,排序(升降序),打印数组中元素等功能。
 * @author	(作者)
 * @version (版本)
 * @param   (参数)
 * @return  (返回)
 */
cmd运行示例
将doc文档创建到D盘myhelp文件中。

创建结果如下图所示:

注意:


06)静态代码块

/*
 * 静态代码块。
 * 格式:
 * static{
 * 		静态代码块中的执行语句。
 * }
 * 特点:随着类的加载而执行,只执行一次。
 * 		用于给类进行初始化,并优先有主函数。
 *
 */
class StaticCode{
	static{//静态代码块。
		System.out.println("a");
	}
}
public class StaticCodeDemo {
	static{//静态代码块。
		System.out.println("b");
	}
	public static void main(String[] args) {
		new StaticCode();//
		new StaticCode();//这两个只执行一次,上面执行后,这行将不执行。
		System.out.println("Over");
	}
	static{//静态代码块。
		System.out.println("c");
	}
}
运行结果如下图所示:


07)对象的初始化过程




附言:我是Java新人,如有错误的地方请指出。
每天学习一点点,纠错一点点,进步很大点。


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值