Java 关键字 static
关键字static作用如下:
1. 为某个基本数据类型或对象分配单一的存储空间。
2. 实现某个属性或方法与类关联。在类被加载后类名可以直接调用静态成员方法(下面简称静态方法)或者访问静态成员变量(下面简称静态成员变量)。对象也可以做到。
有4种使用情况:
1. 静态属性即静态成员变量
2. 静态方法
3. 静态代码块
4. 静态成员类
静态方法
因为静态方法不依赖于对象,所以静态方法内部不能使用this。因为非静态方法和非静态成员变量依赖于对象,所以静态方法内部不能调用非静态方法或者访问非静态成员变量。而非静态方法内部可以调用静态方法或者访问静态成员变量。静态方法只能定义在顶级类(不同于内部类)或者静态内部类里面。
空对象调用静态方法:
public class NullInvoker {
public static void testNullInvoker(){
System.out.println("in testNullInvoker");
}
public static void main(String[] args) {
NullInvoker NULL = null; // 虽然这里是空指针,但是下面依然可以执行下去
NULL.testNullInvoker(); // 正常运行
}
}
结果:
in testNullInvoker
静态方法不能被重写:
public class TestStaticMethod {
public static void main(String[] args) {
SubClass s = new SubClass();
Parent p = s;
p.testStatic(); // 打印父类方法
s.testStatic(); // 打印子类方法
}
}
class Parent {
public static void testStatic() {
System.out.println("父类方法");
}
}
class SubClass extends Parent {
public static void testStatic() {
System.out.println("子类方法 ");
}
}
结果:
父类方法
子类方法
静态成员变量
静态成员变量和非静态成员变量的区别是:静态成员变量被所有的对象所共享,在内存中只有一个副本,在类被加载时会被初始化。而非静态成员变量是单个对象所独有,在创建对象时被初始化,存在多个副本,各个对象拥有的副本互不影响。
静态代码块
仅在类被加载时会执行静态代码块。任何方法内部都不能使用静态代码块。
注意:Java语法规定static不能修饰局部变量。
笔试题
这段代码的输出结果是什么?
public class Test {
Person person = new Person("Test");
static{
System.out.println("test static");
}
public Test() {
System.out.println("test constructor");
}
public static void main(String[] args) {
new MyClass();
}
}
class Person{
static{
System.out.println("person static");
}
public Person(String str) {
System.out.println("person "+str);
}
}
class MyClass extends Test {
Person person = new Person("MyClass");
static{
System.out.println("myclass static");
}
public MyClass() {
System.out.println("myclass constructor");
}
}
结果:
test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor
创建当前类的对象过程:先初始化成员变量,再执行构造器。
参考资料
关于静态方法为什么不能被重写的一点思考以及overload的一些坑。
《 Java程序员面试笔试宝典》 P80-83
Java 关键字 static的更多相关文章
- java关键字static使用总结
java关键字static使用总结 1.static修饰的方法被称之为静态方法也叫做类方法,加static的方法,可以通过类名直接访问,不加static的方法只能通过对象名访问. 静态方法可以直接通过 ...
- java笔记——Java关键字static、final使用小结
static 1. static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的 ...
- Java关键字--static
在Java中,将关键字static分为三部分进行讨论,分别为Java静态变量.Java静态方法.Java静态类 Java Static Variables Java instance variable ...
- Java关键字static、final
static 1. static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的 ...
- Java关键字static、final使用小结
static 1. static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的 ...
- [JAVA关键字] static & final
JAVA十分常见的关键字static & final 总的来说final表示常量,即不可更改的:而static表示静态,即全局的 1. final 类:不能被继承 2. final 方法:能被 ...
- java 关键字static
在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码块. Java把内存分为栈内存和堆内存, 栈内存用来存放一些基本类型的变量.数组和对象的引用, 堆 ...
- java关键字“static”
Java中static使用方法 1.static静态变量 静态变量:每个类只有一个,所有实例共享: 实例变量:每个实例只有一个: package test2; import java.lang.Str ...
- Java关键字——static
static申明属性 如果有属性希望被所有对象共享,则必须将其申明为static属性. 使用static声明属性,则此属性称为全局属性,有时候也称为静态属性. 当一个类的属性申明位static的时候, ...
随机推荐
- 虚拟机设置静态IP与配置网络
不废话,直接上图 一:先配置虚拟机的网络 二:配置win10-VM8网络 三:查看以太网的ip信息,直接在管理员命令中输入 ipconfig /all可以到连接信息 四:如果在上面找不到VM8的网络信 ...
- std::string 是什么
#include "stdafx.h" #include <iostream> #include <string> using std::cout; usi ...
- POJ 2987 Firing【最大权闭合图-最小割】
题意:给出一个有向图,选择一个点,则要选择它的可以到达的所有节点.选择每个点有各自的利益或损失.求最大化的利益,以及此时选择人数的最小值. 算法:构造源点s汇点t,从s到每个正数点建边,容量为利益.每 ...
- Java基础知识➣集合整理(三)
概述 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个层次. 实现(类) ...
- python之logging
1.简单使用 # CRITICAL, ERROR, WARNING, INFO, DEBUG) cewid import logging logging.basicConfig(level=loggi ...
- 【AtCoder】AGC031
A - Colorful Subsequence 答案是 \(\prod_{c = 'a'}^{'z'} (cnt[c] + 1)\) #include <bits/stdc++.h> # ...
- Python_shelve模块
shelve:对象持久化的保存的模块,将对象保存到文件里 (默认的数据存储文件为二进制),可持久化任何pickle可支持的Python数据格式 shelve 中唯一的方法: shelve.open( ...
- Bean Shell常用内置变量总结
JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:写入信息到jmeber.log文件,使用方法:log.info( ...
- SSL/TLS
為 授权计算机为 SSL/TLS 安全通道建立信任关系. ServicePointManager.ServerCertificateValidationCallback += (o, c, ch, e ...
- Could not find result map XXX 解决办法
错误定位在xml文件中 resultmap类型不匹配