一、代码块
1.局部代码块
书写位置:方法中。
作用:限制作用域。
public void fun1() { { int num = 10; System.out.println(num); } }
2.构造代码块
书写位置:类中方法外。
代码的执行:
1.构造代码块是由系统调用的;
2.只要创建对象,就会调用;
3.构造代码块在构造方法之前被调用。
作用:当有一个方法需要每一个对象都调用的时候,可以将这个方法在构造代码块中调用(不常用)。
class Person{ { System.out.println("我是构造代码块"); } }
3.静态代码块
使用关键词static修饰的代码块。
位置:类中方法外。
静态代码块的调用:
1.随着类的加载而加载;
2.只加载一次;
3.在构造代码块之前执行。
4.同步代码块(多线程部分提到)
二、继承
面向对象的三大特征之一。
继承:
1.继承可以传递;
2.继承的是属性和行为(不是全部继承);
3.建立了类与类之间的关系。
class Cat extends Animal{ }
继承的好处:
1.减少代码量;
2.提高工作效率;
3.增强了类与类之间的关系(让类和类的关系更加紧密)。
继承的弊端:违反了低耦合(低耦合:希望类与类之间减少联系)
使用继承一定要符合逻辑
简单的继承:
// 关键词 子类 extends 父类 // 猫类 继承了动物类 class Cat extends Animal{ // 猫的独特行为 public void cry() { System.out.println("喵喵喵"); } } // 狗类 继承了动物类 class Dog extends Animal{ // 狗的独特行为 public void cry() { System.out.println("汪汪汪"); } }
Java中只允许单继承(类与类之间)(可以同过接口来体现多继承)
Java中可以多层继承,多层继承会出现继承体系(继承链),学习一个体系的时候,先看顶层的类,使用最底层的类创建对象调用方法。
当使用这个体系的方法和属性时,如果只使用共有的方法和属性,一般选择使用继承链最顶端的类。如果想使用特有的方法和属性,一般选择使用继承链最末端的类。
如果一个类没有写继承,那么这个类默认继承Object类(基类)
继承中得构造方法:
注意:构造方法是不能继承的。
当创建子类的时候,为了保证继承的完整性(不论创建子类对象的时候使用的是无参还是有参构造),系统会默认帮你调用父类中的无参构造方法。
class Son extends Father{ public Son() { // 系统帮你在构造方法的第一行 写了一句代码 // 如果你不写 系统会默认帮你加上 super();//调用父类的构造方法 System.out.println("我是Son类的无参构造方法"); }
super关键字:在子类中代表的是父类的对象。在子类中,除了可以同过super关键字调问父类属性或方法,还可以通过this关键字来调用(子类中没有这个属性或方法时,就去父类中寻找)。
在子类中可以通过super()调用父类的无参构造方法,那么父类中没有无参构造方法时,super()还能否调用到父类的无参构造方法呢?答案是不能。如果父类中只有有参构造方法,那就要在构造方法的第一行通过super调用父类的有参构造方法。
方法的重写(Override)
方法的重写的前提是至少要有两个类,并且类之间要有继承关系。
方法的重写相当于对父类的该方法进行升级,重写要求重写的方法名称、关键词、返回值等和父类的方法完全一致。
class C{ public void print() { System.out.println("我是C类的print方法"); } } class D extends C{ public void print() { // 重写父类的方法时 // 调不调用父类的方法 要根据你的需求而定 super.print(); System.out.println("我是D类的print方法"); } }
final关键字
1.可以修饰方法,被修饰的方法不能被重写;
2.可以修饰类,被修饰的类不能被继承;
3.修饰变量,被修饰的变量不能被修改;
4.修饰引用数据类型时,不能对被修饰的变量重新指向(地址不能修改),但不影响对象中属性的修改。