java关键字 Static

概述

简单来说static是用来方便在没有创建对象的情况下直接通过类名去调用类的方法或变量。

使用场景

1.static变量也称为静态变量,它的对立面是非静态变量,区别是静态变量只在类初次加载时会被初始化且在内存中只有一个副本是能被所有对象所共享的。

2.static方法也称为静态方法,对于静态方法来说它不依赖于任何对象所以在静态方法中是不能访问类的非静态成员变量及方法的,因为非静态成员变量和方法必须是由具体的实例对象去调用。因此它和this(依附于实例对象) 是无缘的,但在非静态方法中可以用静态成员变量和方法。举个最常见的例子static方法就是main方法了为什么它必须是static的,因为main方法是一个程序的入口,在没有创建任何对象时只能通过类名来访问。

3.static修饰类,普通类是不能声明为静态的,但可以用来修饰内部类

public class Test{

    public static class Inner{
        Inner(){
            System.out.println("我是一条内部类咸鱼");
        }
        public void InnerMethod() {
            System.out.println("我想游泳");
        }
    }

  public static void main(String[] args){
    //直接访问内部类
    Inner inner = new Test.Inner();
    //调用方法
    inner.InnerMethod();
  }
}

/**输出
  **************************我是一条内部类咸鱼*********************
  **************************我想游泳******************************
*/

如果不用static修饰Inner类,则只能通过new 一个实例去调用。

4.静态导包,常用于静态方法以及含有静态方法的类,枚举类等的导入,可以在编译阶段确定导入类的信息或者方法信息。

public class Test {

    public void test() {
         System.out.println("静态导包。。。");
    }

}



import static com.fac.Test.test;

public class Test2 {


   public static void main(String[] args) {
		test();   // 静态导包。。。
	}

}

5.static代码块,用来当做静态代码块优化性能。static代码块可以有多个,在类初次被加载时会按照顺序去加载每个代码块且只会执行一次。(可放在除方法外的任何地方)执行顺序如下:

父类静态变量

父类静态代码块

子类静态变量

子类静态代码块

父类普通变量

父类普通代码块

父类构造函数

子类普通变量

子类普通代码块

子类构造函数

例证:

public class Test2 extends Test1{
 
    static{
        System.out.println("咸鱼2号");
    }
     
    public Test(){
        System.out.println("构造咸鱼2号");
    }
     
    public static void main(String[] args) {
        new Test2();
    }
}
 
class Test1{
     
    static{
        System.out.println("咸鱼1号");
    }
     
    public Test1(){
        System.out.println("构造咸鱼1号");
    }
}


//  咸鱼1号
//  咸鱼2号
//  构造咸鱼1号
//  构造咸鱼2号

别的就不一一列举了有兴趣的可以自己试试。

深入分析

上面只是基本的使用场景,下面从jvm内存角度解析一下

简单描述java 运行时的数据区域

java堆:

1、存的是全是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)

2、jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

栈区:

1.每个线程包含一个栈区,栈里只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中

2、每个栈里的数据(原始类型和对象引用)都是私有的,其他栈不能访问

3、栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)

方法区:

1、也称静态区,包含所有的class和static变量,和堆一样被所有的线程共享。

2、包含的都是在整个程序中永远唯一的元素,如class,static变量。

这样就很逻辑就很清晰了,静态变量和方法都是在方法区(静态区),new的对象 和成员变量是在堆中,指向对象的引用都放在栈里。堆中的成员变量、栈里的引用会随着对象的消失而消失 但静态区中的静态变量是所有线程共享且不会消失的。

后续

  抽象(abstract)方法能否被static 修饰?

     答:不能,抽象方法将来是要被重写的,而静态方法是不能重写的。(重写的首要条件是要有对象)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
Java 中,static 是一个关键字,它可以用来修饰类、方法和变量。这里将详细介绍 static 的用法。 1. 修饰类 当 static 修饰一个类时,它意味着这个类是静态的,也就是说,这个类的所有成员都是静态的,包括它的成员变量和成员方法。这意味着,你可以在不创建类的实例的情况下,直接访问这个类的成员变量和成员方法。例如: ``` public class MyClass { public static int myStaticVariable = 10; public static void myStaticMethod() { System.out.println("This is a static method."); } } // 访问静态变量和静态方法 int x = MyClass.myStaticVariable; MyClass.myStaticMethod(); ``` 2. 修饰方法 当 static 修饰一个方法时,它意味着这个方法是静态的,也就是说,这个方法属于类而不是属于实例。这意味着,你可以在不创建类的实例的情况下,直接调用这个方法。例如: ``` public class MyClass { public static void myStaticMethod() { System.out.println("This is a static method."); } } // 调用静态方法 MyClass.myStaticMethod(); ``` 3. 修饰变量 当 static 修饰一个变量时,它意味着这个变量是静态的,也就是说,这个变量属于类而不是属于实例。这意味着,所有这个类的实例都共享这个变量,也就是说,如果你修改了这个变量的值,那么所有实例都会受到影响。例如: ``` public class MyClass { public static int myStaticVariable = 10; } // 修改静态变量的值 MyClass.myStaticVariable = 20; ``` 总之,static 关键字主要用于在类级别上创建变量和方法。它可以让你在不创建类的实例的情况下,直接访问类的成员变量和成员方法,或者在类的实例之间共享变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值