讲一下Math这个类( * /ω\* )
什么是static???为了引出今天的主题,我先讲一下我学习过程中遇到的一个疑惑,通过这个疑惑来引出自己知识存在缺陷的地方,并通过学习进修修补。嗯。。。是这样的,当时纠结暑假是学Java好呢还是Python,于是我就想写、generate一个100以内随机数,通过判断奇偶,来做出我的选择(选择困难症波(;д;)),于是我问了下度娘,最终很简单一行代码 ↓↓↓↓↓↓↓↓↓↓↓↓
int num = (int) (Math.random()*100);
额,,我疑惑来了,为什么不这样用呢 ↓↓↓↓↓↓↓↓↓↓↓↓
//The following code is an error
Math math = new Math();
int num = (int)(math.random()*100);
纳尼,竟然给我报错了!!!第一行的代码报ERROR:The constructor Math() is not visible
(▼へ▼メ)纳尼,我惹你呢,干嘛不让我visit你。。。于是乎我按住Ctrl,翻出了源代码,发现这东西↓↓↓↓↓↓↓↓↓↓↓↓
public final class Math {
......
/**
* Don't let anyone instantiate this class.
*/
private Math() {}
......
}
(▼ヘ▼#)Java开发人员是几个意思啊,Don’t let anyone instantiate this class!!!(private这个访问修饰符限制外部类对其进行访问)。在查看源代码与API文档后,我发现,Math类里的所有方法都有static来修饰。为什么要这样呢?于是乎我翻了翻书(《Java语言程序设计 基础篇》 P227)
注意 在大多数情况下,构造方法应该是公共的。但是,如果想防止用户构造类的实例,就该使用私有构造方法。例如:因为Math类的所有数据域和方法都是静态的,所以没必要创建Math类的实例。
嗯,因为都是静态的(static)所以就没必要实例化Math了。再通过生成随机数的代码(Math.random())发现,我直接通过类名.Method()就可以直接调用该类下面的函数了,为什么会这样呢,static发挥的作用,下面开始对它进行探索。
Java中的static的使用
As we all know,我们可以基于一个类创建许多个对象,每个对象都拥有他们各自的成员变量,成员方法,他们之间相互独立。然而在某些情况下,我们需要的是,该类的所有对象共用一个成员,这时候,static这个修饰符就大显身手了。
在Java中,用static修饰的成员称为静态成员,它属于这个类所有,而不属于某个对象(即类的实例),这样就表明,该成员被该类的所有对象所共享!静态成员可以使用类名直接访问,也可以使用对象名进行访问(这句话就解决了我前面的疑惑了(~ ̄▽ ̄)~ )
为了更深刻的认识,我们来一段代码 ↓↓↓↓↓↓↓↓↓↓↓↓
静态成员变量
public class Main {
static int myAge = 20;
public static void main(String[] args) {
//静态变量访问方法1:通过类名访问
System.out.println(Main.myAge);
//静态变量访问方法2:通过实例化对象的 对象名访问
Main me = new Main();
System.out.println(me.myAge);
//再创建一个对象
Main ta = new Main();
//修改对象me的成员变量
me.myAge = 18;
//见证奇迹的时刻
System.out.println("类直接访问:" + Main.myAge);
System.out.println("对象me访问:" + me.myAge);
System.out.println("对象ta访问" + ta.myAge);
}
}
这是输出结果:
20
20
类直接访问:18
对象me访问:18
对象ta访问18
通过上处代码,就能理解“该成员被该类的所有对象所共享”的含义了,一旦某个类的实例对象对其静态成员进行了修改,那么该类的其余示例对象的这个静态成员也会相应的会被修改,就是这样,琢磨下这段话(* ̄︶ ̄),额,画个图吧,这就容易理解了!
惨不忍睹( * / ω\* )
静态成员方法
刚说了成员变量,现在说说方法。。。其实函数,方法,function,method,啥区别???
直接放代码就行了 ↓↓↓↓↓↓↓↓↓↓↓↓
public class Main2 {
public static void print(){
System.out.println("miss");
}
public static void main(String[] args) {
//静态方法访问方法1:通过类名访问
Main2.print();
//静态方法访问方法2:通过对象示例访问
Main2 me = new Main2();
me.print();
}
}
输出结果:
miss
miss
三个需要注意的点
1、静态方法中可以直接调用该类中的静态成员,但不能调用非静态成员
public class Main2 {
String interst = "programing";
static String major = "Horticulture";
public static void print(){
System.out.println("My interst:" + interst);//这行代码是错误的!!!错误的!!
System.out.println("My major" + major);
}
}
为了在静态方法中可以访问非静态成员,我们可以通过创建类的实例进行访问,代码更正如下:
Main2 me = new Main2();
System.out.println("My interst:" + me.interst);
2、普通成员方法中可以直接访问非静态成员与静态成员
刚刚那段代码也可以这样改,将 print()的static修饰去掉:
public class Main2 {
String interst = "Programing";
static String major = "Horticulture";
public void print(){
System.out.println("My interst:" + interst);
System.out.println("My major" + major);
}
}
3、静态方法中不能直接调用非静态方法
public class Main2 {
public void print(){
System.out.println("My interst:Programing");
}
public static void show(){
System.out.println("My major:Horticulture");
}
public static void main(String[] args) {
show();//静态方法中可以直接访问该类的静态方法
//普通方法需要通过对象示例访问
Main2 me = new Main2();
me.print()
}
}
恩恩,end…