Java学习笔记第二篇,今天讲下static

讲一下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…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值