String类:【重点】
    String类的概述
        概述:
            java.lang.String类代表字符串,java程序中所有的字符串文字,如“abc”都可以看作是String类的实例.
            程序当中的所有双引号字符串,都是String类的对象.(没有new,也是对象).
        字符串的特点:
            字符串的内容永远不可改变【重点】
            正是因为字符串的内容永远不可改变,所以字符串是可以共享使用的.
            字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组.
            //第二点
                String str1 = "abc";
                String str2 = "abc";
                内存当中“abc”,"abc"对象会被创建出来,而且“abc”对象只会被创建一次,内存当中只有一个“abc”对象被创建
                此时str1和str2可以共享同一个“abc”对象
                String str3 = new String("abc");
                String str4 = new String("abc");
            备注:JDK1.7之后的JVM 将【运行】时常量池从方法区区移除了,在 java堆(heap)中开辟空间用来存储运行时常量池
                  JDK1.8开始,取消了Java方法区(method area),取而代之的是一种元空间(metaspace)
                  JDK1.8中字符串常量池和运行时常量池逻辑上属于方法区,实际上存储在堆内存中.

        创建String字符串的常见3+1种方式
            三种构造方法
                public String();创建一个空白的字符串,不包含任何内容.
                public Stirng(Char[] array);根据字符数组的内容,来创建对应的字符串.
                public Stirng(byte[] array);根据字节数组内容,来创建对应的字符串.
            一种直接创建
                String str = "abc";//右边直接用双引号
            备注:直接写上双引号,系统也会认定为字符串对象.

        【1.对于引用数据类型来说 == 进行的是地址值】
        【2.对于基本数据类型来说,比较是数值内容】
        【3.双引号直接写在字符串在常量池当中,new的不在池当中】

        常用方法:【重点】
            判断功能方法
                public boolean equals(Object anObject);将此字符串与指定对象进行比较,(参数可以是任意值)
                    当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
                    不但判断地址值,还进行内容判断,只要符合其中一个就返回true;
                建议:如果比较双方是一个常量一个变量,推荐把常量字符串放在前面,把变量放在后面
                如:"Hello".equals(str1)不建议写成:"str1".equals(Hello):防止空指针异常
                public boolean equalsIgnoreCase(String anObject);将此字符串与指定的对象进行比较,不考虑大小写

            获取功能
                public int length();返回字符串的长度
                public String concat(String str);将指定的字符串连接到该字符串的末尾
                public char charAt(int index);返回指定索引处的char值 索引起始值为0
                public int indexOf(String str);返回指定的子字符串第一次出现在该字符串内的索引值"连续的"(返回-1就是没有)
                public String substring(int beginIndex);返回一个子字符串,从beginIndex开始截取该字符串的末尾
                    新的字符串 World是新的字符串对象
                public String substring(int beginIndex,int endIndex);返回一个子字符串,从beginIndex区间截取该字符串
                    包含beginIndex索引值,不包含endIndex索引值---》[beginIndex,int endIndex)

            转换功能:
                public char[] toCharArray();将此字符串转换成新的字符数组
                public byte[] getBytes();适用平台默认的字符集将该字符串编码转换成新的字节数组.
                public String replace(CharSequence oldString,CharSequence newString);
                    将所有出现的老的字符串替换成新的字符串,返回是替换之后新的字符串
                    CharSequence意思就是可以接收字符串类型
                    备注:CharSequence是一个接口,也是一种引用数据类型,意思是可以接收字符串参数数据类型

    static关键字
        概述
            static关键字的使用,可以修饰成员变量和成员方法,被修饰的成员是【属于类】的,不单单是属于某个对象的
            也就是,既然是属于类的,那就不需要通过创建对象来调用类中的成员信息

        定义和使用格式
            类变量
                当成员变量被static修饰,该变量就成为【类变量】.该类的每个对象都可以【共享】同一个类变量的值.
                    任何对象都可以更改类变量的值.类变量也可以不通过创建类对象的方式进行操作.通过类也可以进行操作.
                    //类变量不再属于对象自己,而是属于所在类,多个对象共享同一份数据
            定义格式:
                static 数据类型 变量名;
                如:
                    static int roomID;

            静态方法
                当成员方法一旦被static关键字修饰时,该方法称为【类方法】,
                    类方法一般是通过类名.直接调用,而不需要单独创建对象来调用,调用方式很简单.习惯性称为【静态方法】
            定义格式
                修饰符 static 返回值类型 方法名(参数列表){
                    //方法体内容
                }
                如:
                    public static String arrayToString(int[] arr){
                        //方法体内容就是如何转换
                        //...
                        //必须有返回语句 return 返回值;
                    }
            静态方法调用的注意事项
                1.静态方法可以直接访问类变量和静态方法
                2.静态方法【不能直接访问普通的成员变量和成员方法】,反之成员方法可以【直接访问】类变量和静态方法
                3.静态方法中不能使用this关键字
            调用格式
                静态方法建议通过类来调用,但也可以通过对象来调用,会出现警告信息,不建议使用对象来调用

                格式:
                    //访问类变量
                    类名.类变量名;
                    //访问静态方法
                    类名.静态方法名(参数);

            备注:这些不能直接访问成员信息,可以间接的通过实例化对象来调用
        静态原理图解

        static修饰的内容:
            1.是随着类的加载而加载,而且只会被加载一次
            2.存储于一块固定的内存区域(静态域/区),所以可以被直接调用.
            3.他优先于对象存在,所以可以被类的所有对象所共享

        静态代码块
            静态代码块:定义在成员的位置,被static修饰的代码块{}
                1.位置:类中方法外
                2.执行:随着类的加载而加载而且只会执行一次,优先于main方法和构造方法执行

            格式:
               

public class ClassName{
                   static{
                        //执行语句 多条执行语句
                        //...
                   }

                }
                public static void main(String[] args){
                    /*static{
                        错误写法
                    }*/
                }


                -------------------------------------------
                如:

//斗地主 需要三个成员
                    public class Game{
                        public static int number;//玩家数量
                        static ArrayList<String> members;//玩家们
                        static{
                            number = 3;
                            menbers = new ArrayList<>();
                            //添加玩家
                            list.add("小明");
                            list.add("小刘");
                            list.add("小花");
                        }
                    }

                    public class TestGame{
                        public static void main(String[] args){
                            /*ArrayList<String> list = new ArrayList<>();
                            list.add("小明");
                            list.add("小刘");
                            list.add("小花");*/
                        }

                    }


            备注:static可以修饰成员变量,成员方法,代码块,在使用过程中,如果你不想在不创建对象的情况下去调用成员变量,
                    成员方法,可以定义为静态的.对于静态代码块来说,通常作用是对类中的成员变量进行初始化 ,
                    直接定义后初始化局限性很大  静态代码块更灵活还能写多条语句