JavaDay07-08-09:面向对象:继承、多态

继承

定义

extends,子类继承父类,直接继承父类的属性与方法,访问修饰符不能为私有。

  • java中只能有一个父类,可以有多个子类。
  • 继承后直接拥有父类的属性与方法(不包含构造方法),当属性的访问修饰符为private时,需要用get和set方法。
  • 子类可以重写由父类继承过来的方法,重写后父类子类调用该方法都为重写后的方法,父类以前定义的方法直接被覆盖(替换)。
  • 创建子类对象必须先创建父类对象。
    当创建了子类的构造方法后,会先创建一个无参的父类的构造方法,因此当调用子类的构造方法时先调用父类的构造方法。
  • object万类之祖,如果一个类没有定义它的父类,则默认继承一个JDK定义的Object类
	public Person(){
		System.out.println("--- new Person--");
	}
	public Student(){
	// 先调用父类的无参构造方法
		System.out.println("---  new student---");
	}
	Student s = new Student();

输出结果为:
— new Person–
— new student—

this与super关键字

  • super表明调用父类的内容
    super(参数列表)表示调用父类的构造方法,创建子类的时候会调用子类的构造方法,会先偷偷执行super()。使用时需要放在第一行。
  • this表明调用当前对象,后面可以跟属性或方法。
    this(参数列表)表示调用本类的构造方法,使用时需要放在第一行。
  • this与super都需要放在第一行,所以不能同时使用。

重写与重载

  • 重写:子类可以重写由父类继承过来的方法。
    1.返回类型:基本数据类型必须保持一致
    引用数据类型:父类的返回类型>=子类的返回类型
    2.方法名必须保持相同
    3.参数列表必须相同
    4.父类的访问修饰符与异常>=子类

  • 重载:对一种功能有多种实现方式。
    1.方法名必须相同
    2.参数列表必须不同

final关键字

修饰属性:

  • final修饰属性的内容必须进行初始化,不能更改
  • 初始化:1.定义属性直接赋值 2.在构造器中进行初始化

修饰方法:
表示这个方法不能被重写

修饰类:
表示这个类不能被继承

强转

具有继承关系的类可以进行强转:

  • 强转划分接线:
    假设Person为父类,Student为子类,BigStudent为孙类。
    关系线:Object---->Person---->Student---->BigStudent
    Person p = new Student();
    在Student后面划分界线:Object---->Person---->Student–|-->BigStudent,p可以强转成Student以左的类。
    Student s = (Student) p;父转子
    Person p1 = (Person)s
    当不满足此条件时会运行时异常 ClassCastException。
  • String与Object之间也可以转(Object是万类之祖)
String ss = new String();
Object obj = (Object)ss;

//Person跟String没有继承关系,所以编译异常
Person obj = new BigStudent();//编译异常
String ss = (String) obj; //编译异常
  • instanceof 用来判断对象是什么类型
    用法:对象 instance 类。
    意义:这个对象是否是这个类,返回一个boolean类型的值。
    编译错误:表示没有继承关系。
    false:表示不满足强转条件。
    true:对象能强转成这个类型。
public static void main(String[] args) {

	method(new Person());//结果:false
	method(new Student());//结果:true并且执行study方法
	method(new Object());//编译错误!!
}

public static void method(Person p) {

	System.out.println(p instanceof Student);
	if (p instanceof Student) {
		((Student) p).study();
	}
}

多态

即多种表现形态,父类对象引用子类实例,需要父类对象的时候给个子类实例Person p = new Student();

  • 调用方法时:调用向左看,执行的方法向右看
    方法先查找子类的方法,如果子类没有再查找父类
Person p  = new Student();
p.eat();//此时的eat方法为子类中重写的eat方法
  • 调用属性时:调用向左看,执行向左看
System.out.println(p.name);
//输出的name为父类中给的初始值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值