关于static的一些认识

static:
(一)static方法
1.在static方法内部不能直接调用非static方法/变量,需先创建对象(原因:静态方法/变量在类加载的时候就分配了内存块,而非静态方法/变量在new这个类的对象时才分配内存块,他们分配内存的时间不一样,所以static区域访问非static区域是没有意义的;也可以理解为,static方法/变量是属于类的,而非static方法/变量必须依附于对象才能被调用,所以在调用前要先创建对象。),而在非static方法内部可以调用static方法/变量 。

2.在没有创建任何对象的前提下,仅通过类本身就可以调用static方法/变量 (static方法/变量 的主要用途)。被static关键字修饰的方法/变量不需要依赖对象进行访问,只要类被加载了,就可以通过类名进行访问。

3.static修饰的方法/变量是属于类的,而不是专属于对象的。而this是当前对象的引用,也就是说只能用this来调用属于当前对象的方法/变量,如果使用类来调用而不是对象来调用,this就无法指向合适的对象,所以static方法就是没有this的方法(static不能和this、super一起使用)。

4.可以编写static代码块来优化程序性能。

5.类的构造器,可以算是静态方法(原因:静态方法可以在未创建对象时调用,而构造方法在对象未创建时调用,可以看作静态方法),也不完全是静态方法(原因:静态方法不能调用非静态方法,而构造方法可以调用非静态方法,所以构造器不算是静态方法)。---此说法有待考证
ps:简单说:
从Java语言层面看,构造器不是静态方法。事实上规范专门规定了构造器不是方法。
从JVM层面看,构造器属于特殊的初始化方法,但仍然不被归类为静态方法。
无论从哪个层面看,构造器都是可以静态分派的(statically dispatched)。但要特别注意的是,并非所有可以静态分派的代码都是静态方法,这是规范里有定义的术语。
无论从哪个层面看,构造器都要接收从调用方传入的隐藏this参数。Java的静态方法不需要接收该参数,而实例方法要接收该参数。这方面构造器更接近于可以静态分派的实例方法,例如私有实例方法。这就是为什么从构造器可以调用this上的实例方法。
书中的Dog例子,确实当Dog被首次实例化或其静态方法/静态变量被首次访问时,会触发Dog类的初始化。但构造器在此并不可以归类到静态方法的一侧。事实上构造器并不能被单独调用,而必须用在new表达式里,此时触发类初始化的正是new,而不是对构造器的调用——new与构造器调用是两码事。(关于构造器是否为static方法,参考地址: https://www.zhihu.com/question/35860619/answer/64802279

(二)static变量
1.静态变量和非静态变量的区别:
(1)静态变量被所有对象共享,在内存中只有一个副本,当且仅当在类初次加载时被初始化。
(2)非静态变量是对象所拥有的,在创建对象时被初始化,存在多个副本,各个对象拥有的副本互不影响。

(三)static代码块
static代码块可以存在类中的任何地方(但不能是方法内部),类中可以有多个static代码块。在类初次被加载的时候,按照static代码块的顺序执行每个static块,并且只执行一次。(特性:只在类加载的时候执行一次)

几个容易混淆的误区:
1.static不会影响变量或者方法的作用域,在java中能够影响到访问权限的只有public,private,protected这几个关键词。
2.所有的static方法/变量都可以通过对象访问。
3.在java中,static不允许用来修饰局部变量。
(参考资料:

(题外话:
1.单独用{}包起来的称为代码块,java的代码块主要分为四种:普通代码块 构造代码块 static代码块 同步代码块
2.生成对象的时候,现初始化成员变量,然后再执行构造器

参考网址:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JFrame是Java语言中的一个类,用于创建图形用户界面(GUI)的窗口。它继承自Java AWT(抽象窗口工具集)中的Frame类,但是提供了更多的功能和灵活性。JFrame可以包含其他组件,例如按钮、文本框、标签和其他面板等,可以通过编写Java代码来控制和管理这些组件。 在使用JFrame时,我们需要先创建一个JFrame对象,然后设置其标题、大小、位置和关闭操作等属性。接着,我们可以向JFrame中添加其他组件,例如按钮和文本框,并设置它们的位置和大小等属性。最后,我们需要将JFrame设置为可见状态,以便用户可以看到和操作其中的组件。 以下是一个简单的示例代码,用于创建一个带有“Hello World”标签和“点击我”按钮的JFrame窗口: ```java import javax.swing.*; public class MyFrame extends JFrame { public MyFrame() { // 设置窗口标题 setTitle("My Frame"); // 设置窗口大小 setSize(400, 300); // 设置窗口位置 setLocationRelativeTo(null); // 设置关闭操作 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建一个标签 JLabel label = new JLabel("Hello World"); // 创建一个按钮 JButton button = new JButton("点击我"); // 将标签和按钮添加到窗口中 add(label); add(button); // 设置布局管理器 setLayout(new FlowLayout()); // 设置窗口可见 setVisible(true); } public static void main(String[] args) { new MyFrame(); } } ``` 上述代码创建了一个MyFrame类,它继承自JFrame类,并在构造方法中设置了窗口的属性、添加了标签和按钮,并设置了布局管理器和窗口的可见状态。在main方法中,我们创建了一个MyFrame对象,启动了程序并显示了窗口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值