代码块:
在Java中,使用{}括起来的代码被称为代码块
根据其位置和声明的不同,可以分为
-
局部代码块(当作正常的代码看待)
格式:只在方法中出现,使用大括号括起来的代码叫局部代码块
优点:使用完毕及早释放,提高内存的使用率
执行顺序:在一个方法中,自上而下的顺序执行
-
构造代码块
位置:在类中方法外定义,
执行顺序:每次调用构造方法的时候,都会先执行一遍构造代码块再执行构造方法 构造代码块 >--> 构造方法
如果在main方法中new对象的时候,也有局部代码块,执行顺序自上而下
-
静态代码块
格式:被static修饰的代码块,定义在类中方法外
执行顺序:静态代码块 -- 构造代码块 -- 构造方法
static代码块一旦被执行过一次后,同一个程序不会重复执行。
静态的内容是属于类的本身,程序的开始到结束只会加载一次,不会重复加载
继承概述
- 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
- 通过extends关键字可以实现类与类的继承
格式:class 子类名 extends 父类名 {}
单独的这个类称为父类,基类或者超类;
这多个类可以称为子类或者派生类。
- 有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员。
继承的优点
- 提高了代码的复用性
多个类相同的成员可以放到同一个类中
- 提高了代码的维护性
如果功能的代码需要修改,修改一处即可
- 让类与类之间产生了关系,是多态的前提
继承的缺点
- 提高了类的耦合性
设计原则:
高内聚低耦合
简单的理解:
- 内聚就是自己完成某件事情的能力。
- 耦合就是类与类之间的关系。
使用继承的注意事项
-
子类只能继承父类的所有非私有的成员(成员变量和成员方法)
体现了继承的另一个弊端:打破了封装性
- 子类可以继承父类的构造方法吗?
子类不能继承父类的构造方法,但是可以通过super(后面讲)关键字去访问父类构造方法。
-
不要为了部分的功能特地的去使用继承
例如:
class A{
show1();
show2();
}
class B{
fun1();
fun2();
fun3();
show1();
}
- 那什么情况下使用继承呢?
可以满足什么是什么("is a")这个关系的时候,就可以用继承了。
例如:苹果是水果
水果:
苹果,橘子,西瓜,草莓
液态:
水,可乐,芒果汁
继承中成员变量的关系
结论:(访问变量遵循就近原则)
- 在子类方法中访问一个变量
- 首先在子类局部范围找
- 然后在子类成员范围找
- 最后在父类成员范围找(肯定不能访问到父类局部范围)
- 如果还是没有就报错。(不考虑父亲的父亲…)
现在我们清楚了继承去访问成员的顺序,但是我们想不仅要输出本类范围中的成员,我还想输出父类中有同名的成员,该怎么办呢?
如果有一样东西,和this相似,可以直接访问父类的数据就好了
通过学习后发现,java给我们提供了这样的一个关键字实现这一功能:super
this关键字与super关键字的区别
this代表的是当前对象的引用
super代表的是当前对象的类继承的父类的引用(可以直接操作父类中的成员)
super与this的使用格式:
1、访问成员变量:
super.成员变量(访问的是父类中的成员变量)
this.成员变量(访问的是本类中的成员变量)
2、访问成员方法:
super.成员方法(访问的是父类的成员方法)
this.成员方法(访问的是本类中的成员方法,可以访问的是继承自父类中的成员方法)
子类不能调用父类的私有成员(被private修饰的成员)
3、访问构造方法:
super(...)(访问父类构造方法中的方式)
this(...)(访问笨了中的构造方法)
继承与构造方法的关系
先记住一句话,要想初始化子类,就必须初始化父类,而初始化调用的是构造方法
子类中所有的构造方法中都会默认含有一个访问父类的无参构造方法super()
new的时候会先访问字了中的无参构造方法,但是子类无参构造方法中会默认有一个父类无参构造方法的super()
当父类没有提供无参构造方法的时候,如何解决?
1、父类提供一个无参构造方法
2、在子类的构造方法中第一句话上使用super访问父类中其他的构造方法,完成父类的初始化
3、在无参构造方法中使用this关键字调用本类的其他含有super(...)的访问父类的有参构造方法
1、new调用Son类的无参方法,通过this找到Son类的有参构造方法中的super(),访问父类有参构造方法
2、再调用Son类有参构造方法
3、最后调用Son类中的无参构造方法
注意事项:
1、对构造方法的调用必须是构造器中的第一个语句
2、同一个只能被初始化一次
继承与成员方法的关系
继承与成员方法的关系:
1、当子类中的方法与父类中的方法不同名的时候,根据调用方法的名字的不同,调用的方法也不同
2、当子类中的方法与父类中的方法名字一样的时候
1)先在本类中查找,看看有没有方法,如果有就直接调用
2)如果本类中没有对应名字的方法,就去父类中找同名的方法
3)如果在父类中也没有找到对应的方法,那么就会报错