static关键字
希望无论是否产生对象或产生多少个对象的情况下,某些特定数据在内存空间只有一份。
例如所有中国人都有一个国家名称,不必在每个中国人的实例对象中都单独分配一个代表国家名称的变量。
static可以修饰:属性,方法,代码块,内部类
static修饰属性
创建类
测试
结论
非静态变量(实例变量):创建一个类的多个对象,每个对象都独立拥有一套类中的非静态属性,当修改其中一个对象中的非静态属性,不会导致其他对象中同样的属性值进行修改。
静态变量(类变量):多个对象共享同一个静态变量。通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过的。
其他说明
静态变量随着类的加载而加载,可以通过类.静态变量调用
静态变量的加载早于对象的创建
由于类只加载一次,则静态变量在内存中也会只存在一份,存在方法的静态域中。
类和对象都能调类变量。类不能调实例变量。
静态变量举例
System.out Math.PI
static修饰方法
可以通过 类.静态方法 调用 类不能直接调用非静态方法
静态方法中不能使用this,super关键字,不能调用非静态的方法,可以使用静态属性
非静态的方法可以调用静态的方法
如何确定方法是否要声明为static
操作静态属性的方法(get,set……),通常设置为static
工具类中的方法,习惯上声明为static
静态方法
调用
单例设计模式
所谓单例设计模式就是:采用一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例
饿汉式
好处:是线程安全的
坏处:对象加载时间长
懒汉式
好处:延迟对象的创建。
坏处:不安全
代码块
作用:用来初始化类、对象
如果有修饰符只能使用static,内部可以有输出语句,可以有多个静态,非静态代码块,相同类型代码块按顺序执行
分类:
一、静态代码块:随着类的加载而执行
初始化类的信息(静态属性)
二、非静态代码块:随着对象的创建而执行
每创建一个对象,就执行一次非静态代码块
可以给对象的属性进行初始化
创建子类对象时子类和父类的静态代码块,代码块,构造器的执行顺序
父类的静态代码块
子类的静态代码块
父类的非静态代码块
父类的构造方法
子类的非静态代码块
子类的构造方法
final关键字
final可以用来修饰的结构:类、方法、变量
用来修饰类:该类不能被其他类继承。如String,System,StringBuffer
用来修饰方法:表明该方法不能被重写,如Object类中的getClass();
用来修饰变量:常量
抽象类和抽象方法
随着继承层次中的一个个新子类的定义,类变得越来越具体,而父类则越来越一般,更通用。类的设计应保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于他没有具体的实例,这样的类叫做抽象类。
abstract关键字
可以用来修饰
类:不能创建抽象类的实例对象,抽象类可以没有抽象方法
方法:抽象方法没有方法体,后面加分号,抽象方法只能存在于抽象类
若子类重写了父类中的所有抽象方法,则子类方可实例化。
若子类没有重写父类的所有抽象方法,则子类也应为抽象类
不能用来修饰属性,构造器等结构
不能用来修饰私有方法,静态方法,final修饰的方法,类(私有方法,final方法不能被重写,final类不能被继承,子类和父类的同名同参静态方法不认为是重写)
抽象类的匿名子类对象
模板方法设计模式(抽象类的应用)
将不确定的部分定义为抽象方法,在子类中重写
接口
有时候必须从几个类中派生出一个子类,继承他们的所有属性和方法。但是java不支持多重继承。有了接口,就可以得到多重继承的效果。
继承是一个“是不是”的关系,而接口实现则是一个“能不能”的关系。
接口的本质是契约,标准,规范。
注意:java中,接口和类是并列的结构,接口中不能定义构造器,不可实例化
java开发中,接口通过让类去实现(implements)的方式来使用
如果实现类覆盖了接口的所有抽象方法,则实现类就可以实例化
如果实现类没有覆盖接口的所有抽象方法,则此实现类仍为抽象类
java类可以实现多个接口
弥补了单继承性的局限性
接口的继承
可以多继承
接口的具体使用,体现多态性
静态代理
JDK8:除了定义全局常量和抽象方法外,还可以定义静态方法,默认方法
如果子类继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下默认调用的是父类的同名同参数的方法。
如果实现类实现了多个接口,多个接口中定义了同名同参数的默认方法,在实现类没有重写该方法的情况下报错 -- 接口冲突
内部类
java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B就称为外部类
内部类的分类:成员内部类,局部内部类
成员内部类
作为外部类的成员:可以调用外部类的成员。
可以被static修饰。
可以被4种权限修饰符修饰
作为一个类:可以定义属性,方法,构造器,可以继承。
可以被final修饰,表示此类不能被继承。
可以被abstract修饰,表示此类不能被实例化。
创建内部类的实例