面向对象(static关键字)
static关键字:用于修饰成员(成员变量和成员函数)
被修饰后的成员具备以下特点:
随着类的加载而加载
优先于对象存在
被所有的对象共享
可以直接被类名调用
使用注意:
静态方法只能访问静态成员
静态方法中不可以写this,super关键字
主函数是静态的
static关键:
1、被static修饰的成员变量,被所有的对象所共享
2、静态随着类的加载而加载,随着类的消失而消失
3、优先于对象的存在
4、静态成员可以直接被类名所调用
static的使用注意事项:
1、静态方法只能调用静态成员,不能调用非静态成员,非静态方法可以调用静态成员也可以调用非静态成员
2、在静态方法中不允许出现this super关键字,this代表对象,而静态方法执行时还没有对象呢
3.主函数是静态的
4、静态是有访问局限性的,只能访问静态的内容
静态成员变量和非静态成员变量的区别:
1、非静态成员变量又称为实例变量,静态成员变量又称为类变量
2、非静态成员变量随着对象的创建而创建,随着对象的消失而消失,静态成员变量随着类的加载而存在,随着类的消失而消失
3、非静态变量存在于对象堆内存中,静态成员变量存在于方法区中
4、非静态变量只能被对象所调用,而静态变量可以被类名调用也可以被对象调用。
静态什么时候用:
1、成员变量是否需要static修饰呢?该成员变量的值如果每一个对象都相同的话就用static来修 饰,如果不是的话就不用static来修饰了,让这些不相同的存储到每个对象中。
2、成员函数是否需要被静态修饰呢?
当函数中访问到了对象中的特有属性时,该函数不能被静态修饰,如果函数中没有访问到对象的特有属性,就可以被静态修饰。如果方法没有访问过特有属性那么可以直接被静态化。简单的说,如果函数中访问了成员变量(实例变量),不能静态,否则可以静态,直接被类名所调用。如果一个类中定义的方法都是静态的,说明这个类是不需要对象的。
静态代码块:
随着类的加载而执行,而且只执行一次
优先于主函数执行
package com_package2; public class StaticCode
{
private String name;
private static String country;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static String getCountry() {
return country;
}
public static void setCountry(String country) {
StaticCode.country = country;
}
public void show()
{
System.out.println("name="+name);
System.out.println("country="+country); } }
package com_package2;
public class StaticCodeDemo {
public static void main(String[]args)
{
StaticCode p = new StaticCode();
p.setName("hejinjin");
p.setCountry("cn");
//StaticCode p1 = new StaticCode();
//p1.setCountry(country)
p.show();
}
}
package com_package2; public class StaticCode
{
private String name;
private static String country="cn";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static String getCountry() {
return country;
}
public static void setCountry(String country) {
StaticCode.country = country;
}
public void show()
{
System.out.println("name="+name);
System.out.println("country="+country); } }
package com_package2;
public class StaticCodeDemo {
public static void main(String[]args)
{
//StaticCode p = new StaticCode();
//p.setName("hejinjin");
//p.setCountry("cn");
//StaticCode p1 = new StaticCode();
//p1.setCountry(country)
//p.show();
System.out.println(StaticCode.getCountry());没有创建对象就可以调用静态的对象,由此可以看出,静态成员变量随着类的加载而存在。
}
}
package com_package2; public class StaticCode
{
private String name;
private static String country="cn";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static String getCountry() {
return country;
}
public static void setCountry(String country) {
StaticCode.country = country;
}
public static void show()
{
System.out.println("name="+name);//这样是不对的因为静态方法无法访问非静态变量
System.out.println("country="+country); } }
package com_package2; public class StaticCode
{
private String name="kakaka";
private static String country="cn";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static String getCountry() {
return country;
}
public static void setCountry(String country) {
StaticCode.country = country;
}
public void show()
{
System.out.println("name="+name);
System.out.println("country="+country); }
public static void function()
{ System.out.println("kokokookokok");
}
public static void guojia()
{
System.out.println("country"+country); } }
package com_package2;
public class StaticCodeDemo {
public static void main(String[]args)
{
//StaticCode p = new StaticCode();
//p.setName("hejinjin");
//p.setCountry("cn");
//StaticCode p1 = new StaticCode();
//p1.setCountry(country)
//p.show();
System.out.println(StaticCode.getCountry());
speak();
}
public static void speak()
{
StaticCode p = new StaticCode();
p.setName("hejinjinhaha");
System.out.println(p.getName());
StaticCode.function();//这两个方法没有访问到静态成员变量,所以直接静态化
StaticCode.guojia();//这两个方法没有访问到静态成员变量,所以直接静态化
}
}
静态代码块
package com_package2; public class StaticCode
{
static
{
System.out.println("A"); }
public void show()
{
System.out.println("run"); }
}
package com_package2;
public class StaticCodeDemo {
static
{
System.out.println("B");
}
public static void main(String[]args)
{
StaticCode p = new StaticCode();
p.show();
}
static
{
System.out.println("C");
}
}
B
C
A
run
注意执行顺序,先从带主函数的类进入,由于静态代码块随着类的创建而创建,所以优先于主函数执行,然后再执行主函数,在执行主函数的时候用到了StaticCode类,StaticCode类中也有静态代码块,而这个静态代码块也是随着类的建立而存在,所以比show()要执行的早。
静态代码块的特点就是:随着类的加载而执行并且只执行一次,优先于主函数执行
面向对象(static关键字)的更多相关文章
- Java面向对象-static关键字、静态方法与普通方法、静态成员变量
Java面向对象-static关键字.静态方法与普通方法 static关键字的基本作用:方便在没有创建对象的情况下来进行调用(方法/变量). 很显然,被static关键字修饰的方法或者变量不需要依赖于 ...
- 面向对象-static关键字实战案例
面向对象-static关键字实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.static关键字概述 1>.static的功能 static关键字用于修饰成员变量和 ...
- Java基础语法 - 面向对象 - static 关键字
使用static关键字修饰的变量.常量和方法分别被称作静态变量.静态常量和静态方法,也被称作类的静态成员 静态变量 使用static修饰过的类变量称为静态变量 该变量需要使用类名.变量名进行调用,不能 ...
- PHP面向对象static关键字
1.静态属性用于保存类的公有数据 2.静态方法里面只能访问静态属性 3.静态成员不需要实例化就可以访问 4.类的内部可以通过self或者static关键字访问自身的静态成员 5.可以通过parent关 ...
- Java面向对象--static关键字
- 2017.10.23 Java 面向对象深入学习---final 关键字、static关键字、匿名对象等
今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 第一节课 01(面向对象)final关键字概念.avi 02: ...
- Java第7次作业:造人类(用private封装,用static关键字自己造重载输出方法)什么是面向对象程序设计?什么是类和对象?什么是无参有参构造方法 ?什么是封装?
什么是面向对象程序设计? 我们称为OOP(Object Oriented Programming) 就是非结构化的程序设计 要使用类和对象的方法来进行编程 什么是类,什么是对象 类就是封装了属性和 ...
- 面向对象编程(二)封装--构造方法,this关键字,static关键字,方法重载
面向对象三大特点:封装.继承.多态 封装概念 ① 将东西包装在一起,然后以新的完整形式呈现出来: 将方法和字段一起包装到一个单元中,单元以类的形式实现; ② 信息隐藏,隐藏对象的实现细节,不让 ...
- Java学习笔记之面向对象、static关键字
一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...
- 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)
094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
随机推荐
- 【Selenium+Python Webdriver】报错之:TypeError: user_login() missing 1 required positional argument: 'self'
先贴一下源码: base.py文件如下: from selenium import webdriver class Page(object): ''' 页面基础类,用于所有页面的继承 ''' rb_u ...
- Notepad工具使用小技巧
工欲善其事必先利其器 Notepad++是个很不错的文本编辑工具,掌握它的使用技巧可以提高我们工作的效率.见如下: 比较常用的罗列如下:(如果有更好的建议可以留言哈) 1: 添加书签 CTRL+F2 ...
- sql查询的日期判断问题
在SQLSERVE中,如果某个数据表的类型被定义成datetime类型,那么数据是包含秒的.这时候如何查询某天的数据呢?新手们可能想:最直接的做法是把时间部分去掉,只取日期部分.于是日期的函数就用上了 ...
- SAP-财务知识点
[转自 http://blog.itpub.net/195776/viewspace-1023912/] SAP FI/CO Reading RepositorySAP财务成本知识库 目 录前言.一. ...
- CUDA: 原子操作
1.1以上计算功能集支持全局内存上的原子操作, 1.2以上支持共享内存上的原子操作. atomicAdd(add,y)将生成一个原子的操作序列,这个操作序列包括读取地址addr处的值,将y增加到这个值 ...
- PAT 乙级 1081. 检查密码 (15) 【字符串】
题目链接 https://www.patest.cn/contests/pat-b-practise/1081 思路 有一个坑点 可能会输入空格 也就是说 要用 geline 或者 gets() 然后 ...
- A. Drazil and Date
这是codeforces#292 div2 的一道题,因为本人比较水,目前只能做div2了.问题简化版就是: 从 (0,0) 走到 (a, b) ,s 步能不能走完.每次能向上下左右走,且只能走一步. ...
- SQL语句性能优化操作
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应 ...
- Linux线程的几种结束方式
Linux创建线程使用 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) ...
- SDOI 2017 Day1
日期:2017-04-10 题解: 第一题: 题目大意:求fi(gcd(i,j))的乘积 i,j属于[1,1e6],数据组数1000组. 类别:套路题. 第二题:BZOJ原题. 题解:LCT套线段树 ...