首页 > 其他分享 >Day35--static关键字详解

Day35--static关键字详解

时间:2024-11-21 16:11:29浏览次数:1  
标签:-- 代码 Day35 System 静态 static println public

Day35--static关键字详解

示例:

package com.liu.oop.demo07;

//static
public class Student {
    private static int age;     //静态的变量
    private double score;       //非静态的变量

    public static void main(String[] args) {
    
        Student s1 = new Student();
        
        System.out.println(s1.age);     //通过对象调用方法
        System.out.println(Student.age);//通过类调用方法

        System.out.println(s1.score);
        System.out.println(Student.score);//报错
    }
}

上面的代码,为什么对方法age,通过对象调用和通过类调用都可以,而对方法score,不能通过类调用?

详细解释;

一、关于静态变量
在 Java 中,静态变量(用static关键字修饰)的,既可以通过类名Student来访问它(如Student.age),也可以通过创建的对象来访问(如s1.age,这里s1Student类的一个实例对象)

二、关于非静态变量

非静态变量(没有用static关键字修饰的变量)必须通过创建对象来访问。

再比如:创建了非静态方法run和静态方法go,如何在下面的代码main方法中调用他们?

package com.liu.oop.demo07;

//static
public class Student {
    private static int age;     //静态的变量
    private double score;       //非静态的变量

    public void run(){}
    public static void go(){}

    public static void main(String[] args) {
        
    }
}

实际方法:

package com.liu.oop.demo07;

//static
public class Student {
    private static int age;     //静态的变量
    private double score;       //非静态的变量

    public void run(){}
    public static void go(){}
    
    public static void main(String[] args) {
        new Student().run(); //调用非静态方法
        Student.go();        //调用静态方法
         //go();   在同一个类里面,也可以
    }
}

与此同时,我们发现了一个有趣的事情:

​ 非静态方法可以调用静态方法,但是静态方法不能调用非静态方法

 public void run(){
        go();//可以
    }
    
    public static void go(){
        run();//报错
    }

在类里面,有代码块

package com.liu.oop.demo07;

public class Person {


    {
        //代码块(匿名代码块)

    }


   static {
        //静态代码块

    }



}

我们可以借此了解代码块的相关信息

猜一猜,下面的代码输出结果是什么?

package com.liu.oop.demo07;

public class Person {


    {
        System.out.println("匿名代码块");
        //代码块(匿名代码块)

    }


   static {
       System.out.println("静态代码块");
        //静态代码块

    }

    public Person() {
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        new Person();
    }
}

代码输出结果是:

静态代码块
匿名代码块
构造方法

代码第一次执行,按照先后顺序来看,

首先执行的是:静态代码块

然后执行的是:匿名代码块

最后执行的是:构造器

也就是说,在创建对象的时候,先执行静态代码块,再执行匿名代码块,最后执行构造器

那么,再执行一次,结果会有变化吗?

package com.liu.oop.demo07;

public class Person {

    //2
    {
        System.out.println("匿名代码块");
        //代码块(匿名代码块)

    }

    //1
   static {
       System.out.println("静态代码块");
        //静态代码块

    }

    //3
    public Person() {
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Person person1 = new Person();
        System.out.println("=========================================");
        Person person2 = new Person();
    }
}

输出结果:

静态代码块
匿名代码块
构造方法
=========================================
匿名代码块
构造方法

可见,静态代码块只执行一次

匿名代码块可以用来赋初始值

再一个例子:

想生成随机数,我们可以这样:

package com.liu.oop.demo07;

public class Test {
    public static void main(String[] args) {
        System.out.println(Math.random());
    }
}

但是,能不能直接System.out.println(random()); 不用Math?

可以!!!

导入

package com.liu.oop.demo07;

//静态导入包
import static java.lang.Math.random;

public class Test {
    public static void main(String[] args) {
        System.out.println(random());
    }
}

拓展:

如果类是被final修饰的,他没有子类

假如Person是被final修饰的,想让Test作它的子类,不行

package com.liu.oop.demo07;

public final class Person 
public class Test extends Person{  //报错

标签:--,代码,Day35,System,静态,static,println,public
From: https://www.cnblogs.com/xiaokunzhong/p/18560975

相关文章

  • 使用 vscode 调试 nodejs 代码
    继前一篇:使用cmake.js在Windows上编译js代码我们已经能在vscode上成功的编译出js代码,那我们该如何断点调试js代码以及js引用的C库源码呢首先要先以Debug模式编译js代码cmake-jscleancmake-jscompile-D找到debug生成的pdb文件,这个很重要,关......
  • 私有化部署视频平台EasyCVR宇视设备视频平台如何构建视频联网平台及升级视频转码业务?
    在当今数字化、网络化的时代背景下,视频监控技术已广泛应用于各行各业,成为保障安全、提升效率的重要工具。然而,面对复杂多变的监控需求和跨区域、网络化的管理挑战,传统的视频监控解决方案往往显得力不从心。EasyCVR视频融合云平台作为TSINGSEE青犀视频“云边端”架构体系中的核心......
  • 修改jar包中的class文件(windows)
    本文只适用于修改引用较少的class文件,引用较多的话,比较复杂,容易出错以下都是在windows环境下操作的1.利用jd-jui工具将jar包打开,找到需要修改的class文件选中文件---点击菜单File-----savesource ---将需要修改的class文件以及其引用到的文件转换为java文件保存到本地 2......
  • 视频流媒体播放器EasyPlayer.js无插件直播流媒体音视频播放器Android端webview全屏调
    流媒体播放器的核心技术与发展趋势正在不断推动着行业的变革。未来,随着技术的不断进步和应用场景的不断拓展,流媒体播放器将为用户带来更加便捷、高效、个性化的观看体验。同时,流媒体播放器也会成为数字娱乐产业的重要组成部分,为整个行业的繁荣发展贡献更多的力量。Android端webvi......
  • manim边做边学--圆环面
    Torus类在制作数学、物理或工程领域的动画时具有广泛的应用场景。比如,通过动态演示环面的拓扑变换(如内外翻转、扭曲等),帮助我们直观地理解拓扑不变量和同胚等概念;此外,也可以模拟磁场线在环面导体中的分布和运动,展示电磁感应现象等等。本篇介绍Torus的主要参数和基本使用方法。1......
  • 最简单的纯CSS3滑动开关按钮特效
    在线预览  下载HTML结构该滑动按钮的基本HTML结构使用一个<label>元素来包裹一个<input>元素和2个<span>元素。span.text-switch是按钮上的文字和背景,span.toggle-btn是滑动的按钮。<labelclass="switch-btn">    <inputclass="checked-switch"type="check......
  • Cppcheck 检测器列表和检查规则大全一览
    1、使用Cppcheck进行静态代码分析:完整的shell脚本与CMake集成实例 使用Cppcheck进行静态代码分析:完整的shell脚本与CMake集成实例使用Cppcheck进行静态代码分析:完整的shell脚本与CMake集成实例本文介绍如何使用Cppcheck进行静态代码分析,涵盖了Cppcheck的......
  • 可视化CSS3渐变背景颜色代码生成插件
    在线预览 特效下载 这是一款可以在线生成CSS3渐变背景颜色代码的可视化插件。你可以通过调节界面上给出的颜色、色相、饱和度和亮度滑块,以及渐变方向滑块来生成各种线性渐变,屏幕上会给出相应的CSS3线性渐变代码。该渐变背景颜色插件可以设置的选项有:BaseColor:Hue:色相......
  • 体重电子秤解决方案SIC8833智能设计开发
    蓝牙体重电子秤与普通的电子秤主要功能是没有多大区别,他们的区别在于蓝牙体重电子秤是一个可以通过APP连接将数据传送到云端并保存的秤。主要效果是将个人身体数据记录并分析,帮助你在日常生活中随时可查看数据并根据数据合理调节自己的生活健康方式蓝牙体重电子秤方案还......
  • gitee初建项目提交、更新
    提交代码1、先去github创建一个仓库(Repositories),得到这个仓库地址,如:https://github.com/xxxx/htmlDemo.git2、在要上传的文件夹里面打开gitbash,按顺序执行     ①gitinit     ②gitremoteaddoriginhttps://github.com/xxxx/htmlDemo.git     ③git......