文章目录
(一)代码块*
1.分类:
1)普通代码块:定义在方法中的代码块
2)静态代码块:
①定义:使用static定义的代码块
②特点:
a. 静态块优先于构造块执行。
b. 无论产生多少实例化对象,静态块都只执行一次。
3)构造块:
①定义:定义在类中的代码块(不加修饰符)
②特点:构造块优先于构造方法执行,每产生一个新的对象就调用一次构造块
4)同步代码块
2.代码块执行顺序:
范例:(<-请点击)
(二)内部类
1.定义:
在一个类的内部进行其他类结构的嵌套的操作
2.特点:
1)内部类方法可以访问该类定义所在作用域中的数据,包括被 private 修饰的私有数据
2)内部类可以对同一包中的其他类隐藏起来
3)内部类可以实现 java 单继承的缺陷
3.内部类与外部类关系
1)对于非静态内部类,内部类的创建依赖外部类的实例对象
2)①内部类可以直接访问外部类的元素(包含私有域),因为内部类的作用域;Outer.this.外部类的成员属性
②但是外部类不可以直接访问内部类的元素
3)外部类可以通过内部类引用间接访问内部类元素
4.内部类分类
1)成员内部类:
①成员内部类中不能存在任何static的变量和方法
② 成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类
2)静态内部类:使用static修饰的内部类
① 静态内部类的创建是不需要依赖于外围类,可以直接创建
②静态内部类不可以使用任何外围类的非static成员变量和方法
静态内部类外部类的创建:外部类.内部类 内部类对象 = new 外部类.内部类();
3)方法内部类:
①局部内部类不允许使用访问权限修饰符 public private protected 均不允许
② 局部内部类对外完全隐藏,除了创建这个类的方法可以访问它其他的地方是不允许访问的。
③ 局部内部类要想使用方法形参,该形参必须用final声明(JDK8形参变为隐式final声明)
4)匿名内部类:没有名字的方法内部类
① 匿名内部类是没有访问修饰符的。
② 匿名内部类必须继承一个抽象类或者实现一个接口
③ 匿名内部类中不能存在任何静态成员或方法
④ 匿名内部类是没有构造方法的,因为它没有类名。
⑤ 与局部内部相同匿名内部类也可以引用方法形参。此形参也必须声明为 final
5)在外部类外部实例化内部类:
外部类.内部类 内部类对象 = new 外部类().new 内部类();
Outter.Inner in = new Outter().new Inner();
(三)继承
1.实现:
使用 extends
关键字
2.作用:
对类进行扩充以及代码的重用;发生了类继承关系之后,子类可以直接继承父类的操作
3.限制:
子类对象在进行实例化前一定会首先实例化父类对象。默认先调用父类的构造方法后再调用子类构造方法进行子类对象初始化。
注:如果父类里没有提供无参构造,那么这个时候就必须使用super()明确指明你要调用的父类构造方法
4.Java不允许多重继承,但是允许多层继承
(四)覆写:override
1.定义:
子类定义了与父类相同的方法或属性
2.方法覆写:
子类定义了与父类方法名称、参数类型及个数完全相同的方法。但是被覆写不能够拥有比父类更为严格的访问控制权
注:如果父类中方法或属性用private访问修饰符修饰,那么子类是无法进行覆写的,因为子类根本不知道父类有这样的方法或属性
*(五)重载与覆写
(六)super关键字
1.用法:
1)如果父类里没有提供无参构造,那么这个时候就必须使用super()明确指明你要调用的父类构造方法
2)子类使用super.方法()/super.属性
明确调用父类中的方法或属性
(七)final关键字
1.使用及注意事项:
1)类:
①使用final定义的类不能有子类(String类便是使用final定义)
②final一旦修饰一个类之后,该类的所有方法默认都会加上final修饰。(不包含成员变量)
2)变量:
①final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误
②使用final定义的变量就成为了常量,常量必须在声明时赋值,并且不能够被修改public static final MAX_AGE = 120;
3)方法:
使用final定义的方法不能被子类所覆写
*2.数据类型转换
当使用 +、-、*、/、%、运算操作时,遵循如下规则:
1)只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型;
2)如果两个操作数中有一个是float类型的,另一个将会被转换为float类型,并且结果也是float类型;
3)如果两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型;
4)操作数为:byte、short、int 、char,两个数都会被转换成int类型,并且结果也是int类型。但是final修饰的域类型不会发生变化
*5)范例代码(请点击)
(八)多态性
1.方法的多态性:
①方法的重载:同一个方法名称可以根据参数的类型或个数不同调用不同的方法体
②方法的覆写:同一个父类的方法,可能根据实例化子类的不同也有不同的实现
*2.对象的多态(前提:方法覆写)
- 对象的向上转型:【自动,90%】
父类 父类对象 = 子类实例
注:不管是否发生了向上转型,核心本质在于:你使用的是哪一个子类(new在哪里),而且调用的方法是否被子类所覆写了。
2)对象的向下转型:【强制, 1%】子类 子类对象 =(子类)父类实例
向下转型指的是将父类对象变为子类对象,目的是为了子类扩充
范例代码(请点击)
注:不是所有的父类对象都可以向下转型 :如果要想进行向下操作之前,一定要首先发生向上转型,否则在转型时会出现ClassCastException
。