初始化与清理
5.1 用构造器确保初始化
构造器是一种特殊类型的方法,因为他没有返回值,与返回值为void明显不同。
5.2 方法重载
相同词可被理解成不同含义:重载
构造器必须使用重载(名字相同,但所传入的参数类型或个数不同)
小转大:::如果传入的类型小于方法中声明的形式参数类型,实际数据类型就会被提升。(若传入的为int,但无int,若有long,则直接自动升级为long)
大转小:::如果传入的类型大于方法中声明的形式参数类型,就会通过类型转换来执行窄化转换,否则编译器报错。(double x ,强转((int)x))
不可根据方法的返回值来区分重载方法。
5.3 默认构造器
若未写任何构造器,则自动生成默认无参构造器,若有构造器,则将不会生成无参构造器。
5.4 this关键字
参数名字与数据成员名字一样时,可以使用this关键字(this.s)代表数据成员
static方法中不可有this
5.7 构造器初始化
初始化顺序(先静态):在类的内部,变量定义的先后顺序就是初始化顺序,他们会在任何方法(包括构造器)之前被初始化
变量-》对象-》方法(或构造器)
5.8 static
若类中有多个static代码块,则在编译时将合成一个static进行编译
可先在static代码块中进行初始化,再声明,以上三种初始化都是一个效果
题目:下面的题输出多少?
无论是static代码块初始化还是直接初始化,到最后都会汇集到同一个static代码块中初始化,因此以顺序为准。
实例初始化子句 与 静态代码块 的区别:
1.static代码块:静态代码块会在类第一次被实例化或第一次被访问静态成员时被初始化,仅初始化一次
2.实例初始化子句:无static,每次实例化对象都会执行
3.实例初始化子句 在构造方法之前执行,无论调用哪个构造方法,实例初始化语句都会执行
接口:如果子类想要实现一个接口,则只用在基类中继承即可(减少了代码量)
多态:
父类 a = new 子类()
则a只能调用父类中有的方法,不可调用子类的方法。
若调用的方法子类中也有,则调用的为子类的方法。
接口 a = new 类名()
这样用同一个接口实现不同的功能(多态的体现)
隐藏类中的一些功能。
Animal a = new Cat();(向上转型) cat--->Animal
Cat c = (Cat)a;(向下转型) Animal ----Cat
内部类: 成员内部类,匿名内部类,局部内部类,静态内部类
当内部类与外部类有同名变量时,默认访问内部类的,若想访问外部类的变量可以
外部类.this.变量名
外部类.this.成员方法
成员内部类可无条件访问外部类
外部类要访问成员内部类需要 new一个成员内部类的对象,然后通过引用访问
在其他类中获取一个类的成员内部类的对象
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
内部类的private属性,当内部类的外部类new了一个内部类对象,内部类的外部类可访问内部类的private属性
内部类的protected 同包
内部类的public 全部
安卓的按键监听事件就是 匿名内部类
静态内部类:与内部类相似,仅仅前面加了个static,但只能访问外部类的static方法或成员变量
内部类的继承的接口与外部类继承的接口互不相干
外部类无法重写内部类的接口,内部类也不可重写外部类的接口
创建静态内部类对象的一般形式为: 外部类类名.内部类类名 xxx = new 外部类类名.内部类类名() 注意 对象名 和 类名
创建成员内部类对象的一般形式为: 外部类类名.内部类类名 xxx = 外部类对象名.new 内部类类名()