面向对象
静态 static
用法:是一个修饰符,用于修饰成员(成员变量,成员函数),当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用外,还可以直接被类名调用。类名,静态成员。
eg:System.out.println(Person.country);
特有内容随着对象存储
country="cn" 在方法区,共享区,数据区。都可。
static特点
1,随着类的加载而加载
也就是说,静态会随着类的消失而消失,说明它的生命周期最长。
2,优于的对象存在
明确一点:静态是先存在,对象是后存在的
3,被所有对象共享
4,可以被类名所调用
实例变量和类变量的区别
1,存放位置
类变量随着类的加载而存在于方法区中
实例变量随着对象的建立而存在堆内存中
2,生命周期
类变量生命周期最长,随着类的消失而消失
实例变量生命周期随着对象的消失而消失
静态的使用注意事项
1,静态方法只能访问静成员
非静态方法可以访问静态也可以访问非静态
2,静态方法中不可以定义this,super关键字
因为静态优先于对象存在,所以静态方法不可以出现this
3,主函数是静态的
静态有利有弊
利:1,对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一份
2,可以直接被类名调用
弊:1,生命周期过长
2,访问出现局现性(静态只能访问静态)
主函数是一个特殊的函数,作为程序的入口,可以被jvm调用
主函数的定义:
public:代表着该数访问权限是最大的
static:代表主函数随着类的加载就已经存在了
void:主函数没有具体的返回值
main:不是关键字,但是是一个特殊的单词,可以被jvm识别
(String[] args):函数的参数,参数类型是一个数组,该数组中的元素是字符串,字符串类型的数组
主函数是固定的:jvm识别
jvm在调用主函数时,传入的是new String[0];
什么时候使用静态
要从两方面下手:
因为静态修饰的内容有成员变量和函数
1,什么时候定义静态变量(类变量)呢?
当对象中出现共享数据时,该数据被静态所修饰对象中的特有数据要定义成非静态,存在堆内存中
2,什么时候定义静态函数呢?
当功能内部没有访问利用非静态数据(对象的物有数据)那么该功能定义成静态的
静态的应用(略)
制作java程序说明书 :1,先写注释块,2,应用javadoc程序
以下是本节所用到的代码
package welcome;
public class Person {
public static int age = 0;//类变量
private String name;//实例变量
/*
* 获得一个唯一对象
* 分三步
*/
private static Person ss = new Person();
private Person() {}
public static Person getPerson()
{
return ss;
}
/*
* 构造代码块
* 作用:给对象初始化
* 对象一建立就运行,优先于构造函数执行
*/
{
System.out.println("b");
}
static
{
System.out.println("a");
}
//构造Person
//简单说:哪个对象在调用this所在的函数,this就代表哪个对象
Person(String name) {
this.name = name;//不可用this(name)
}
Person(int age) { this.age = age; System.out.println("c"); }
Person(String name, int age) {
//this.name = name;
this(name);
this.age = age;
/*
* this.age = age;
* this(name);
* 这样是不可以的,this在构造函数中必须是第一行
* 因为初始化要先执行
* 还有构造函数之间不许相互调用,会进入死循环
*/
}
Person(int age, String name) { this.name = name; this.age = age; }
//this的应用
//两个人比较是不是同龄人
//this的应用:当定义类中的功能时,该函数内部要用到该函数的对象时,用this来表示这个对象
public boolean compare(Person p)
{
return this.age == p.age;
}
public void setAge(int num) { age = num; }
public int getAge() { return age; }
public void setName(String s) { name = s; }
public String getName() { return name; }
public static void cry() { System.out.println("cry...."); }
public void speak()
{
System.out.println("age="+age);
System.out.println("name="+name);
}
}
package welcome;
/*
* @author xuanyimo
*/
public class ArrayTool {
/*
* 获得一个函数的最大值
*/
public static int getMax(int[] arr)
{
int max = 0;
for(int i = 1; i < arr.length; ++i)
{
if(arr[i] > arr[max])
max = i;
}
return arr[max];
}
/*
* 冒泡排序
*/
public static void bubbleSort(int[] a)
{
for(int i = 0; i < a.length-1; ++i)
{
for(int j = 0; j < a.length-1-i; ++j)
{
if(a[j] > a[j+1])
swap(a, j, j+1);
}
}
return;
}
private static void swap(int[] a, int x, int y)
{
a[x] = a[x]^a[y];
a[y] = a[x]^a[y];
a[x] = a[x]^a[y];
return;
}
/*
* 打印数组
*/
public static void show(int[] a)
{
for(int i = 0; i < a.length; ++i)
{
if(i != a.length-1)
System.out.print(a[i]+", ");
else
System.out.println(a[i]);
}
return;
}
}