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属性)最大的区别在于保存的内存区域的不同。
既然static是一个公共属性的概念,那么如果只是简单的由一个对象去修改static属性的做法很不合适,那么最好的做法是由所有对象的公共的代表来进行访问,那么就是类,所有来讲利用static定义的属性是可以由类名称直接调用的。
Book.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(可以方便集体修改,可以重复开辟内存空间)。
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定义的结构,不受实例化对象的控制,即:可以在没有实例化对象的时候访问。
解决问题:
在最早讲解方法的时候曾经讲解过,如果一个方法定义在了主类之中,并且有主方法直接调用的话,方法语法:
public static 返回值类型 方法名称(参数类型 参数名称...){ [return [返回值];] } |
|
public 返回值类型 方法名称(参数类型 参数名称...){ [return [返回值];] } |
public class TextDemo { public static void main(String[] args) { fun(); } public static void fun() { System.out.println("Hello Wirld !"); } } |
public class TextDemo { public static void main(String[] args) { new TextDemo().fun(); } public static void fun() { System.out.println("Hello Wirld !"); } } |
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(); } } |
范例:实现数学加法的操作
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)); } } |
写一个类的时候优先考虑的一定是非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
“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()); } } |
3、总结
1、开发之中首选的属性一定不是static属性,首选的方法一定不是static方法;2、static属性和方法可以在没有实例化对象的时候直接由类名称进行地调用;
3、static属性保存在全局数据区
内存取一共有四个:栈内存(地址)、对内存(普通属性)、全局数据区(static)、全局 代码区(方法)。
相关文章推荐
- Java中static关键字解析
- Static和Const关键字
- java提高篇(七)-----关键字static
- C++中的static关键字的总结
- static 关键字
- 黑马程序员——OC语言基础---extern和static关键字
- [java学习笔记]java语言核心----面向对象之static关键字
- static 关键字
- static关键字----->单例模式
- java中的static关键字
- C/C++中static关键字详解
- Java关键字final、static使用总结
- Java关键字final、static使用总结
- C++的static关键字(转载)
- 静态代码块-static关键字
- C/C++中static关键字详解
- IOS学习笔记(9)——static关键字
- java基础---(1)java中的final,static关键字
- C#中的static关键字
- 使用static关键字隐藏函数 [C]