- 初始化块
初始化块是JAVA类中可出现的第4种成员,块内可包含执行语句,初始化块是构造器的补充,初始化块总是在构造器执行之前执行。
分为四类:局部代码块、构造代码块、静态代码块、同步代码块
局部代码块:
在方法块中定义,{ } ; 作用域只在代码块里,随着代码块的结束而销毁
优点:节省空间
构造代码块:
在类体里定义,{ };
注意:
1.代码块是由JVM执行
2.创建对象后都会先执行构造代码块
3.代码块优先于构造器先执行
优点:1.给成员变量赋值;
2.如果类中某一个方法要在实例化对象是执行,就可将代码放入代码块中
3.实例化的对象有共同的行为可以放入代码块中
静态代码块:
在类体里定义 static{}
注意:
1.代码块是由JAM执行
2.静态代码块只加载一次,并且优先与构造器、构造代码块
3.遵循静态成员不能访问非静态成员
优点:
1.只执行一次,加载驱动、框架配置文件
同步代码块:
synchronized(类名.class){}
优点:在多线程中保护数据安全
初始化块的执行顺序:
1.同一类中
a.静态块 --> main() --> 构造块 --> 构造方法
2.涉及继承
a.从父类到子类依次执行静态代码块
b.然后执行父类的普通代码块和构造方法,紧接着执行子类的普通代码块和构造方法
基础用法:
如果有一段初始化处理代码对所有对象完全相同且无需接收任何参数,就可以把这段初始化处理代码提取到初始化块中
- 继承
extends关键字实现,实现继承的类被成为子类(派生类),被继承的类称为父类(基类、超类)
它们是一般和特殊的关系,例如水果与苹果,父类的组成就是各子类的共同
JAVA类只能有一个直接父类,实际上,JAVA可以有无限个间接父类,
Plant == Fruit == Apple
(间接父类) (直接父类)
语法:
public class Apple extends Fruit ==> Apple 是 Fruit 的子类,Apple继承Fruit
注意:
1.子类可以获得父类成员属性、成员方法,但父类不可以获得子类的成员属性、方法
2.如果子类和父类中有相同的成员变量, 实例化子类对象调用这个成员变量,子类会从本身一直往上查找,直到获取为止,
3.子类不可以获得父类的构造器!
4.多态是以继承为基础
优点:
1.提高代码的复用性、
2.提高代码的可维护性,
3.让类与类之间产生联系,是多态的前提
缺点:
1.提高了类的耦合度
2.开发原则:高内聚、低耦合 耦合:类与类之间的关系 内聚:自己完成某件事情的能力
储存图
父子类设计:
设计父类的规则
1.尽量隐藏父类的内部数据,将父类的所有成员变量设置成Privarte访问类型
控制访问权限,不要让子类随意访问、修改父类的方法
a.仅为辅助其他的工具方法,应该使用Private
b.需要被外部类调用,则必须以public修饰,又不希望被子类重写,则使用final
c.希望被子类重写,但不希望被其他类自由访问,使用 protected
e.尽量不要在父类构造器中调用将要被子类重写的方法
因为程序运行时会首先调用构造器,如果在构造器中调用子类重写方法
则会变成调用子类重写后方法
子类的特征
1.子类需要额外增加属性,而不仅仅是属性值的改变;
2.子类需要增加自己独有的行为方法(包括新方法和重写父类的方法)
- 方法重写
子类包含与父类同名的方法和现象被称为方法重写,也称为方法覆盖
规则:两同、两小、一大
两同:方法名相同、形参列表相同
两小:方法声明抛出的异常类和方法返回值,子类小于或等于父类
一大:子类的访问权限要比父类方法的访问权限更大或相等
注意:
1.覆盖方法和被覆盖方法,要么是类方法,要么是实例方法。
不能一个为类方法一个为实例方法
2.区分方法重写和方法重载
方法重写是发生子类与父类之间
方法重载是发生在同一类中
3.覆盖的方法必须在前一行加上@Oerride标识
- super限定
在子类中访问父类中被覆盖的成员变量和成员方法
1.子父类中有同名的成员变量和成员方法(不同名就不使用)
super.成员变量名/成员方法 (访问父类的中同名的变量或方法)
2.子类构造器中调用父类构造器
supre(参数1,参数2)
注意:
1子类中的成员实例变量或者成员实例方法的访问权限需要强行转换类型才能访问
(父类名)对象名.实例变量
2.子类构造器中调用父类构造器,一定要参数相对应
- JAVA 所有类的父类!Object类
JAVA类的所有类在没有手动继承父类的情况下都会默认继承一个Object类
- final关键字
final修饰的变量不可被改变,一旦获得初始值,该变量的值不能重新赋值
final变量
1.类变量和实例变量
a.类变量
静态初始化块中指定或声明该类变量时指定
b.实例变量
非静态初始化块或声明该实例变量或构造器中指定
注意:final修饰的成员变量必须由程序员显式地指定初始值;在没有初始化之前是不可以访问,没有初始化的系统会报错
2.局部变量和引用变量以及形参
a.局部变量
可以在定义时指定默认值,也可以不指定默认值
b.形参
不能在方法中直接赋值!只能通过对象调用方法,值传递方式进行赋值
c.引用变量
只保证这个引用类型变量所引用的地址不会改变
e.g:final 类名 变量 = new 类名();
开发中使用:
final一般与static配合使用 , 一般修饰常量