static 是java中定义的一个关键字,主要是描述全局的概念,所以利用static关键字可以定义属性,定义方法
        但是在90%的情况下,我们的开发代码很少会去直接编写static
*/

/*    利用static定义属性
        现在假设定义一个只描述中国人的类,那么在这个类里面肯定要包含有姓名,年龄,国家,
        所以按照之前所学的概念来进行设计,就可以的出如下的结果:

class Person{
private String name:
private int age:
String country = "中华人民共和国": // 此属性暂时不封装
public Person(String name,int age){
this.name = name:
this.age = age:
}
public String getlnfo(){
return"姓名"+this.name+"年龄"+this.age+"国籍"+this.country:
}
}
public class staticKeyword{
public static void main(String args[]){
Person perA = new Person("小",10):
Person perB = new Person("中",20):
Person perC = new Person("大",30):
System.out.println(perA.getlnfo()):
System.out.println(perB.getlnfo()):
System.out.println(perC.getlnfo()):
}
}
/*
结果:
姓名;小,年龄;10,国籍;中华人民共和国
姓名;中,年龄;20,国籍;中华人民共和国
姓名;大,年龄;30,国籍;中华人民共和国
*/

但是对于以上的程序的内存关系中就会发现问题所在了
            如果说现在玩穿越了,中国退回到了唐朝,中国14亿人口,14亿对象,14亿对象修改一个属性

class Person{
private String name:
private int age:
String country = "中华人民共和国": // 此属性暂时不封装
public Person(String name,int age){
this.name = name:
this.age = age:
}
public String getlnfo(){
return"姓名"+this.name+"年龄"+this.age+"国籍"+this.country:
}
}
public class staticKeyword{
public static void main(String args[]){
Person perA = new Person("小",10):
Person perB = new Person("中",20):
Person perC = new Person("大",30):
perA.country = "唐朝":
System.out.println(perA.getlnfo()):
System.out.println(perB.getlnfo()):
System.out.println(perC.getlnfo()):
}
}
/*
结果:
姓名;小,年龄;10,国籍;唐朝
姓名;中,年龄;20,国籍;中华人民共和国
姓名;大,年龄;30,国籍;中华人民共和国
*/

这样的话对于整个代码的维护实在是太可怕,而造成这种问题的根源在于:
                类中的普通属性是每一个对象都独自拥有的,但是这样的设计明显不符合当前的环境,所以最好的做法是将国家的这个属性设置为公共属性
                所有的对象都可以共享此属性,如果要想实现这样的操作,就可以通过static 关键字来进行定义
            范例:使用static关键字定义

class Person{
private String name:
private int age:
static String country = "中华人民共和国": // 此属性暂时不封装
public Person(String name,int age){
this.name = name:
this.age = age:
}
public String getlnfo(){
return"姓名"+this.name+"年龄"+this.age+"国籍"+this.country:
}
}
public class staticKeyword{
public static void main(String args[]){
Person perA = new Person("小",10):
Person perB = new Person("中",20):
Person perC = new Person("大",30):
perA.country = "唐朝": // 修改了一个对象的属性
System.out.println(perA.getlnfo()):
System.out.println(perB.getlnfo()):
System.out.println(perC.getlnfo()):
}
}
/*
结果:
姓名;小,年龄;10,国籍;唐朝
姓名;中,年龄;20,国籍;唐朝
姓名;大,年龄;30,国籍;唐朝
*/

通过执行结果发现,修改了一个对象的属性之后,所有对象的属性都发生了改变
                所以这样的属性称为公共属性,公共属性必须通过static定义,而对于公共属性的内容保存不会在栈内存也不在堆内存
                而是会存在于全局数据区中,所有的方法保存在全局代码区之中
            
                但是现在出现了一个问题,既然static属于全局属性,那么由一个对象进行修改是否合适呢/
                现在通过一个对象改的:
                    perA.country = "唐朝": // 修改了一个对象的属性
                
                很明显这是不合适的,最好的做法是利用所有对象的一个最高的代表来操作,这个代表就是类
                所以对于static定义的属性可以由类名称直接进行调用,所以这样的属性也被称为类属性
                    Person.country = "唐朝": // 直接通过类调用
            
                此时的类中存在有static属性以及非static属性,但是在这里面需要注意:
                    所有的非static属性都是在对象实例化的时候才会进行内存的分配
                    所有的static属性可以在没有实例化对象产生的情况下直接使用
            范例:直接调用类属性

class Person{
private String name:
private int age:
static String country = "中华人民共和国": // 此属性暂时不封装
public Person(String name,int age){
this.name = name:
this.age = age:
}
public String getlnfo(){
return"姓名"+this.name+"年龄"+this.age+"国籍"+this.country:
}
}
public class staticKeyword{
public static void main(String args[]){
System.out.println(Person.country):
}
}
/*
结果:
中华人民共和国
*/

修改

class Person{
private String name:
private int age:
static String country = "中华人民共和国": // 此属性暂时不封装
public Person(String name,int age){
this.name = name:
this.age = age:
}
public String getlnfo(){
return"姓名"+this.name+"年龄"+this.age+"国籍"+this.country:
}
}
public class staticKeyword{
public static void main(String args[]){
System.out.println(Person.country):
Person.country = "北宋":
System.out.println(Person.country):
}
}
/*
结果:
中华人民共和国
北宋
*/

---

class Person{
private String name:
private int age:
static String country = "中华人民共和国": // 此属性暂时不封装
public Person(String name,int age){
this.name = name:
this.age = age:
}
public String getlnfo(){
return"姓名"+this.name+"年龄"+this.age+"国籍"+this.country:
}
}
public class staticKeyword{
public static void main(String args[]){
System.out.println(Person.country):
Person.country = "北宋":
System.out.println(Person.country):
System.out.println(new Person("小",10).getlnfo):
}
}
/*
结果:
中华人民共和国
北宋
姓名;小,年龄;10,国籍;北宋
*/

虽然static的属性定义在类之中,但是其是完全独立的,不受类实例化对象的控制
            在90%的情况下类的设计都会使用非static属性,只有在10%表示公共的属性,或者是与类实例化无关的属性定义时才会考虑使用static
                    
*/

/*    static 定义方法
        利用static定义的属性可以直接通过类名称进行访问,但是static也可以用于方法的定义上,同样,这个方法可以由类名称直接进行调用
        范例:定义static方法

class Person{
private String name:
private int age:
private static String country = "中华人民共和国":
public Person(String name,int age){
this.name = name:
this.age = age:
}
public static void setCountry(String c){
country = c:
}
public static String getCountry(){
return country:
}
public String getlnfo(){
return"姓名"+this.name+"年龄"+this.age+"国籍"+this.country:
}
}
public class staticKeyword{
public static void main(String args[]){
// 此时没有实例化对象产生
System.out.println(Person.getCountry()): }
}
/*结果:
中华人民共和国 */

...

class Person{
private String name:
private int age:
private static String country = "中华人民共和国":
public Person(String name,int age){
this.name = name:
this.age = age:
}
public static void setCountry(String c){
country = c:
}
public static String getCountry(){
return country:
}
public String getlnfo(){
return"姓名"+this.name+"年龄"+this.age+"国籍"+this.country:
}
}
public class staticKeyword{
public static void main(String args[]){
// 此时没有实例化对象产生
System.out.println(Person.getCountry()):
Person.setCountry("清朝"):
System.out.println(Person.getCountry()):
System.out.println(new Person("少爷",21).getlnfo()):
}
}
/*
结果:
中华人民共和国
清朝
姓名:少爷。年龄:21,国籍:清朝
*/

static的方法依然不受到实例化对象的控制,所以可以由类名称直接调用
            但是此时类中的方法就存在有两种了:static方法,非static方法那么这两种方法之间互相访问就出现问题了
                所有的非static方法可以直接调用非static方法或static属性

static 方法只允许调用static方法和static属性
                非static方法允许调用 static 和非 static 定义
                static 方法不允许调用非 static 操作以及 this
                    static 定义必须产生实例化对象后才会分配内存空间并且调用,而 static 可以在没有实例化对象的时候进行调用
                    所以在 static 方法之中不存在有this当前对象概念

class Person{
private String name:
private int age:
private static String country = "中华人民共和国":
public Person(String name,int age){
this.name = name:
this.age = age:
}
public static void setCountry(String c){
country = c:
}
public static String getCountry(){
return country:
}
public String getlnfo(){
System.out.println(this.getCountry()):
return"姓名"+this.name+"年龄"+this.age+"国籍"+this.country:
}
}
public class staticKeyword{
public static void main(String args[]){ System.out.println(new Person("少爷",21).getlnfo()):
}
}
/*结果:
姓名:少爷。年龄:21,国籍:清朝 */

static 方法不能够直接调用非static方法或者是非static属性

class Person{
private String name:
private int age:
private static String country = "中华人民共和国":
public Person(String name,int age){
this.name = name:
this.age = age:
}
public static void setCountry(String c){// 为什么不是country:因为你在调用static方法时可能还没有实例化对象 所以是 c 也没有加 this
country = c:
}
public static String getCountry(){
getlnfo():
return country:
}
public String getlnfo(){
System.out.println(this.getCountry()):
return"姓名"+this.name+"年龄"+this.age+"国籍"+this.country:
}
}
public class staticKeyword{
public static void main(String args[]){ System.out.println(new Person("少爷",21).getlnfo()):
}
}
//结果:(出错)

分析?为什么会存在有这样的定义?
                所有的static属性或方法可以在类没有实例化对象的时候进行直接使用
                所有非static属性或方法必须在类产生实例化对象之后才可以进行调用
            
            那么什么时候使用static方法呢?
                类设计的过程之中90%的方法都使用非static方法定义
                如果一个类中没有任何的属性,那么这个类不需要定义普通方法,只需要定义static方法
            范例:对比一下两种代码
                1.

class Ssd{
public int add(int x,int y){
return x + y:
}
}
public class staticKeyword{
public static void main(String args[]){ System.out.println(new Ssd().add(10,20)):
}
}

2.

class Ssd{
public static int add(int x,int y){
return x + y:
}
}
public class staticKeyword{
public static void main(String args[]){ System.out.println(Ssd.add(10,20)):
}
} //结果:30

因为此时Ssd 类没有属性,没有属性就不需要使用到堆内存。
                而如果现在使用了第一种方式,那么会开辟一块无用的堆内存空间
                所以这个时候很明显,第二种方式更加合理

*/

/*    观察主方法
        在最早讲解方法定义的时候实际上给出了两种方案
            第一种:某一个方法定义在主类中,并且由主方法直接调用,定义格式:
                public static 返回值类型 方法名称(){}
            第二种:某一个方法定义在了类中,并且由实例化对象进行调用,定义格式:
                public 返回值类型 方法名称(){}
            
        那么现在来做一个简单分析

public class staticKeyword{
public static void main(String args[]){
println():
}
public static void println(){
System.out.println("*****Hello Werld****"):
}
}
/*
结果
*****Hello Werld****
*/

如果没有加 static呢?   那就会出错
            但是反过来,这个时候只能够通过产生本类实例化对象的方式来进行调用

public class staticKeyword{
public static void main(String args[]){
new staticKeyword().println(): // 对象。方法()
}
public void println(){ // 非static方法
System.out.println("*****Hello Werld****"):
}
}

在以后所编写的代码过程之中,主类中不会编写什么方法,大部分的方法都会封装在类之中,通过产生对象调用
        
        java 中的主方法可以说是历史之最长的
            public:是一种访问权限,表示所有的操作者都可以看见
            static:执行一个类的时候输入:“java 类名称”,表示由类直接调用
            void:主方法是一切的起点,开始了就继续把
            main:是一个系统定义好的方法名称
            Stirng args[]:程序执行时的输入参数,初始化参数的
        范例:取得初始化输入参数

public class staticKeyword{
public static void main(String args[]){
for(int x = 0:x<args.length:x++){
System.out.println(args[x]):
}
}
}

如果要输入参数,则在解释java 程序时,类后面利用空格设置,每个参数间使用空格区分

执行程序设置参数:java 类名称 内容         例如:Java TestDemo hello world
            如果参数本身就有空格则要使用““”声明:Java TestDemo ”hello world“

*/

/*    static应用
        static在一些系统类库上会大量的出现,那么这些就有可能是static方法所导致的
        这次重点来看static属性。static属性有一个最好的特点在于:公共属性,所有对象都可以对其进行修改
        范例:实现一个对象的个数统计
            所有的新的实例化对象产生式都一定要调用构造方法,所以可以在构造方法里面增加一个统计

class Perdon{
private static int count = 1: // 统计个数
public Peron(){
System.out.println("对象个数:"+count++):
}
}
public class staticKeyword{
public static void main(String args[]){ //
new Person():
new Person():
new Person():
new Person():
new Person():
new Person():
}
}
}
/*
结果:
对象个数:1
对象个数:2
对象个数:3
对象个数:4
对象个数:5
对象个数:6
*/

实际上可以将以上的程序进一步的修改,现在假设Person类中存在有一个name的属性,那么在Person类提供有一个构造方法:
        一个是负责接收 name 属性内容的,一个是无参的但是要求不管使用那种构造方法都应该为name属性设置一个名字,而不是nuill
        范例:为属性自动命名

class Perdon{
private static int count = 1: // 统计个数
private String name:
public Peron(){
this("无名氏-"+count++):
}
public Person(String name){
this.name = name:
}
public String getName(){
return this.name:
}
}
public class staticKeyword{
public static void main(String args[]){ //
System.out.println(new Person().getName()):
System.out.println(new Person().getName()):
System.out.println(new Person("ssd").getName()):
}
}
}
/*
结果:
无名氏-1
无名氏-2
ssd 3
*/

这样的操作在以后的高级部分会见到其应用

        在类的首要设计过程中不要去考虑static属性或者方法
        使用static方法大部分情况下有两种可能性
            可以不受到类实例化的对象控制
            类中就没有提供有普通属性

*/

菜鸡的Java笔记 第十七 static 关键字的更多相关文章

  1. 菜鸡的Java笔记 第二十七 - java 链表基本概念

    链表基本概念        1.链表的基本形式        2.单向链表的完整实现            认识链表        链表= 可变长的对象数组,属于动态对象数组的范畴        链表 ...

  2. 菜鸡的Java笔记 第二十一 final 关键字

    使用final定义类,属性,方法            final在一些书中被称为终结器,意思是:利用final定义的类不能够有子类,利用final定义的方法不能够被覆写,利用final定义的变量就成 ...

  3. 菜鸡的Java笔记第二 - java 数据类型

    1.程序的本质实际上就是在于数据的处理上. JAVA中的数据类型有两类 基本数据类型:是进行内容的操作而不是内存的操作 数值型: 整型:byte(-128 ~ 127),short(-32768 ~ ...

  4. 菜鸡的Java笔记 第二十二 - java 对象多态性

    本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的,        而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...

  5. 菜鸡的Java笔记 第十八 - java 代码块

    代码块  code block                content (内容)        在程序结构之中使用"{}"定义的内容就称为代码块,但是会根据其声明的位置以及关 ...

  6. 菜鸡的Java笔记 第三十七 - java 线程与进程

    线程与进程        线程与进程的区别                最早的的时候DOS 系统有一个特点:只要电脑有病毒,那么电脑就死机了,是因为传统的DOS 系统属于单进程的操作系统       ...

  7. 菜鸡的Java笔记 - java 断言

    断言:assert (了解)        所谓的断言指的是在程序编写的过程之中,确定代码执行到某行之后数据一定是某个期待的内容        范例:观察断言 public class Abnorma ...

  8. 菜鸡的Java笔记 - java 正则表达式

    正则表达式 RegularExpression        了解正则表达式的好处        正则表达式的基础语法        正则表达式的具体操作            content (内容 ...

  9. 菜鸡的Java笔记 数字操作类

    数字操作类        Math 类的使用        Random 类的使用        BigInteger 和 BigDecimal 类的使用                Math 是一 ...

随机推荐

  1. CSS 奇技淫巧 | 妙用 drop-shadow 实现线条光影效果

    本文将介绍一种利用 CSS 滤镜 filter 的 drop-shadow(),实现对 HTML 元素及 SVG 元素的部分添加阴影效果,以实现一种酷炫的光影效果,用于各种不同的场景之中.通过本文,你 ...

  2. 关于国密HTTPS 的那些事(二)

    关于国密HTTPS 的那些事(二) 三. 需要解决的问题 前文我们了解了https,并梳理了国密https的流程.那么完成这些流程的目的是什么呢?又是怎么来保护数据的安全性呢?我们继续... 上文我们 ...

  3. 如何基于Jupyter notebook搭建Spark集群开发环境

    摘要:本文介绍如何基于Jupyter notebook搭建Spark集群开发环境. 本文分享自华为云社区<基于Jupyter Notebook 搭建Spark集群开发环境>,作者:apr鹏 ...

  4. logstash输出到rabbitmq

    场景 将应用日志文件发送到rabbitmq. filebeat 不支持rabbitmq作为输出.因此,需要先将文件由filebeat发送到logstash ,再由logstash 输出到rabbitm ...

  5. Shell 编程 基础用法

    Shell 编程 更改shell脚本权限 chmod u+x shell.sh 标准头部写法 #! /bin/bash #! /bin/dash 变量使用 a=10 print $a 读取命令行参数 ...

  6. 【UE4 C++】关卡切换、流关卡加载卸载

    切换关卡 基于 UGameplayStatics:: OenLevel UGameplayStatics::OpenLevel(GetWorld(), TEXT("NewMap") ...

  7. Google Object detection配置与使用

    Google Object detection 前言: 本文记录了使用Google发布的Object detection(July 1st, 2019)接口,完成了对标注目标的检测.参考了很多博文,在 ...

  8. 6月2日 Scrum Meeting

    日期:2021年6月2日 会议主要内容概述: 取消账单类别自定义 图表属性分析取消函数输入 增加新的主题模板 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇 ...

  9. WebGL着色器渲染小游戏实战

    项目起因 经过对 GLSL 的了解,以及 shadertoy 上各种项目的洗礼,现在开发简单交互图形应该不是一个怎么困难的问题了.下面开始来对一些已有业务逻辑的项目做GLSL渲染器替换开发. 起因是看 ...

  10. Noip模拟37 2021.8.12

    T1 数列 真是考场上不是数学的乱推柿子,想定理,是数学的没想出来.. 比较悲伤... 列柿子不用动脑子,就是没有想出来$EXgcd$解不定方程,淦.. 解处一组解后利用比较显然的性质: $x+\fr ...