您的位置:首页 > 其它

23、static关键字

2018-01-25 13:34 148 查看

1、本次的预计讲解的知识

1、static声明属性与方法的特点;

2、static操作的基数形式以及应用。

2、具体内容

对于static关键字应该不会陌生,因为一直在编写:public static void main(String args[]),所有本次只是针对static使用做一个说明,static在使用上可以声明属性、方法。

2.1、定义属性

在讲解具体的static作用之前,首先来观察一个代码。

范例:定义一个程序

class Book{//描述的是同一个出版社的信息
private String title;
private double price;
//定义一个描述出版社信息的属性,但是考虑到操作方便,暂不封装
String pub = "清华大学出版社";
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public String getInfo() {
return "图书名称:" + this.title + ",价格:" + this.price + ",出版社:"
+this.pub;
}

}
public class TextDemo {
public static void main(String[] args) {
Book ba = new Book("Java开发",10.2);
Book bb = new Book("Android开发",11.2);
Book bc = new Book("Oracle开发",12.2);
//修改了一个属性的内容
ba.pub = "北京大学出版社";
System.out.println(ba.getInfo());
System.out.println(bb.getInfo());
System.out.println(bc.getInfo());
}
}
 
通过内容关系可以发现的问题:既然这类中所有图书的出版社都是同一个还有必要每一个对象都各自占有重复的属性信息吗?
如果现在已经产生了一千W个Book类对象,但是突然要求将所有对象的出版社名称更换。那么就意味着要修改一千W个对象的内容,所以发现如果将属性定义为普通属性,最终的结果是每一块堆内存空间都将保存有各自的信息。
进一步,既然所有的pub内容都是一样的,那么已改将其定义为一个共享的属性,即:所有的对象将共享同一个pub属性,那么在这种情况下为了描述出共享的概念,可以使用static来定义属性。
范例;使用static定义属性
class Book{//描述的是同一个出版社的信息
private String title;
private double price;
//定义一个描述出版社信息的属性,但是考虑到操作方便,暂不封装
static String pub = "清华大学出版社";
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public String getInfo() {
return "图书名称:" + this.title + ",价格:" + this.price + ",出版社:"
+this.pub;
}

}
public class TextDemo {
public static void main(String[] args) {
Book ba = new Book("Java开发",10.2);
Book bb = new Book("Android开发",11.2);
Book bc = new Book("Oracle开发",12.2);
//修改了一个属性的内容
ba.pub = "北京大学出版社";
System.out.println(ba.getInfo());
System.out.println(bb.getInfo());
System.out.println(bc.getInfo());
}
}
一旦在属性定义上使用了static之后,只要有一个对象修改了属性的内容,那么所有的对象的static属性的内容都将一起进行修改,也就是说此时的pub属性变为了一个公共属性。
 
static声明的属性与普通属性(非static属性)最大的区别在于保存的内存区域的不同。
既然static是一个公共属性的概念,那么如果只是简单的由一个对象去修改static属性的做法很不合适,那么最好的做法是由所有对象的公共的代表来进行访问,那么就是类,所有来讲利用static定义的属性是可以由类名称直接调用的。
Book.pub = "北京大学出版社";
此时Book类定义了pub这个static属性,所以可以利用“Book”类直接调用static的pub属性。
static属性与非static属性还有一个最大的的区别,所有的非static属性必须产生实例化之后才可以访问,但是static属性不收实例化对象的控制,也就是说没有实例化对象产生的情况下依然可以使用static属性。
public class TextDemo {
public static void main(String[] args) {
System.out.println(Book.pub);
Book.pub = "北京大学出版社";
System.out.println(Book.pub);
Book ba = new Book("Java开发",10.9);
System.out.println(ba.getInfo());
}
}
所有可以发现static定义属性的一个特征:虽然定义在类的结构里面,但是不受到对象的控制,是对于类存在的。
疑问?什么时候使用static属性?什么时候不使用static属性?
在你编写类的过程之中,你所选的首要的修饰符一定不是static,如果要描述共享信息的时候再使用static(可以方便集体修改,可以重复开辟内存空间)。

2.2、static定义方法

static定义方法的时候可以在没有实例化对象的时候利用类名称直接调用。

范例:使用static定义方法

class Book{//描述的是同一个出版社的信息
private String title;
private double price;
//定义一个描述出版社信息的属性,但是考虑到操作方便,暂不封装
private static String pub = "清华大学出版社";
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public static void setSub(String p) {
pub = p;
}
public String getInfo() {
return "图书名称:" + this.title + ",价格:" + this.price + ",出版社:"
+this.pub;
}

}
public class TextDemo {
public static void main(String[] args) {
Book.setSub("北京大学出版社");
Book ba = new Book("Java开发",10.2);
Book bb = new Book("Android开发",11.2);
Book bc = new Book("Oracle开发",12.2);
System.out.println(ba.getInfo());
System.out.println(bb.getInfo());
System.out.println(bc.getInfo()); }
}
发现static定义的属性和方法都不受=到实例化对象的控制,也就是说都属于独立类的功能。
但是这个时候就会出现一个特别麻烦的问题:此时类中的方法就变成了两组:static方法、非static方法。这两种方法间的访问也将受到限制:
·static方法不能够直接访问非static属性或者方法,只能够调用static属性或方法;
·非static可以访问static属性或者方法,不受任何限制;
分析:为什会存在以上的限制呢?
·所有的非static定义的结构,必须在类已经明确的产生了实例化对象才会分配堆内存空间,才可以使用;
·所有的static定义的结构,不受实例化对象的控制,即:可以在没有实例化对象的时候访问。
解决问题:
在最早讲解方法的时候曾经讲解过,如果一个方法定义在了主类之中,并且有主方法直接调用的话,方法语法:
public static 返回值类型 方法名称(参数类型 参数名称...){
     [return [返回值];]
}
而后来到了编写类的时候,发现方法的定义格式改变了(方法由对象调用了)。
 
 
public 返回值类型 方法名称(参数类型 参数名称...){
     [return [返回值];]
}
范例:观察如下代码
public class TextDemo {
public static void main(String[] args) {
fun();
}
public static void fun() {
System.out.println("Hello Wirld !");
}
}
如果此时fun()方法上取消了static,那么就变为非static方法。所有非static方法必须有对象调用,也就说此时static方法如果想使用费static操作,必须产生对象后调用。
public class TextDemo {
public static void main(String[] args) {
new TextDemo().fun();
}
public static void fun() {
System.out.println("Hello Wirld !");
}
}
与属性定义规则一样,定义一类的时候首先考虑的依然是非static方法,因为所有的类如果保存的信息多(有属性),那么每一个对象执行之一个方法的时候,就可以利用自己的属性实现方法的不同调用。
class Book{
private boolean flag;
public Book(boolean flag) {
this.flag = flag;
}
public void fun(){
if(this.flag) {
System.out.println("可以操作");
} else {
System.out.println("不可以操作");
}
}
}
public class TextDemo {
public static void main(String[] args) {
Book ba = new Book(true);
Book bb = new Book(false);
ba.fun();
bb.fun();
}
}
但如果说现在你的没里面咩有任何属性的存在,只有方法,建议可以将所有的方法定义为static方法,这样就不用在每次调用的时候都实例化对象。
范例:实现数学加法的操作
class MyMath{
public static int add(int x,int y) {
return x + y;
}
}
public class TextDemo {
public static void main(String[] args) {
System.out.println(MyMath.add(10, 20));
}
}
此时MyMath类没有属性,产生对象完全没有任何的意义,所以会使用static方法。
写一个类的时候优先考虑的一定是非static方法或非static属性。

2.3、主方法

Java语言的主方法实在是有够长,那么下面观察每一个方法的组成:

·public:主方法是程序的开始,所以这个方法对任何的操作都一定可见的,那么是可见的就必须使用public(公共);

·static:证明此方法只有类名称调用的;

·void:主方法是一切执行的开始点,既然是所有的开头,那么就不能回头,执行完毕为止;

·main:是一个系统规定好的方法名称,不能够修改;

·String srgs[]:指的是程序运行的时候,传递的参数;

范例:得到参数

public class TextDemo {
public static void main(String[] args) {
for (int x=0; x<args.length; x++) {
System.out.println(args[x]);
}
}
}
所有输入的参数必须使用空格分割,例如:“java。TestDemo
参数 参数...”。可是如果说输入的参数本身就收空格呢?使用“”””描述:“java。TestDemo
“Hello World” “Hello MLDN””。

2.4、static实际应用

在之前总结的结论:

·不管有多少个,都使用同一个static属性;

·使用static的方法可以避免实例化对象调用方法的限制。

功能一:实现类实例化对象个数的统计

希望每当实例化一个对象的时候都可以打印一个信息:产生的第几个实例化对象。

因为只要新的实例化对象产生了,那么一定会调用类中的构造方法,所有在构造方法里面增加一个统计数据的一个操作,每当新对象产生之后统计的内容就自增一个。

class Book{
private static int num = 0;
public Book () {
num++;
System.out.println("这是第" + num + "个产生的对象");
}
}
public class TextDemo {
public static void main(String[] args) {
new Book(); new Book(); new Book();
new Book(); new Book(); new Book();
}
}
功能二:实现属性的自动设置
例如:现在某一个类有一个无参构造方法,一个有参构造方法,有参构造主要的目的是传递一个title属性,但是希望不管调用的无参的还是有参的构造,都可以为title设置内容(尽量不使用重复的内容设置)。
class Book{
private String title;
private static int num = 0;
public Book () {
this("NOTITLE - " + num++);
}
public Book (String title) {
this.title = title;
}
public String getTitle() {
return this.title;
}
}
public class TextDemo {
public static void main(String[] args) {
System.out.println(new Book("Java").getTitle());
System.out.println(new Book().getTitle());
System.out.println(new Book().getTitle());
}
}
此时就算没有设置title属性内容,那么最终的结果也不会是null。

3、总结

1、开发之中首选的属性一定不是static属性,首选的方法一定不是static方法;

2、static属性和方法可以在没有实例化对象的时候直接由类名称进行地调用;

3、static属性保存在全局数据区

内存取一共有四个:栈内存(地址)、对内存(普通属性)、全局数据区(static)、全局 代码区(方法)。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: