-
代码块
-
继承
-
方法重写
-
Final关键字
代码块
代码块 { }
通过位置、声明可以将代码块分为
- 局部代码块:定义在方法中的代码块
在方法中出现,限定变量周期,及早释放,提高内存利用率
- 构造代码块:在类中方法外出现,多个构造方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
当创建对象时,有构造代码块,先执行构造代码块,在执行构造方法。
- 静态代码块:在类中方法外出现,加了static关键字修饰
用于对类进行初始化,在加载的时候执行,只执行一次
public class Demo{
public static void main(String [] args) {
Zi s=new Zi();
}
}
class Fu {
static {
System.out.println("父类 静态构造代码块");
}
{
System.out.println("父类 构造代码块");
}
public Fu () {
System.out.println("父类 构造方法");
}
}
class Zi extends Fu {
static {
System.out.println("子类 静态构造代码块");
}
{
System.out.println("子类 构造代码块");
}
public Zi() {
System.out.println("子类 构造方法");
}
}
继承
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
继承的好处:
提高代码的复用性
提高代码的维护性
坏处:
使得类和类之间产生了关系,增加了耦合
(软件的设计原则:高内聚,低耦合)
(高内聚:一个事物,独立完成某项功能能力)
(低耦合:事物和事物之间产生了依赖关系)
注意事项:
- Java只支持单继承,但可以多层继承
- 父类私有成员子类无法继承
- 构造方法不继承
- 当创建子类对象时,先调用父类的构造方法,完成父类数据初始化
父类构造的作用:
当创建子类对象时,会先调用父类的构造方法,因为子类继承父类数据,甚至还要使用父类的数据,当父类没有完成数据初始化,子类就无法继承。
就近原则
变量访问遵循就近原则,先在本类局部范围找(形参、方法),没有的话,在成员范围找(类中方法外)到就使用
如果在本类成员范围没有找到,就到父类成员范围找,找到使用
区别
区别 | |
---|---|
super | 在子类方法中使用,代表父类的引用 |
this | 代表本类的一个引用,this可以访问本类成员 |
方法重写
当子类出现和父类一样(方法名、参数列表、返回值)的一个方法,就会发生方法覆盖,子类会覆盖父类方法。
注意事项
区别:
方法重载:允许一个列表中,可以定义多个同名方法,只要他们参数列表不同(参数个数、形参类型)
方法重写:发生在继承中,子类可以提供一个与父类一样的方法(方法名、形参列表、返回值)会发生子类方法覆盖父类方法的对象
final关键字
继承中有方法重写的现象,有时候我们并不想子类重写父类方法,所有就使用到了final关键字
final:可以修饰类,变量,成员方法
修饰变量: 被修饰的变量成为常量
修饰方法: 被修饰的方法不能被重写
修饰类: 被修饰类不能被继承
final修饰基本数据类型指的是值
final修饰引用数据类型,指的是地址值
练习
//测试类
public class Test {
public static void main(String[] args) {
Dog d=new Dog();
d.name="大黄";
d.age=5;
System.out.println("名字:"+d.name);
System.out.println("年龄:"+d.age);
d.eat();
Cat c=new Cat();
c.name="小咪";
c.age=4;
System.out.println("名字:"+c.name);
System.out.println("年龄:"+c.age);
c.eat();
}
}
//父类
public class Demo {
String name;
int age;
public void run(){
System.out.println("跑步");
}
public void eat(){
System.out.println("吃饭");
}
}
//子类 狗
public class Dog extends Demo{
public void eat(){
super.eat();
System.out.println("吃骨头");
}
}
//子类 猫
public class Cat extends Demo{
public void eat(){
super.eat();
System.out.println("吃鱼");
}
}