本章学习目录
- 页外目录
--------------------------< 抽象类和接口 >------------------------- - 页内目录
一,继承的定义
二,方法的重写
三,方法的重载
四,super关键字
五,this关键字
六,构造器super()和this()
一,继承的定义(关键字extends)代码解释
- 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
- 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为,属于单继承机制。
二,方法的重写 override(存在于继承关系中)代码解释
特点:
- 有继承关系的两个类,父类中的方法不能满足子类需求时,需要子类自己将该方法实现, 在子类中可以根据需要对从父类中继承来的方法进行重写
- 方法的重写方法的声明部分一致(方法名相同,方法的返回类型相同,方法的参数列表相同,方法的异常抛出相同,方法的访问权限不能小于父类的权限),方法体不同
条件:
- 子类重写方法和父类被重写方法必须具有相同的方法名称,参数列表和返回类型
- 返回值类型和异常类型 子类小于等于父类
- 访问权限子类大于等于父类
- private修饰的方法不能重写
- static修饰的方法不能重写
- final修饰的方法不能重写
三,方法的重载(同名不同参在一个类中)代码解释
特点:
- 在一个类中,多个方法之间,方法名相同而参数列表不同(数量不同,类型不同,顺序不同)就叫方法重载,与方法的访问权限和返回类型无关;
条件
- 方法名相同
- 参数列表必须相同
- 方法的返回类型可以相同可以不同
- 仅仅返回类型不同,不能称为方法的重载
四,super关键字 代码解释
作用:
- super是直接父类对象的引用,可以通过super来访问父类中被子类覆盖的方法或属性(可以理解成:跳过当前类,去直接父类找,父类没有去更父类)
五,this关键字 代码解释
作用:
- this是当前类的一个对象的引用,表示本类中的属性或者方法
- 只能在对象方法中使用,不能在静态方法中使用
六,构造器 代码演示无参构造器; 代码演示有参构造器; 代码演示super; 代码演示this()
- 当我们使用子类构造器创建对象时,默认先初始化父类并调用父类的空构造器然后初始化自己并调用自己的空构造,然后再开始赋值对象的属性.
- 具体的类初始化过程:
父类的静态域->子类的静态域->父类的非静态域->父类的构造函数->子类的非静态域->子类的构造函数;规律就是 父类先于子类 静态的先于非静态的
其中静态域包含静态代码块与静态方法,谁在前面,则先执行谁。
非静态域同理- super();
调用直接父类的空构造(在方法的第一行)- super(参数);
调用直接父类的有参构造(父类没有空构造也可行)(在方法的第一行)- this();
调用本类的空构造(在方法的第一行)- this(参数);
调用本类的有参构造构造(在方法的第一行)
一,继承的代码解释 回到解释
public class Anmail{}
public class Monkey extends Anmail {}
二,方法的重写的代码解释 回到解释
public class Anmail{
public void play(){
System.out.println("父类的方法");
}
}
public class Monkey extends Anmail {
public void play(){
System.out.println("子类中重写的方法");
}
}
public class test {
public static void main(String[] args){
Monkey anmail=new Monkey();
anmail.play();
}
}
结果:
三,方法的重载的代码解释 回到解释
public class Anmail{
public String name;
public int age;
public void play(){
System.out.println("无参方法");
}
public void play(String name){
System.out.println("一个参数的方法");
}
public void play(String name,int age){
System.out.println("两个参数的方法");
}
}
四,super关键字的代码解释 回到解释
public class Anmail{
public void play(){
System.out.println("父类的方法");
}
}
public class Monkey extends Anmail {
public void play(){
super.play();//调用父类的play方法
System.out.println("子类中重写的方法");
}
}
public class test {
public static void main(String[] args){
Monkey anmail=new Monkey();
anmail.play();
}
}
结果:
五,this关键字的代码解释 回到解释
public class Monkey extends Anmail {
String name="齐天大圣";
public void say() {
System.out.println("子类中say方法");
}
public void play() {
this.say();
System.out.println(this.name+"子类中play的方法");
}
}
public class test {
public static void main(String[] args){
Monkey anmail=new Monkey();
anmail.play();
}
}
结果:
六,构造器的代码解释
- 无参构造器的执行 回到解释
public class Anmail{
public Anmail() {
System.out.println("这是父类的空构造");
}
}
public class Monkey extends Anmail {
public Monkey() {
System.out.println("这是子类的空构造");
}
}
public class test {
public static void main(String[] args){
Monkey monkey=new Monkey();
System.out.println(monkey.toString());//本类和父类都没有执行的是object的tostring
}
}
结果:
- 有参构造的执行 回到解释
public class Anmail{
public String name;
public int age;
public Anmail() {
System.out.println("这是父类的空构造");
}
public Anmail(String name, int age) {
this.name = name;
this.age = age;
System.out.println("这是父类的有参构造");
}
}
public class Monkey extends Anmail {
public String color;
public Monkey() {
System.out.println("这是子类的空构造");
}
public Monkey(String color) {
this.color = color;
System.out.println("这是子类的有参构造");
}
public Monkey(String name, int age, String color) {
super(name, age);//调用父类的有参构造(必须在第一行)
this.color = color;
System.out.println("这是子类的调用父类的有参构造");
}
}
public class test {
public static void main(String[] args){
Monkey anmail=new Monkey("小明",18,"白色");
System.out.println(anmail.toString());
}
}
结果:
- super()的演示 回到解释
public class Anmail {
public String name;
public int age;
public Anmail() {
System.out.println("这是父类的空构造");
}
public Anmail(String name, int age) {
this.name = name;
this.age = age;
System.out.println("这是父类的name,age有参构造");
}
}
public class Monkey extends Anmail {
public String color;
public String hobby;
public Monkey() {
System.out.println("这是子类的空构造");
}
public Monkey(String name, int age, String color) {
super(name, age);//调用父类的构造方法,必须在第一行
this.color = color;
System.out.println("这是子类的调用父类的name,age和自己的color的有参构造方法");
}
}
public class test {
public static void main(String[] args){
Monkey anmail=new Monkey("大胜",18,"red");
System.out.println(anmail.toString());
}
}
结果:
- this()的演示 回到解释
public class Anmail {
public String name;
public int age;
public Anmail() {
System.out.println("这是父类的空构造");
}
public Anmail(String name, int age) {
this.name = name;
this.age = age;
System.out.println("这是父类的name,age有参构造");
}
}
public class Monkey extends Anmail {
public String color;
public String hobby;
public Monkey() {
System.out.println("这是子类的空构造");
}
public Monkey(String name, int age, String color) {
super(name, age);//调用父类的构造方法,必须在第一行
this.color = color;
System.out.println("这是子类的调用父类的name,age和自己的color的有参构造方法");
}
public Monkey(String name, int age, String color, String hobby) {
this(name, age, color);//调用本类中的构造方法,必须在第一行
this.hobby = hobby;
System.out.println("这是子类调用子类中的参数为name,age,color构造方法和自己的hobby有参构造方法");
}
}
public class test {
public static void main(String[] args){
Monkey anmail=new Monkey("大胜",18,"red");
System.out.println(anmail.toString());
Monkey anmail1=new Monkey("大胜",18,"red","大闹天宫");
System.out.println(anmail1.toString());
}
}
结果: