第六章面向对象(下)

6.1 关键字:static

package atguigu.com;
/*
 * static关键字的使用
 * 
 * 1.static:静态的
 * 2.static可以用来修饰:属性、方法、代码块、内部类
 * 
 * 3.使用static修饰属性:静态变量(或类变量)
 *         3.1属性:按是否使用static修饰,又分为:静态属性和非静态属性(实例变量)
 *             实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类种的非静态属性。当修改其中一个对象
 *                     的非静态属性时,不会导致其他对象中同样的属性值的修改。
 *             静态变量:多个对象共享同一个静态变量。当通过某一个对象去修改静态变量时,会导致其他对象调用
 *                     此静态变量时,是修改过了的。
 *         3.2 static修饰属性的其他说明:
 *             ①静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用
 *             ②静态变量的加载要早于对象的创建。
 *             ③由于类只会加载一次,则静态变量在内存中也只会存在一份,存在方法区的静态域中。
 *             
 *             ④            类变量        实例变量(非静态属性)
 *             类            yes            no
 *             对象            yes            yes
 * 
 *         3.3 静态属性举例:System.out;Math.PI;
 * 
 * 4.使用static修饰方法:静态方法
 *         ①随着类的加载而加载,可以通过"类.静态方法"去调用
 *         ②              静态方法        非静态方法
 *             类            yes            no
 *             对象            yes            yes
 *         ③ 静态方法中,只能调用静态的方法或属性
 *             非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
 * 
 * 5.static注意点:
 *     5.1在静态的方法内,不能使用this关键字,super关键字
 *     5.2关于静态属性和静态方法的使用,大家都从生命周期的角度去理解。
 * 
 * 6.开发中如何确定一个属性是否要声明为static?
 *         >属性是可以被多个对象所共享的,不会随着对象的不同而不同的。
 *         >类中的常量也常常声明为static
 *         
 *     开发中如何确定一个方法是否要声明为static?
 *         >操作静态属性的方法,通常设置为static的
 *         >工具类的方法,习惯上声明为static的,比如:Math、Arrays、Collections
 * 
 */
public class StaticTest {
    public static void main(String[] args) {
        Chinese c1 = new Chinese();
        c1.name = "姚明";
        c1.age = 40;


        Chinese c2 = new Chinese();
        c2.name = "马龙";
        c2.age = 35;

        c1.nation = "CHN";
        System.out.println(c2.nation);

    }
}

//中国人
class Chinese{
    String name;
    int age;
    static String nation;



}

单例设计模式

设计模式是在大量的实践中总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式。
优点:由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。

饿汉式

package atguigu2.com;
/*
 * 单例设计模式:
 * 1.所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例
 * 
 * 2.如何实现?
 * 饿汉式VS懒汉式
 * 
 * 3.区分饿汉式和懒汉式
 *     饿汉式:坏处:对象加载时间过长
 *             好处:线程安全
 *     懒汉式:好处:延迟对象的创建
 *             目前的写法坏处:线程不安全----->到多线程内容时,再修改
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 */
public class SingletonTest1 {
    public static void main(String[] args) {
        Bank bank1 = Bank.getInstance();
        Bank bank2 = Bank.getInstance();
        System.out.println(bank1 == bank2);
    }
}
//饿汉式:先造好对象
class Bank{

    //1.私有化类的构造器
    private Bank(){

    }
    //2.内部创建类的对象
    //4.要求此对象也必须声明为静态的
    private static Bank instance = new Bank();

    //3.提供公共的静态的方法,返回类的对象
    public static Bank getInstance(){
        return instance;
    }
}

懒汉式

package atguigu2.com;
/*
 * 单例模式的懒汉式实现
 * 懒汉式:什么时候需要对象,什么时候造
 * 
 */
public class SingletonTest2 {
    public static void main(String[] args) {
        Order order1 = Order.getInstence();
        Order order2 = Order.getInstence();
        System.out.println(order1 == order2);
    }
}

class Order{

    //1.私有化类的构造器
    private Order(){

    }
    //2.先声明当前类对象,没有初始化
    //4.此对象也必须声明为static的
    private static Order instance = null;

    //3.声明public、static的返回当前类对象的方法
    public static Order getInstence(){
        if(instance == null){
            instance = new Order();
        }

        return instance;
    }
}

6.2理解main方法的语法

package atguigu2.com;
/*
 * main()方法的使用说明
 * 1.main()方法作为程序的入口
 * 2.main()方法也是一个普通的静态方法
 * 3.main()方法也可以作为我们与控制台交互的方式。(之前,使用Scanner)
 * 
 */
public class MainTest {
    public static void main(String[] args) {//入口
        Main.main(new String[100]);

        show();
    }

    public static void show(){

    }
}


class Main{
    public static void main(String[] args){

        for(int i = 0;i < args.length;i++){
            args[i] = "args_" + i;
            System.out.println(args[i]);
        }

    }


}
package atguigu2.com;

public class MainDemo {
        public static void main(String[] args) {

            for(int i = 0;i < args.length;i++){
                System.out.println("******" + args[i]);
                int num = Integer.parseInt(args[i]);
                System.out.println("###########" + num);

            }

        }    
}

6.3类的成员之四:代码块

package atguigu2.com;
/*
 * 类的成员之四:代码块(或初始化块)
 * 
 * 1.代码块的作用:用来初始化类,对象
 * 2.代码块如果有修饰的话,只能使用static
 * 3.分类:静态代码块 VS 非静态代码块
 * 4.静态代码块
 *         >内部可以有输出语句
 *         >随着类的加载而执行,而且只执行一次
 *         >作用:初始化类的信息
 *         >如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
 *         >静态代码块的执行要优先于非静态代码块的执行
 *         >静态代码块内只能调用静态属性或静态方法
 * 5.非静态代码块
 *         >内部可以有输出语句
 *         >随着对象的创建而执行
 *         >每创建一个对象,就执行一次非静态代码块
 *         >作用:可以在创建对象时,对对象的属性等进行初始化
 *         >如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
 *         >非静态代码块内可以调用静态的属性,静态的方法或非静态的属性,非静态的方法
 *     对属性可以赋值的位置:
 * ①默认初始化
 * ②显式初始化
 * ③构造器中初始化
 * ④有了对象以后,可以通过"对象.属性"或"对象.方法"的方式进行赋值
 * ⑤在代码块中赋值
 */
public class BlockTest {
    public static void main(String[] args) {
        String desc = Person.desc;
        Person.info();
        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,static block");
        desc = "我是一个爱学习的人";
    }
    //非静态代码块
    {
        System.out.println("hello,block");
        age = 1;
    }

    //方法
    public void eat(){
        System.out.println("吃饭");

    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    public static void info(){
        System.out.println("是一个快乐的人");
    }
}