JAVA_SE基础——35.static修饰成员函数
在Java中适用static关键字修饰的方法称为静态方法。
声明静态方法的语法格式如下:
权限修饰符 static 数据类型 方法名(){
方法体
}
静态方法
可以使用类名直接调用 类名.方法名()
1:静态函数中不能访问非静态成员变量,只能访问静态变量。
2:静态方法不可以定义this,super关键字.
3:非静态函数:非静态函数中可以访问静态成员变量
p.s.
静态成员: 静态变量或者是静态函数
声明为static的类成员或者成员函数便能在类的范围内共同享,我们把这样的成员称做静态成员和静态成员函数。
测试代码1(证明静态代码可以直接用类名调用):
class Test{
public static void printInfo(){
System.out.println("静态方法被调用");
}
public static void main(String[] args){
Test.printInfo();
}
}
运行结果:
测试代码2(证明:静态函数中不能访问非静态成员):
class Test{
int a = 2 ;
public static void printInfo(){
System.out.println(a);
}
public static void main(String[] args) {
Test.printInfo();
}
}
运行结果:
测试代码3(证明:静态函数只能访问静态成员):
class Test{
static int a = 2 ;
public static void printInfo(){
System.out.println("a = :"+a);
}
public static void main(String[] args) {
Test.printInfo();
}
}
运行结果:
测试代码4(静态方法不可以定义this,super关键字(super以后讲到这里先略过).):
class Test{
static int a = 2 ;
public static void printInfo(){
System.out.println(this.a);
}
public static void main(String[] args) {
Test.printInfo();
}
}
运行结果:
测试代码5(非静态函数中可以访问静态成员):
class Test{
static int a = 2 ;
public static void printInfo_1(){
System.out.println("静态方法被非静态方法调用中.....");
}
public void printInfo(){
printInfo_1();
System.out.println("a="+a);
}
public static void main(String[] args) {
Test b = new Test();
b.printInfo();
}
}
运行结果:
证明完了static的特征了 下面来回答大部分人的疑问:
为什么静态函数中不能访问非静态成员?
静态成员访问非静态成员时,如果非静态成员没有声明对象的情况下,静态函数中不能访问非静态变量。 如果静态成员一定要访问非静态变量的话。可以通过传递一个对象的引用到静态方法里,
测试代码6(传递一个对象的引用到静态方法里,让静态成员能访问到非静态变量):
public class Test{
int a = 1;
Test(int a){
this.a = a;
}
public static void ask(Test x){
x.say();
}
public void say(){
System.out.println("a="+a);
}
public static void main(String[] args){
Test c = new Test(2);
c.ask(c);
}
}
运行结果:
static特点
1 随着类的加载而加载,静态会随着类的加载而加载,随着类的消失而消失。说明它的生命周期很长。
2 优先于对象存在。-->静态是先存在,对象是后存在。
3 被所有实例(对象)所共享。
4 可以直接被类名调用
静态变量(类变量)和实例变量的区别:
1存放位置
①:类变量随着类的加载而加载存在于方法区中.
②:实例变量随着对象的建立而存在于堆内存中.
2生命周期
①:类变量生命周期最长,随着类的消失而消失.
②:实例变量生命周期随着对象的消失而消失.
3静态优缺点
优点:对对象的共享数据进行单独空间的存储,节省空间 例如Person 都有国籍。该数据可以共享可以被类名调
缺点:生命周期过长
访问出现局限性。(静态只能访问静态)
什么时候定义静态变量
1:静态变量(类变量)当对象中出现共享数据
例如:学生的学校名称。学校名称可以共享
对象的数据要定义为非静态的存放在对内存中(学生的姓名,学生的年龄)
什么时候定义静态函数
如果功能内部没有访问到非静态数据(对象的特有数据。那么该功能就可以定义为静态)
P.S.
静态方法作为类和接口的重要组成部分,可以通过类名或接口直接访问,通常将那些使用频率较高的方法声明为静态方法,从而可以方便地使用这些方法,并能提高程序的开发效率和性能。
static块
如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
注意:
class Code{
static{
System.out.println("Code的静态代码块");
}
}
public class CodeBlock{
static{
System.out.println("CodeBlock的静态代码块");
}
public static void main(String[] args){
System.out.println("CodeBlock的主方法");
}
}
运行结果:
JAVA_SE基础——35.static修饰成员函数的更多相关文章
- JAVA_SE基础——34.static修饰成员变量
需求:描述一下学校的学生. 特点:都是中国人.... 测试代码1: class Student{ String name; String country = "中国"; //国籍 ...
- 【c++基础】static修饰的函数作用与意义
static修饰的函数作用与意义 static修饰的函数叫做静态函数,静态函数有两种,根据其出现的地方来分类: 如果这个静态函数出现在类里,那么它是一个静态成员函数: 静态成员函数的作用在于:调用这个 ...
- .static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗。
static的作用: 对变量: 1.局部变量: 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量. 1)内存中的位置:静态存储区 2)初始化:局部的静态变量只能被初始化一次, ...
- C++基础-4-封装(构造函数与析构函数,深拷贝与浅拷贝,静态成员,this,友元,const修饰成员函数)
4. 封装 4.1.1 封装的意义 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 con ...
- C++ static类成员,static类成员函数
转载:ZJE_ANDY static修饰类中成员,表示类的共享数据 1.static类成员 C++primer里面说过,static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处 ...
- C++之static类成员,static类成员函数
0.static修饰类中成员,表示类的共享数据 1.static类成员 在C++primer里面说过,static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处在.static类 ...
- 转载----c++ static修饰的函数作用与意义
static修饰的函数叫做静态函数,静态函数有两种,根据其出现的地方来分类: 如果这个静态函数出现在类里,那么它是一个静态成员函数: 静态成员函数的作用在于:调用这个函数不会访问或者修改任何对象(非s ...
- const 修饰成员函数 前后用法(effective c++ 03)
目录 const在函数后面 const修饰成员函数的两个作用 const在函数前面 总结 const在函数后面 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态 ...
- JAVA_SE基础——42.final修饰符
高手勿喷~ final关键字可用于修饰类.变量和方法,它有"这是无法改变的"或者"最终"的含义,因此被final修饰的类.变量和方法将具有以下特征: 1.fin ...
随机推荐
- java支付宝开发-01-沙箱环境接入
一.沙箱环境说明 (1)蚂蚁沙箱环境(Beta)是协助开发者进行接口功能开发及主要功能联调的辅助环境.沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑(当前沙箱支持产品请参考“沙箱支持产品列表”). ...
- tp5.带标签的缓存 创建和清除 测试
原文:http://www.upwqy.com/details/24.html 测试设置了标签的缓存的获取方式 和清除标签缓存. 有时候我们可能会对同类型的一些数据做统一缓存.和统一清除更新处理. 那 ...
- win7上Android环境搭建以及调试
工欲善其事必先利其器,好记性不如烂笔头.要学习一门新的语言,首先必须得先搭环境,否则没法实践.如果之前按照网上的提示,搭建过环境,而且环境比较复杂的话,我相信隔很长一段时间后,就会忘记,到真正用的时候 ...
- wpf研究之道-ProgressBar(进度条)控件
ProgressBar控件,非常有用.它在什么情况下有用呢?如何使用?带着这两个问题,我们探讨下. 如果程序需要很长时间来运行,用户在不知道的情况下,以为程序已经"卡死"了,没有响 ...
- vue.js 配置移动端的url Scheme和iOS端配置url Scheme
假如urlScheme:baibai:// 一.vue.js端的配置: 1.通过html标签跳转: <p href="baibai://"></p> 2.通 ...
- PHP实现发送模板消息到微信公众号
简述:在这里会具体讲述到如何实现:如何通过后台的代码来实现发送模板消息到已经关注了"心想"公众号的用户. (本人新手,目前实习中,我的所有文档都是在自己开发过程中的记录,有些言语跟 ...
- python爬微信公众号前10篇历史文章(4)-正则表达式RegularExpressionPattern
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. Pytho ...
- 可能是最好的SQL入门教程
个人博客:这可能是最好的SQL入门教程
- python 一篇就能理解函数基础
一,函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过 ...
- Vue之八 HTML5 History模式
nginx配置 location / { root /webroot/www/ShopMall3; try_files $uri $uri/ /index.html; } /:访问路径: root:服 ...