继承
java三大特性(封装,继承,多态)之一,其中继承是多态的前提,继承是父类对之类共性的抽取,在继承中子类能够拿到父类的所有可见的东西
public class Father{}
public class Son extends Father{} //son 继承了 father
在继承中父类可被称为超类或基类,子类可被称为派生类
注意继承的层数不要太多,一般三层就是算多的了
继承如果滥用的话,会使你在编写某个类的时候,这个类很大一部分并不在本类,有一些问题你很难注意到
继承的语法
- 父类
public class 父类的类名{属性与 方法 } - 子类
public class 子类名 extends 父类名{}
子类访问父类的属性
public class Father{
public String name;
public void run(){}
}
public class Son extends Father{} //son 继承了 father
public class Test{
public static void main(String[] args){
Son son = new Son();
son.name = "Tom";
}
}
//创建子类时,会先创建一个父类对象,然后创建子类对象,son指向了两个对象
//通过子类对象调用方法或成员变量时,会先看子类有没有
//子类有就用子类的,子类没有就用父类的
//例如给name赋值,是改变的父类对象中的name属性,子类对象没有name属性
//这和变量的作用域相似
//继承中访问子类对象的成员变量,方法
//和访问父类对象中公有的成员变量,方法是一样的
//都是 对象名.变量或方法名
//父类对象中的私有属性或方法,子类对象无法调用
//但是可以通过调用父类对象的公有方法,调用父类对象的私有部分
重写和重载
- 重载
在同一个类里,可以方法名相同,参数列表或者是参数的个数不同的方法,这就是方法的重载,这可以产生通过一个方法处理多种数据类型的效果
注意返回值不同不是重载 - 重写
在继承关系中,子类与父类方法的方法名相同,参数也相同,称为子类重写了父类的方法,这样子类借用父类方法,扩展,增强和特化功能
3.方法重写注解 @Override
表示重写,用于编译判断是否是重写的方法
方法重写需要主要事项:
- 重写方法的返回值类型不能严于父类
- 重写的方法的访问修饰符不能严于父类
- Object 表示所有类的直接爸爸或者是间接爸爸
子类实例化
在继承中,子类实例化的时候,一定会先走父类的构造器,构造父类对象
- 如果父类没有提供构造方法,默认系统会生成一个
- super(参数列表),可以调用父类的构造方法 ,如果父类只有有参构造,那么子类也必须先调用父类的有参构造
- 如果父类有无参构造,子类不调用父类的有参构造也不会报错
- 子类可以调用父类的任意的构造
- super()也必须放在构造函数的第一行
- this()与super()不可能同时存在
- 构造方法调用避免死循环
this与super之间的区别
public class Father{
public Father(String name){}
}
public class Son extends Father{
public Son(){
super(name);
//调用父类构造器生成父类对象
//此语句必须是第一行语句,注释或空行忽略
//因为this()是调用本类构造器,也必须在第一行
//因此this() 和 super() 不能共存
}
}
-
this()
- 既可以调用本类的无参构造,也可以调用其有参构造,
- 不可以同时调用本类的有参构造和无参构造
- this()只能放在构造里的第一行
-
this()语法
- this()可以访问属性 this.属性名
- this()可以访问方法 this.方法名
- this()访问构造 this(参数列表)
-
this()和super()
- this,表示当前对象的引用.super,表示父类对象的引用
- this,可以调用子类的属性与方法,还能调用父类的属性与方法(也就是子类不存在这个属性与方法的时候就调用父类),super只能调用父类的
- this() 表示表示调用的本类的构造,super()表示调用父类的构造
子类调用父类
- 父类私有的属性与方法,子类都获取不到
- 父类构造方法不能够被继承,但是可以被子类构造方法调用
继承的好处和坏处
好处
- 可维护性比较高
- 可扩展性比较高
- 是多态的前提
坏处
使类与类之间的联系度更高,如果修改父类,子类也会发生相应的变化
java继承的特点
- java只支持单继承,也就是只能存在一个直接父类
- java支持多层继承
- 一个父类可以存在多个子类
代码块
public class Student{
static{
//静态代码块
}
{
//构造代码块
}
public void study(){
{
//局部代码块
}
}
}
-
局部代码块
- 位置: 是在方法里
- 作用:在局部代码的变量的生命周期比较短,节省内存资源
- 注意点:局部代码块申明的变量,出了这个代码块之后就不能获取了 (比较少用)
-
构造代码块
- 位置: 在类里,在方法外
- 作用: 用于给成员变量来进行赋值,或者是每个构造方法都要执行的方法
- 描述
- 构造代码块是由jvm执行的(比较少用)
- 只要实例化对象就会走构造代码块
- 构造代码块是在构造之前执行
-
静态代码块
- 位置:在类里,在方法外
- 作用
- 给静态变量赋值
- 加载配置文件 加载驱动
- 语法: static{}
- 描述:
- 静态代码块是随着类的加载而加载
- 静态代码只走一次 3.静态代码块优先加载
4.同步代码块: synchronized (){} 作用:保证多线程安全
final 关键字
- 可以修饰局部变量
只能被赋值一次 - 可以修饰成员变量
不能被修改 - 可以修饰方法
不能被重写 - 可以修饰类
不能被继承