代码块和继承
代码块 --{}的用法
在java中,使用{}定义的代码叫代码块,根据其位置和声明不同,可分为:
-
局部代码块
-
构造代码块
在类中成员位置,用{}包围;
将多个构造函数中相同的代码提取出来每次调用构造都会在构造方法前执行 -
静态代码块
在类中成员位置,用{}包围;用static修饰,只加载一次
-
执行顺序,先静态代码块,在构造代码块,后构造函数
-
静态代码块对类进行初始化,构造代码块对对象初始化
主类中的,静态代码块最先执行,说明静态代码块在类加载时调用
calss Code {
class CodeDemo{
}
}
继承概述
//定义学生类
class Student(){
String name;
int age;
public Student(){
//getXxx()/setXxx()
}
public void eat(){
System.out.println();
}
}
//定义;老师类
class Student(){
String name;
int age;
public Student(){
//getXxx()/setXxx()
}
public void eat(){
System.out.println();
}
}
- 两个类中存在很多重复的属性和方法;将相同内容定义到同一个类中,然后copy
好处
-
提高代码复用性
-
提高了代码的维护性
-
让类类产生了关系,是多态的前提
类的耦合性增强了
耦合:类与类之间的关系
内聚:自己完成某件事情的能力
开发原则:低耦合,高内聚
类的继承特点
- 单继承
- 多层基层
继承的注意事项
-
只能继承非私有成员变量和方法
父类,共有变量调用私有成员,子类继承会如何 (公共方法来自父类,其本身可以使用父类的成员和方法) -
- 私有成员的内存在哪里
-
不能继承父类构造,但可以通过super访问
-
不要为了部分功能继承(会继承多余的方法,成员等,使得类变得复杂)
-
- 什么时候使用继承,采用假设法:继承反应了一种 is a 的关系
继承中成员变量的关系
class Father{
public int num=10;
}
class Son extends Father{
public int num2=20;
public void show(){
System.out.println(num);
}
}
- 1 子类与父类变量名不相同
- 2 子类与父类变量名相同
-
- 子类局部->子类成员->父类共有成员
- 同时输出局部范围,本类成员,和父类成员的同名变量的方法
- this 和super的区别
this为本类的引用,super为父类存储空间的标示,可理解为父类的引用-
- 调用成员变量
-
- 调用构造方法
-
- 调用成员方法
-
- 子类的所有构造方法默认会访问父类的无参构造方法,写与不写都会访问;
-
- 继承可能导致访问父类数据,因此需先完成父类数据的初十化 内存空间问
-
- 若父类无无参构造方法。子类编译报错,可在子类中增加显示调用有参父类构造方法
-
- 可通过this进行同类构造方法的互相调用
- 面试题2
class Fu{
static {
System.out.println("静态代码块Fu")
}
{
System.out.println("构造代码块Fu")
}
public ?Fu(){
System.out.println("构造方法Fu")
}
}
class Zi extends Fu{
static {
System.out.println("静态代码块Zi")
}
{
System.out.println("构造代码块Zi")
}
public ?Fu(){
System.out.println("构造方法Zi")
}
}
class ExtendsTest{
public static void main(String[] args){
Zi z=new Zi();
}
}
-
- Zi z 加载Zi,需先加载Fu,加载Fu会执行其静态代码块,随后执行Zi静态代码块,
-
- new Zi() 构造Zi需构造Fu,因此先执行Fu构造代码块,而后Fu构造方法。而后子类构造代码块,子类构造方法
-
面试题3
一个类的初十化过程
-
- 成员变量初始化**
-
- 默认初始化**
-
- 显示初始化**
-
- 构造方法初始化**
class X{
Y b=new Y();
X(){
System.out.println("X");
}
}
class Y{
Y(){
Syetem.out.println("Y");
}
}
class Z extends X{
Y y =new Y();
Z(){
//super.()
System.out.println("Z");
}
public static void main(String[] args){
new Z();
}
}
结果 YXYZ
解析:子类构造方法中隐含调用父类的构造方法,但仅说明,子类对象初始化前应先初始化父类对象,并不按该顺序执行。
继承中成员方法的关系
- 子类与父类方法同名,先使用子类
- 方法重写,子类和父类中方法声明相同的方法,包括返回值类型(若返回值不同会怎样)。与 方法重载不同
- 方法重写。子类中以不同的方式实现父类的方法,即多态。即沿袭了父类的功能,又定义了子类特有的功能。不用提供新方法。只需升级原方法。使用super在复写方法中引用原方法,并增加新功能。
- 重写方法的访问权限不得小于被重写的方法。
- 静态方法,必须通过静态方法重写,其实不算重写。非静态方法,不能用静态方法覆盖。
- 学生类和老师类,父类带参构造方法的调用。
- 猫狗类 ,不同的成员方法。