面向对象之静态变量和静态方法

* 构造方法注意:

 

* 当你这个类中没有提供无参的构造方法的时候

 * 系统会在你创建对象是也会调用无参方法 

 * 系统帮你提供一个 

 * 如果你 只 提供一个有参的构造方法 那么系统不会给提供无参构造方法

 * 

 * 建议:写类时 无参有参构造方法都要写上;

 * 静态变量也叫类变量(相当于一个共享的变量 每个对象都能访问到)

 * 使用关键词 static 修饰属性

 * 

 * 静态变量的调用

 

* 1.可以使用对象直接调用(不建议)

 * 2.使用类名直接调用(建议)

 * 使用类名调静态变量可以 和 成员变量区分

 * 直接使用类名调用跟准确 有静态变量时 对象 还没创建 

 * 静态变量好处

 * 1.节约内存(静态变量是一个共享的变量)

 * 举例:老师被所有学生共享

 * 水杯 饮水机 

 * 静态变量和成员变量的区别

 

*1.所属不同

 *静态变量:属于类 也叫类变量

 *成员变量:属于对象的 也叫对象变量(实例变量)

 *2 内存所处的位置不同

 *静态变量:方法区中的静态区

 *成员变量:堆区中

 *3.内存中加载时期不同

 *静态变量:随着类的加载而加载 随着类的销毁而销毁 程序结束后

 *成员变量:随着对象的创建而创建 随着对象的销毁而销毁 

 *4.调用不同

 *静态变量:使用对象名或者类名 类名推荐

 *成员变量:只能使用对象名

 * 

 * 对象再内存中的表现步骤

 

* 1.加载有main函数的类的class文件到 方法区中

 * 2.main方法入栈(需要创建AV对象)

 * 3.先把AV.class文件加载到 方法区中

 * 4.然后才可以在 堆内存中 开辟空间 创建AV对象

 * 5.赋值方法入栈 赋完值出站

 * 6.main函数方法执行完毕 出栈

 * 7.程序结束

 

public class Demo03 {
	public static void main(String[] args) {
		Av girl1 = new Av();
		girl1.name = "苍老师";
		Av.country = "日本";

		Av girl2 = new Av();
		girl2.name = "小泽";
		// girl2.country = "日本";
		girl2.sayHi();
		girl1.sayHi();
	}
}

class Av {
	String name;// 姓名
	static String country;// 国籍

	//思考:构造方法能不能用private修饰
	public  Av() {
		
	}
	
	
	public void sayHi() {
		System.out.println(name + ".." + country);
	}
}

构造方法例子

* 需求:

 * 创建一个长方形的类

 * 设计

 * 成员变量 和 方法

 * 计算周长和面积

 * 要求:

 * 1.构造方法

 * 2.set/get方法

 * 3.成员变量私有化

 * 4.计算周长和面积是成员方法

package com.lanou3g;



public class Demo02 {

public static void main(String[] args) {

	Cfx cfx = new Cfx(10,34);

	//cfx.setCheng(20);

	//cfx.setKuan(20);

	cfx.sayHi();

}

}

class Cfx{

	private int cheng;//高

	private int kuan;//宽

	private int permeter;//周长

	private int area;//面积

	//无参构造方法

	public  Cfx() {

		

	}

	//有参构造方法

	public  Cfx(int cheng, int kuan) {

		this.cheng=cheng;

		this.kuan=kuan;

		//通过计算给成员变量赋值

		this.permeter=(cheng+kuan)*2;

		this.area=cheng*kuan;

	}

	/*//面积

	public int mianJi() {

		return cheng*kuan;

	}

	//周长

	public int zhouChang() {

		return (cheng+kuan)*2;

	}*/

	//介绍自己方法

	public void sayHi() {

		System.out.println("长"+cheng);

		System.out.println("宽"+kuan);

		System.out.println("面积"+area);

		System.out.println("周长"+permeter);

	}

	public int getCheng() {

		return cheng ;

	}

	public void setCheng(int cheng) {

		this.cheng=cheng;

	}

	public int getKuan() {

		return kuan ; 

	}

	public void setKuan(int kuan) {

		this.kuan=kuan;

	}

}

 
 

 * 静态方法

package com.lanou3g;



public class Demo04 {



}



class Test{

	int num1=10;

	static int num2=20;

	/*

	 * 成员方法中 既可以使用成员变量  也可以使用静态变量

	 */

	public void fun1() {

		System.out.println(this.num1);

		System.out.println(Test.num2);

	}

	/*

	 * 静态方法(类方法):随着类的加载而加载(和静态变量一样)

	 * 静态方法的执行和成员方法一样 在栈内存执行 入栈出栈

	 * 静态方法中不能使用成员变量(静态方法加载时 还没有对象)

	 * 

	 * 静态只能调用静态的

	 * 成员的既能调用成员的 也能调用静态的

	 */

	public static void fun2() {

		//System.out.println(num1);

		System.out.println(num2);

		fun3();

	}

	public static void fun3() {

		System.out.println("fun3");

	}

}


* 编写工具类
package com.lanou3g;



public class ArrayTest {

public static void main(String[] args) {

	/*

	 * 编写工具类

	 * 1.一般所有方法使用静态的 方便调用

	 * 2.构造方法 私有化(对象对于这个类没有用)

	 */

	int[] array= {1,2,3,4,5};

	//ArrayTool tool = new ArrayTool();

	ArrayTool.changeArray(array);

	ArrayTool.printArray(array);

}

}
package com.lanou3g;

import java.sql.Array;
import java.util.Arrays;

import org.omg.CORBA.PUBLIC_MEMBER;
/*
 * 编译文档命令
 * javadoc -d (文件名) -version -author 文件名.java
 */
/**
 * 数组的工具类
 * 获取数组最大值
 * 打印数组
 * 数组反转
 * 选择排序
 * @author lanou
 * @version 1.0.0
 *
 */
public class ArrayTool {
	
		/**
		 * 构造方法私有化
		 */
	private ArrayTool() {
		
	}
	
	
		/**
		 * 获取数组最大值
		 * @param array  数组
		 * @return       数组最大值
		 */
	public  static int getMax(int[] array) {
		int max = array[0];
		for (int i = 1; i < array.length; i++) {
			if(max < array[i]) {
				max = array[i];
			}
		}
			return max;
	}
		
	
		/**
		 * 打印数组
		 * @param array  数组
		 */
	public static void printArray(int[] array) {
		for (int i = 0; i < array.length; i++) {
			
		}
		System.out.println(Arrays.toString(array));
	}
	
	
		/**
		 * 数组反转
		 * @param array  数组
		 */
	public static void changeArray(int[] array) {
		// array[i] 和 array[length-1-i] 换
		int num = array.length / 2;
		for (int i = 0; i < num; i++) {
			int temp = array[i];
			array[i] = array[array.length - 1 - i];
			array[array.length - 1 - i] = temp;
		}
	}
	
		/**
		 * 选择排序
		 * @param array  数组
		 */
	
	public static void chooseSort(int[] array) {
		for (int i = 0; i < array.length-1; i++) {
			for (int j = i+1; j < array.length; j++) {
				if(array[i]>array[j]) {
					int temp = array[j];
					array[j]=array[i];
					array[i]=temp;
				}
			}
		}
	}
		
}

 

解析main函数

 

* public jvm调用 main方法 的时候 需要最高的权限

 * static 调用静态方法 是不需要创建对象

 * main 不是关键词 当程序运行时jvm只会调用 使用类名调用 一个叫main的函数

 * String[] args 原来是 用来接受 键盘输入 的字符串

 * (可以使用 javac和java指令测试)
public class Demo05 {
	public static void main(String[] args) {
		//获取数组长度
		System.out.println(args.length);
		//遍历数组
		for (int i = 0; i < args.length; i++) {
			System.out.println(args[i]);
		}
	}

猜你喜欢

转载自blog.csdn.net/shanwenfengyu/article/details/80260583