面向对象:9、static关键字
static关键字
- 一、static修饰变量
- 二、static修饰方法
- 三、代码块
一、static修饰变量
1.static:静态的
2.static可以用来修饰:属性、方法、代码块、内部类
在类中,使用static修饰的成员变量,就是静态变量,反之为非静态变量。
静态变量和非静态变量的区别
静态变量(类变量):我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
实例变量(非静态变量):我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
静态变量属于类的,"可以"使用类名来访问,非静态变量是属于对象的,"必须"使用对象来访问
因为在加载类的过程中为静态变量分配内存,实例变量在创建对象时分配内存,所以静态变量可以使用类名来直接访问,而不需要使用对象来访问
public class Student{private static int age;private double score;public static void main(String[] args) {Student s = new Student();//推荐使用类名访问静态成员System.out.println(Student.age);System.out.println(s.age);System.out.println(s.score);}
}
其他说明
- 静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用
- 静态变量的加载要早于对象的创建
- 由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中
类变量 | 实例变量 | |
---|---|---|
类 | √ | × |
对象 | √ | √ |
- 静态属性举例:
System.out; Math.PI
二、static修饰方法
在类中,使用static修饰的成员方法,就是静态方法,反之为非静态方法
静态方法和非静态方法的区别
静态方法是属于类的,"可以"使用类名来调用,非静态方法是属于对象的,"必须"使用对象来调用.
静态方法"不可以"直接访问类中的非静态变量和非静态方法,但是"可以"直接访问类中的静态变量和静态方法
注意:
- this和super在类中属于非静态的变量.(静态方法中不能使用)
- 关于静态属性和静态方法的使用,都从生命周期的角度去理解
public class Student{private static int count;private int num;public void run(){}public static void go(){}public static void test(){//编译通过System.out.println(count);go();//编译报错System.out.println(num);run();}
}
非静态方法"可以"直接访问类中的非静态变量和非静态方法,也"可以"直接访问类中的静态变量和静态方法
public class Student{private static int count;private int num;public void run(){}public static void go(){}public void test(){//编译通过System.out.println(count);go();//编译通过System.out.println(num);run();}
}
静态方法 | 非静态方法 | |
---|---|---|
类 | √ | × |
对象 | √ | √ |
main方法
- main()方法作为程序的入口
- main()方法也是一个普通的静态方法
- main()方法可以作为我们与控制台交互的方式。(之前:使用Scanner)
三、代码块
1、什么是代码块
public class Person {{//代码块(匿名代码块)}static{//静态代码块}
}
代码块类似于方法体,内部可以有很多方法中有的东西
2、代码块的作用:用来初始化类、对象
3、代码块如果有修饰的话,只能使用static
4、分类:静态代码块 vs 非静态代码块
静态代码块
内部可以有输出语句
随着类的加载而执行,而且只执行一次
作用:初始化类的信息
如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
静态代码块的执行要优先于非静态代码块的执行
静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构
非静态代码块
- 内部可以有输出语句
- 随着对象的创建而执行
- 每创建一个对象,就执行一次非静态代码块
- 作用:可以在创建对象时,对对象的属性等进行初始化
- 如果一个类中定义了多个非静态代码块,需要按照声明的先后顺序执行
- 非静态代码块内可以调用静态的属性、静态的方法,或非静态的属性、非静态的方法
5、代码示例
package com.hsy.staticTest.block;public class BlockTest {public static void main(String[] args) {String desc = Person.desc;System.out.println(desc);Person p1 = new Person();Person p2 = new Person();System.out.println(p1.age);Person.info();}
}class Person{//属性String name;int age;static String desc = "我是一个人";//构造器public Person(){}public Person(String name,int age){this.name = name;this.age = age;}//非static的代码块{System.out.println("hello, block - 2");}{System.out.println("hello, block - 1");//调用非静态结构age = 1;eat();//调用静态结构desc = "我是一个爱学习的人1";info();}//static的代码块static{System.out.println("hello,static block-2");}static{System.out.println("hello,static block-1");//调用静态结构desc = "我是一个爱学习的人";info();//不可以调用非静态结构
// eat();
// name = "Tom";}//方法public void eat(){System.out.println("吃饭");}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}public static void info(){System.out.println("我是一个快乐的人!");}}
6、小练习
package com.hsy.staticTest;
//总结:由父及子,静态先行
class Root{static{System.out.println("Root的静态初始化块");}{System.out.println("Root的普通初始化块");}public Root(){super();System.out.println("Root的无参数的构造器");}
}
class Mid extends Root{static{System.out.println("Mid的静态初始化块");}{System.out.println("Mid的普通初始化块");}public Mid(){super();System.out.println("Mid的无参数的构造器");}public Mid(String msg){//通过this调用同一类中重载的构造器this();System.out.println("Mid的带参数构造器,其参数值:"+ msg);}
}
class Leaf extends Mid{static{System.out.println("Leaf的静态初始化块");}{System.out.println("Leaf的普通初始化块");} public Leaf(){//通过super调用父类中有一个字符串参数的构造器super("hsy");System.out.println("Leaf的构造器");}
}
public class LeafTest{public static void main(String[] args){new Leaf(); System.out.println();new Leaf();}
}
面向对象:9、static关键字相关推荐
- 【职坐标】java面向对象前言——static关键字
Java面向对象前言 -- static关键字详解 一. Static关键字的概念 static为"全局"或者"静态"的意思,用来修饰成员变量(类的属 ...
- 面向对象基础——static关键字和代码块的使用
具体内容 在Java中可以使用static声明属性和方法,因为之前多部分属性和方法都属于非static的,这样一来,每个对象都占有自己的内容,如果现在希望一个属性被所有的对象所共同拥有,则可以将其声 ...
- 《java入门第一季》之面向对象(static关键字)
/*static的特点:(它可以修饰成员变量,还可以修饰成员方法)A:随着类的加载而加载回想main方法.B:优先于对象存在C:被类的所有对象共享举例:班级的学生应该共用同一个班级编号.其实这个特点也 ...
- 面向对象(static关键字)
static作用: A:可以修饰成员变量和成员方法 static的特点: A:被类的所有对象共享(针对多个对象有共同的这样的成员变量值的时候,) B:静态修饰的内容一般我们称其为:与类相关的,类成员 ...
- Java入门姿势【面向对象4】 static关键字
上次我为大家写出啦"构造方法及其重载_方法的调用",上篇文章代码可能较多,如没有了解透彻的话请打开下方文章在进行观看一下哦!! [Java入门姿势[面向对象3]构造方法及其重载_方 ...
- C++中的static关键字的总结
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...
- C++中static关键字用法
原文参考:https://zhuanlan.zhihu.com/p/347930016 1.面向过程设计中的static 1.1静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一 ...
- C 中的static关键字
C++中的static关键字 分类: 面试珠玑 2012-04-22 22:06 22416人阅读 评论(25) 收藏 举报 c++存储c C++的static有两种用法:面向过程程序设计中的stat ...
- C++ static关键字详解
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.面向过程程序设计中的static应用于普通变量和函数,不涉及类:面向对象程序设计中的static主要 ...
- [面试] C++中的static关键字 (static 上镜率非常高!)
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 一.面向过程设计中的st ...
最新文章
- sql 分号变成多行_SQL(2)
- R语言ggplot2可视化配置图例(legend)标签色彩的升序或者反序(reverse)实战:ggplot2可视化默认图例标签色彩(升序,颜色越来越深)、可视化配置图例标签颜色反序(颜色越来越浅)
- 广域网一般采用什么网络拓扑结构?—Vecloud
- Makefile 自动产生依赖
- 五行代码快速使用python的turtle库绘画
- 《TCP/IP具体解释》读书笔记(18章)-TCP连接的建立与中止
- 拆半查找的递归和非递归算法
- 基于.NET平台的分层架构实战(二)——需求分析与数据库设计
- react native (一)
- java多线程总结(二)
- matlab 滤波器设计 coe_一种半带滤波器的低功耗实现方法
- Java中的关键字@Override解释
- python数据挖掘课程】十七.社交网络Networkx库分析人物关系(初识篇)
- Centos7查看网络配置
- AWS 开战 MongoDB!
- 30. 最小的K个数(C++版本)
- 计算机在线考试报名系统软件,全国计算机软考报名官网
- 【比特率和波特率】bit rate VS baud rate
- SDOI 2018 R2 游记
- 计算机组成原理下列数中最小的数位,计算机组成原理试题(四)
热门文章
- 言简意赅python系列---if not x: 和 if x is not None: 和 if not x is None: 的区别
- Linux信号量(1)-SYSTEM V
- 日语美文欣赏【珍爱自己】
- Pvcreate 创建物理卷
- 线上服务CPU100%问题快速定位实战(58沈剑)
- 基于Java的青年公寓租赁系统(毕设)
- java double 转 byte数组_Java基本类型与byte数组的转换
- Flink与Kafka的爱恨情仇
- MDT 2013 从入门到精通之Task部署任务创建
- ubuntu 18.04 搭建python selenium 环境