Java静态的浅谈

思考一个问题:我们是如何调用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的静态变量值必须在声明或静态初始化程序中赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值