Java学习回忆录-基础语法-009
继承
描述了类和类之间的关系.
xxx 是一个…
格式:class 子类名 extends 父类名{ }
好处:
1. 提高了代码的复用性
将重复代码(属性,行为),放在父类中,让子类继承父类, 子类中就不用重复编写了,直接继承,子类中只需要定义特有的属性和行为。
2. 提高了代码的维护性
定义类时,通过继承,定义父类,子类. 如果发现一些子类有共享的属性和行为,不用在每一个子类中添加, 找到父类,在父类中添加这些属性和行为, 子类通过继承就获取到了.
弊端:类的耦合性增加
开发的原则:高内聚,低耦合
耦合:就是类与类的关系
内聚就是自己完成某件事的能力
特点:
成员变量在继承中的特点:父类中有成员变量,子类中有成员变量.
java只支持单继承,不支持多继承。
有些语言是支持多继承,格式:extends 类1,类2...
如果一个类能够多继承,在继承的多个类中如果有两个一样的方法,当调用这个方法名的方法时,该调用哪个?
java支持多层继承(继承体系)
一个子类,可以有一个父类, 这个父类也可以有父类... 通过这样的继承,可以组成继承体系...
如果想用这个体系的所有功能用最底层的类创建对象,如果香烟这个体系的共性功能,看最顶层的类
注意事项:
1. 子类只能继承父类所有非私有的成员(成员方法和成员变量)
当父类的属性私有化之后,还可以通过get,set方法来实现调用,但是方法私有化之后就没有办法了
2. 子类不能继承父类的构造方法,但是可以通过super关键字去访问父类的构造方法
如果父类和子类中有同名的成员变量时,如果想要直接调用父类的成员变量时,可以直接使用super.成员变量名 。
3. 不要为了部分功能而去继承
4. 什么时候使用继承: 继承体现的是一种关系: xx 是 xxx 的父类,xxx属于xx
5. 当子类中出现于父类同名的变量,使用就近原则,子类有就不用父类的
6. 子类中的所有构造方法默认都会访问父类中空参的构造方法
因为子类会继承父类的数据,可能还会使用父类的数据
所以子类初始化前一定要完成父类数据的初始化。
其实,每一个构造方法的第一条语句默认都是super(),object类最顶层的父类,如果不写super();系统会默认加上
成员变量在继承中的特点:
在子类的成员方法中,如果想要访问成员变量(这个变量可能在父类中,也可能在子类中)的查找的顺序:
1. 子类的成员方法内部找,找到了执行,如果没有找到就 2;
2. 子类的成员变量中找,找到了执行. 如果没有找到就 3;
3. 父类的成员变量中找,找到就执行, 如果没有就报错。
顺序:子类成员方法没有->子类的成员变量->父类的成员变量中找 ->报错了...
☆ 子类在新建对象的时候会默认访问父类的无参构造
super()方法和this()方法
在子类继承父类的时候,调用子类的构造方法时默认调用super()方法,
子类的每一个构造方法的第一条语句默认都是super(),
super()会访问父类的无参构造方法,object类最顶层的父类,如果不写super();系统会默认加上
this()方法是用来调用本类的构造方法,注意,不能形成递归构造方法调用
注意:
super方法和this方法只能存在一个;
super(...)和this(...)必须放在构造方法的第一条语句,
注意:子类的构造方法调用前一定会调用父类的构造方法
代码块
概述:在java中使用 {} 括起来的代码被称为代码块
分类:根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程讲解)
应用:局部代码块:
在方法中出现,限定变量的生命周期,及早释放,提高内存利用率
构造代码块(初始化块)
在类中方法外出现,多个构造方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
静态代码块
在类中方法外出现,加了static修饰
在类中方法外出现,并加上static修饰,用于给类进行初始化,在加载的时候就执行,并且只执行一次
一般用于加载驱动
局部代码块
写在方法中的代码块
public class ArrCharTest {
public static void main(String[] args) {
{ // 这个{}里面的内容就是局部代码块,在执行完后 数据a就会释放掉,这要就提高了内存的利用率
int a = 10;
System.out.println(a);
}
}
}
构造代码块
定义在一个类中,但是在方法外,每创建一次对象就执行一次,优先于对象执行
public class StudentDemo {
// 属性
private String name;
private int age;
// 行为(局部方法)
public void Study(){
System.out.println("学生学习");
}
{
System.out.println("这里是构造代码块,每次创建对象都会先执行这里");
}
}
静态代码块
定义在一个类中,但是在方法外,有static修饰,只在类加载的时候加载
public class StudentDemo {
// 属性
private String name;
private int age;
// 行为(局部方法)
public void Study(){
System.out.println("学生学习");
}
static { // 只有在类加载的时候执行,主要用于初始化类中某些需要初始化的参数,一般用来加载驱动
System.out.println("这里是静态代码块,随着类的加载而加载");
}
}
面试题
public class FuziTest {
public static void main(String[] args) {
zi z = 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("子类构造方法");
}
}
输出结果: 父类静态代码块
子类静态代码块
父类构造代码块
父类构造方法
子类构造代码块
子类构造方法
方法重写
子类中出现了与父类中一模一样的方法时,在调用的时候后优先调用子类方法,这个就叫做重写,
但是可以通过super.方法名()来调用父类功能。
当子类需要用到父类的功能,而功能主体子类有自己特有内容时,
可以重写父类中的方法,这样,即沿袭了父类的功能,有定义了子类特有的内容
注意事项:
父类中私有方法不能被重写
因为父类私有方法子类根本就无法继承
子类重写父类方法时,访问权限不能更低
最好一值
父类静态方法,子类也必须通过静态方法进行重写
其实这个算不上方法重写,但是现象确实如此,静态只能覆盖静态
子类重写父类 方法的时候,最好申明一模一样
重载和重写的区别(overload与override的区别)
重载--overload ~~~~~ 重写--override
重载可以改变返回值类型,只看参数列表
方法重写:子类中出现了和父类中方法声明一模一样的方法,与返回值类型有关,返回值是一致(或者是字父类)的
方法重载:本类中出现的方法名一样,参数列表不同的方法,与返回值无关
子类对象调用方法的时候
先找子类本身,在找父类