封装:
封装:将对象状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是用类所提供的方法访问和操作。
访问控制符:private(当前类访问权) ,protected(子类访问),public(公共访问),default(包访问)
set(),get()
构造器重载,名字相同 ,形参不同。
构造器中调用另一个构造器用this();必须出现在构造器第一行。
方法重载:名字相同,形参不同。与返回值,修饰符无关。
继承:
继承:每个子类只有一个直接父类,extends。
默认继承java.lang.Object,是所有类的父类。
子类可以重写父类方法。方法重写。两同两小一大:方法名同,形参同,返回值小,异常小,子类访问权限大。
子类覆盖后子类对象不可调用父类方法,但可在子类方法中调用,super(实例方法),父类类名(类方法)来调用。
如果父类private,那方法对子类隐藏,子类无法调用,无法重写。
super:也可用来访问父类被覆盖的实例变量。
会为所有实例变量分配内存。(被覆盖了也分配)
子类也可以用super调用父类构造器。
子类没有super调用父类构造器,系统会在执行子类构造器之前调用父类构造器。
父类构造器在子类构造器之前进行,还会上溯,最先执行的总是java.lang.Object构造器。
继承注意点:子类可以访问父类成员变量和方法,不安全
尽量隐藏父类内部数据,private
不让子类随便访问,修改父类方法,不能访问private.如果希望访问不让重写,用final public,可以被子类重写不能被外部访问用protected.
尽量不在父类构造器中调用被子类重写的方法。
多态:编译时类型和运行时类型不同,相同类型的变量调用同一个方法呈现多种不同行为特征。
编译时类型:声明该变量时的类型。
运行时类型:实际赋给该变量的对象。
子类对象赋给父类引用变量——向上转型,系统自动完成。
父类对象赋给子类引用变量——强制类型转换,instanceof判断更安全,否则ClassCastException
最终类不能被继承:1.用final修饰类,2.用private修饰类的所有构造器,子类无法调用,就无法继承。
组合复用。
初始化块:
可有修饰符static。初始化块按顺序进行。
创建对象时,先调用类里的初始化块再执行构造器。
初始化块是构造器补充,在构造器前执行。
但是不能接受任何参数,对所有对象初始化相同。
==和equals:引用变量用==时,只有他们指向同一个对象才true。==两边没有父子关系的两个对象会编译错误。
“hello”直接量存在常量池,new String ("hello")Jvm会用常量池保存"hello",在调用String类构造器创建一个新对象,保存在堆内存中。所以不相等。
值相等用str1.equals(str2);
类成员,类方法,即使实例是Null也可以访问类成员,null访问实例成员会引发NullPointerException。
静态初始化块也是类成员,类初始化时调用,之后不再执行,
类成员不能访问实例变量。
单例类:一个类只能创建一个实例。构造器private。提供一个public 方法作为访问点,用于创建对象,且是public static.且类还必须缓存已经创建的对象。用一个成员变量来保存曾创建的对象,要被静态方法访问,必须也static.
只能创建一个对象,再多引用所指的都相等。
final:
修饰变量,该变量一旦有初始值就不可改变,final修饰的成员变量必须显示指定初始值,系统不会对final成员隐形初始化,final修饰局部变量,修饰形参
final修饰引用变量,final保证指向的对象不变,但对象内容可以改变。
final修饰变量,宏定义,定义final时就为变量指定初始值,在编译时确定,final变量实际是宏变量。
修饰方法,不可被子类重写。但可以被类内重载
修饰类:不可以有子类,不可被继承、
不可变类:创建该类实例后,该实例实例变量不可改变。
规则:1.用private和final修饰该类成员变量 2.提供带参数构造器,传入参数来初始化。 3.只为该类成员提供getter().不能setter()
抽象:
抽象方法,抽象类:abstract。
抽象方法不能有方法体,抽象类不能被实例化,不能new.这个类只能被继承。
抽象方法没有方法体,必须被子类重写。
final与abstract不能同时用。static和abstract也不能同时修饰同个方法。
抽象类只定义某些方法,把不能实现的部分抽象成抽象方法,留给子类实现。