static关键字staticstatic可用于修饰:属性、方法、代码块、内部类使用static修饰属性:静态变量/类变量。3.1属性按是否被static修饰分为静态属性和非静态属性(实例变量)。实例变量:创建一个类的多个对象,每个对象在类中独立拥有一组非静态属性。当修改其中一个对象中的非静态属性时,不会引起其他对象中相同属性值的修改。静态变量:创建一个类的多个对象,每个对象共享同一个静态变量。当通过一个对象修改一个静态变量时,会导致其他对象调用这个被修改的静态变量。3.2静态修饰属性的其他说明:①静态变量随类的加载而加载。可以通过“class.static变量”的方法来调用②静态变量的加载早于对象的创建③由于类只会被加载一次,所以静态变量在内存中只有一份。存在于方法区的静态域中。④类变量实例变量类是否对象是是类变量vs实例变量的内存分析4.使用静态修饰的方法:静态方法①用类加载加载,可以通过“class.static方法”调用②静态方法Non-staticmethodclassyesnoobjectyesyes③在静态方法中,只能调用静态方法或属性在非静态方法中,静态和非静态方法和属性都可以调用static方法中,不能调用this和super关键字用过的。如何确定一个属性是否应该在开发中声明为静态?多个对象可以共享属性。如何判断一个方法在开发中是否应该声明为静态的,不随对象变化?操作静态属性的方法通常在工具类中设置为静态方法,习惯声明为staticeg:Math,Arrays,Collections单例设计模式要解决的问题采用一定的方法保证即在整个软件系统中,一个类只能存在一个对象实例。具体代码的实现:饿了么中国风://1。私有化类classBank(){privateBank(){}的构造函数//2.内部创建类的对象//4。要求这个对象也必须声明为StaticprivatestaticBankinstance=newBank();//3。提供一个publicstatic方法返回类publicstaticBankgetInstance(){returninstance;}}lazyclassOrder{//1.Privatization类构造函数privateOrder(){//2的对象。不初始化就声明当前类的对象//4.此对象也必须声明为静态//3。声明一个返回当前类对象的公共静态方法publicstaticOrdergetInstance(){if(instance==null){instance=newOrder();}returninstance;}两种方式对比Hungry风格:缺点:对象加载时间过长好处:Hungry风格是线程安全的惰性风格:好处:对象创建延迟当前写法的缺点:线程不安全--->使用多线程内容时修改main()方法说明main()方法作为程序的入口。一个普通的静态方法main()方法可以作为我们与控制台交互的方式(之前使用的是Scanner)。代码块的作用代码块初始化类和对象的信息分类如果代码块使用修饰符,只能使用static静态代码块vs非静态代码块在实例化子类对象时,涉及到静态代码块在子类的父类和非静态代码块中。构造函数的加载顺序是从父到子,静态在前。父类静态代码块→子类静态代码块→父类非静态代码块,执行构造函数→子类非静态代码块,执行构造函数属性赋值:默认初始化显示初始化构造函数中的初始化当你有了一个对象后,你可以通过“object.property”或“object.method”的方式来赋值。代码块中赋值执行的顺序是1→2/5→3→4final可以用来修饰:类,方法,变量(属性,局部变量)具体final用来修饰一个类:这个类不能被继承其他类如:StringSystemStringBufferfinal用于修饰方法:该方法不能被重写如:Object类中的getClass();final用来修饰变量:这时候“变量”就叫做常量①修改属性②修改局部变量,特别是用final修饰形参的时候,说明形参是常量。调用该方法时,给常量形参赋一个实参。一旦赋值,这个形参只能在方法体中使用,不能再赋值。staticfinal用于修饰属性:globalconstantabstractclassabstract关键字用于修饰类和方法abstract用于修饰称为抽象类的类。这样的类不能被实例化。抽象类中必须有构造函数,方便子类实例化时调用。(涉及:子类对象实例化的全过程)开发时会提供抽象类的子类来实例化子类对象并完成相关操作-->抽象使用前提:继承抽象修饰方法:抽象方法一个抽象方法只有一个方法声明,没有包含抽象方法的方法体的类一定是抽象类。相反,抽象类中不能有抽象方法。如果一个子类重写了父类中的所有抽象方法,就可以实例化该子类。如果子类不重写父类中的所有抽象方法,那么子类也可以被实例化。抽象类需要用abstract修饰注意abstract不能用来修饰属性、构造函数等结构,也不能用来修饰私有方法、静态方法、final方法、final类模板方法设计模式。在软件开发中实现一个算法时,总体步骤是固定的、通用的,而且这些步骤都已经写在了父类中。但是有些部分是volatile的,可以将volatile的部分抽象出来,让不同的子类去实现。这是一个模板模式。接口概述由于java不支持多重继承,有了接口,就可以达到多重继承的效果。接口用于定义接口。在Java中,接口和类是两个并行的结构。一个类可以实现多个接口。如何定义接口:定义接口在JDK7之前,只能定义全局常量和抽象方法。全局常量:publicstaticfinal但是抽象方法写的时候可以省略:publicabstractJDK8:除了定义全局常量和抽象方法,还可以定义静态方法,默认方法接口中不能定义构造函数,也就是说接口不能被实例化implements在Java开发中,接口是通过让类实现(implements)来使用的。如果实现类覆盖了接口中所有的抽象方法,则该实现类是可以实例化的如果实现类没有覆盖接口中所有的抽象方法,则该实现类仍然不是抽象类Java可以实现多个接口来弥补单继承的局限格式:classAAextendsBBimplementsCC,DD,EE**接口和接口都可以继承,多继承接口的具体使用可以体现多态接口。其实也可以看作是一种规范。**体会面向接口编程内部类Java允许在另一个类B中声明一个类A,A类为内部类,B类称为外部类
