代码块:
在java中,使用{}括起来的内容
分类:
局部代码块:在局部位置,定义方法中写,作用:限定局部变量的生命周期
构造代码块(在成员位置):
在类的成员位置,使用{}---构造代码块
特点:每次执行构造方法之前,先执行构造代码块,作用:将构造代码块中相同的部分使用{}包起来,执行构造方法前先执行构造代码块
优先级:静态代码块>构造代码块>构造方法
注意:不管是无参构造还是有参构造都是先执行构造代码块再执行构造方法
在执行main方法前肯定要先加载所在的类(在创建对象时,如果存在继承关系,先加载父类,再加载子类),所以会先执行其静态代码块
静态代码块:在类的成员位置,使用static{....}
作用:在加载类的时候,随着类的加载而加载,优先于对象存在,类加载一次,静态代码块也只执行一次
继承的概念:将多个类的共性内容,抽取到一个独立的类中,让这独立的类和其他类产生一种关系
关键字:extends
格式:class 子类名 extends 父类名{}
作用:1.提高了代码的复用性
2.提高了代码的扩展性
3.类与类产生的关系----是多态的前提条件!
类与类之间的关系:也是弊端
JAVA中 设计原则:
遵循:低耦合,高内聚
耦合:指的是类与类之间的关联度(越小越好)
内聚:执行某一件事的能力(一个类中能完成的,不要使用多个类共同完成)
继承的特点:
1)仅仅是在java中,只支持单继承(类与类之间的关系)在有的编程语言中,支持多继承---class 子类名 extends 父类名1,父类名2{....}
2)虽然java中类与类之间不支持多继承,但是可以多层继承
java中,任何类都继承自java.lang.Object----代表所有类的父类
继承中的注意事项:
1)在继承关系中,子类继承父类,只能继承非私有的成员,私有成员要访问,只能通过公共方法间接访问
2)子类继承父类,构造方法是不能被继承的,
3)不能为了使用部分功能,而使用继承,只有当类与类的关系,体现出一种"is a"(什么是什么的一种)关系时,才可以使用继承
继承关系中成员变量的访问问题:
类的成员
成员变量
构造方法
成员方法
继承关系中:
子类继承父类,如果子类中的成员变量名称和父类中的成员变量名称不一致的情况下,分别访问即可
子类继承父类,如果子类中的成员变量名称和父类中的成员变量名称一致的情况下,
1)先在子类的局部位置中找,如果存在,就使用
2)如果子类的局部位置中找不到,就在本类的成员位置中找,如果存在,就使用
3)如果本类的成员位置中都找不到,就在父类的成员位置中找,如果存在,就使用,
4)如果在父类的成员位置中都找不到,就报错(注意:在父类中找的时候,只能找成员位置,局部位置是进不去的!!!)
继承关系中 构造方法的访问问题
1)子类继承父类,子类的所有的构造方法都要默认的访问父类的无参构造方法,通过super(),可以省略不写
2)super():在子类中构造方法中第一句话,可以省略
为什么在创建子类对象时,要去访问父类的无参构造?
因为,可能需要用到父类的数据,子类的所有构造方法必须有一个让父类初始化即可!(分层初始化)
面试题:
如果父类中没有无参构造方法,子类的构造方法会有什么问题:如何解决?
子类的所有构造方法都会报错,
解决方法:
1)手动给出父类的无参构造
2)可以让子类的构造方法显示的访问父类的有参构造方法,子类的构造方法第一句:super(xxx)
3)第三种方案:只需要让子类的一个构造方法让父类初始化即可,可以在当前子类的有参构造中,通过this()----访问本类的无参构造方法,然后在子类的无参构造中,间接的访问父类的有参构造
super:代表的是父类的空间标识(代表父类的对象的地址值引用)
this:代表的是本类对象的地址值引用
区别:
this.变量名; 访问本类的成员变量
super.变量名; 访问父类的成员变量
this.方法名(); 访问本类的成员方法
super.方法名(); 访问父类的成员方法
this(); 访问本类的无参构造
this(xxx); 访问本类的有参构造
super(); 访问父类的无参构造
super(xxx); 访问父类的有参构造