思考一个问题:我们是如何调用Math类的方法? 是下面第一个方法还是第二个方法?
int x=Math.round(42.2)
Math math=new Math();
math.round(42.2)
但是第一个,为什么是第一个而不是第二个了?明明Math是个类啊,就该实例。然而我们查看源码可以发现实际上是Math的构造函数时私有的!这就代表你无法创建Math的对像.实际上像round()、abs()、max()等数学运算方法都不需要实例变量值,事实上也无法创建。为什么Math这个类中的所有方法都不需要实例变量值。因为这些方法都是静态的,所以你无须Math的实例,你会用到的只有它本身。 static这个关键字可以用来标记出不需要类实例的方法,一个静态的方法代表说"一种不依靠实例变量也就不需要对象的行为" 静态方法不能调用非静态的变量
public class test1 {
private int size;
public static void main(String[] args) {
System.out.println(size);
}
public void setSize(int s){
size=s;
}
public int getSize(){
return size;
}
}
另外之前还学过abstract修饰的抽象类,抽象类是不能被初始化的。但是我们也可以用私有化的构造函数来限制非抽象类被初始化,被标记为private的方法代表只能被同一类的程序所调用 静态方法也不能调用非静态的方法 最明显的例子就是main函数就是静态方法public static void main(String[] args) 里面有static关键字,如果在mian函数里直接调用另一个函数,能成功吗?
public class test1 {
public static void main(String[] args) {
System.out.println("1+2="+sum(1,2));
}
public int sum(int a,int b) {
return a+b;
}
}
解决方法有两种 1.将sum()改为静态方法
public class test1 {
public static void main(String[] args) {
System.out.println("1+2="+sum(1,2));
}
public static int sum(int a,int b) {
return a+b;
}
}
2.创建对象调用
public class test1 {
public static void main(String[] args) {
test1 test=new test1();
System.out.println(test.sum(1,2));
}
public int sum(int a,int b) {
return a+b;
}
}
如果从静态方法调用非静态方法,但此非静态方法没有用到实例变量,这样会通过编译吗? 答案是:不能,编译器可以知道你有没有使用实例变量。如果现在可以通过,后来却把非静态变量改为实例变量了?又如果子类去覆盖这个方法成有用到实例变量的版本了? 静态变量:他的值对所有的实例来说都相同(相当于全局变量) 所以:1、静态变量是共享的 2、同一类所有的实例共享一份静态变量 3、实例变量:每个实例一个 静态变量:每个类一个 4、静态项目的初始化有两个特征 1》静态变量会在该类的任何对象创建之前就完成初始化 2》静态变量会在该类的任何静态方法创建之前就完成初始化 如果我们没有给静态变量赋值,则会设定使用默认值 问:静态的方法不能存取非静态的变量,但非静态的方法可以读取静态的变量吗? 答案:可以,非静态方法不可以调用该类的静态方法或静态的变量 静态的final变量就是常数 例如看Math源码中的PI定义
public static final double PI=3.141592653589793;
此处标记为public,因此可以提供各方读取 此处标为static,所以不需要Math的实例 此处标记为final,所以PI不变 常变量的名称必须用大写字母表示 final的静态变量值必须在声明或静态初始化程序中赋值
|