面向对象(二):继承+多态+异常

1.继承

1.1 概述

继承是面向对象最显著的一个特性。
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类/超类/基类。
这种技术使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。
提高复用性:只要继承父类,就能有一样的功能

1.2 特点

1、 使用extends关键字
2、 相当于子类把父类的功能复制了一份
3、 java只支持单继承
4、 继承可以传递(爷爷,儿子,孙子的关系)
5、 不能继承父类的私有成员
6、 继承多用于功能的修改,子类可以拥有父类的功能的同时,进行功能拓展
7、 像是is a 的关系(强制的依赖关系)

测试一:
人门

这里是引用

测试二:
继承可以传递(爷爷,儿子,孙子的关系)

这里是引用

1.3 super关键字(类似this关键字)

1,super表示父类对象的一个引用.底层会帮你创建一个父类对象
2,super在子类里使用,用来调用父类的功能
3,如果要在构造方法中,使用super关键字,必须是一条语句

1.4 方法重写(override)

–1,发生在继承结构中
–2,当子类继承了父类后,想修改父类的原有功能,这时就发生了方法重写
–3,要求:子类中的方法签名/方法声明 必须 和父类的 一模一样
–4,方法声明: ? 返回值 方法名(参数列表)
–5,注意在子类中想要重写父类的方法,必须有足够的权限 >= 父类权限

1.5 继承中的用法

1.5.1 成员变量的用法------->supper

这里是引用

1.5.2 成员方法的用法
package cn.tedu;
//测试继承中的成员方法
public class Test01 { 
	public static void main(String[] args) {
		Zi z = new Zi();
		z.eat();//重写之前使用父类的功能;重写之后使用自己的功能
		z.play();//z子类自己的功能扩展
	}
}
class Fu{
	public void eat() {
		System.out.println("爸爸在吃肉肉");
	}
}
class Zi extends Fu{
	//1.子类可以使用父类的功能
	//2.子类可以进行功能扩展
	public void play() {
		System.out.println("打台球");
	}
	//3.子类还可以修改父类的原有功能--->方法的重写,要求方法的声明必须和父类保持一致
	@Override
	public void eat() {
		super.eat();//调用父类的方法;虽然发生了方法的重写,但对父类的功能没有任何影响
		System.out.println("儿子在喝汤");
	}
}
1.5.3 构造方法的用法

小结:
1,子类的构造方法里 ,隐藏着 super(),也就是说,会自动调用 父类的无参构造
2,构造方法执行顺序: 父类的构造 > 子类的构造
3,如果父类中只提供了含参构造,此时,父类里就没有无参构造了.子类的super()就报错,只能调用父类的含参构造

package cn.tedu;
//测试继承中的构造方法
public class Test01 { 
	public static void main(String[] args) {
		//2,创建子类对象时,会自动调用 子类的构造方法....但是藏着super(),,,就先去调用了父类的构造方法
		Zi2 zi = new Zi2();
		//5,创建子类对象时,发生两件事:  先把父类对象创建好,然后才去创建的子类对象..因为先执行父类的构造方法然后才执行子类的构造方法.
		
	}
}
//创建父类
class Fu2{
	//提供构造方法
//	public Fu2() {
//		System.out.println("父类的 无参构造方法");
//	}
	//4.1, 子类会默认调用父类的无参构造.但是,如果父类没有无参构造呢???---只能调用 父类的含参构造
public Fu2(String name) {
	System.out.println("父类的 含参构造方法"+name);
	}
}
//创建子类
class Zi2 extends Fu2{
	//提供构造方法
	public Zi2() {
		//1,子类的构造方法中,  隐藏了 一行代码  super()  ,  去调用了父类的无参构造.
		//3,如果在构造方法中,出现super关键字,必须是第一条语句!!!
//		super();
		
		//4, 子类会默认调用父类的无参构造.但是,如果父类没有无参构造呢???---只能调用 父类的含参构造
		super("jack");
		System.out.println("子类的 无参构造方法");
	}
	
}

1.6 this和super的区别

1、 this代表本类对象的引用,super代表父类对象的引用。
2、 this用于区分局部变量和成员变量
3、 super用于区分本类变量和父类变量
4、 this.成员变量 this.成员方法() this(【参数】)代表调用本类内容
5、 super.成员变量 super.成员方法() super(【参数】),代表调用父类内容
6、 this和super不可以同时出现在同一个构造方法里,因为他们两个只要出现都得放在第一行,同时出现的话,到底第一行放谁呢。

1.7 重写与重载的区别(Overload和Override的区别)

1、重载:是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
2、重写:是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型
3、重写是父类与子类之间多态性的一种表现
4、重载是一类中多态性的一种表现

2.static 关键字

2.1概述

用于修饰成员(成员变量和成员方法)

这里是引用

2.2 测试

测试一:

package cn.tedu;
//测试static
public class Test01 { 
	public static void main(String[] args) {
		Person p = new Person();
		p.play();
		System.out.println(p.name);
		//2.如何调用静态资源
		//2.1 静态资源的访问方式1: 可以通过对象的方式调用(不提倡).
		p.show();
		System.out.println(p.age);
		//2.2 静态资源的访问方式2: 最好使用静态方式访问静态资源 --- 类名直接调用
		Person.show();
		System.out.println(Person.age);
		//3.静态资源是全局的共享资源,在多个对象间共享
		Person p2 = new Person();
		Person p3 = new Person();
		p2.age=10;
		System.out.println(p3.age);//10,说明age在p2,p3间共享
	}
}
class Person{
	//普通资源
	String name;
	public void play() {
		System.out.println("这是普通方法");
	}
	
	//静态资源
	//1.static可以用来修饰成员变量和成员方法,修饰方法时可以放在修饰符(public)的前面也可以放在修饰符的后面
	static int age;
	static public void show() {
		System.out.println("这是静态方法");
	}
}

测试二:
非静态资源可以任意调用
静态资源只能调用静态资源

这里是引用

3.代码块—>静态代码块,构造代码块,局部代码块

3.1 概述

这里是引用
静态资源只会加载一次,会随着类的加载而加载,第一时间加载到内存中,并一直贮存在内存中,直到类消失,静态资源才消失

3.2 测试

这里是引用

3.3 总结

执行循序:静态代码块>构造代码块>局部代码块

总结:
1,静态代码块 : 作用是第一时间加载+只加载一次 + 常用来完成项目的初始化 + 触发的时间节点是当类被第一次加载时
2,构造代码块 : 作用是提取构造方法的共性 + 触发的时间节点是当创建对象时
3,局部代码块 : 作用是控制变量的作用范围 + 触发的时间节点是方法调用时
4,执行顺序 : 当类第一个被加载时,立刻加载静态代码块…当类被实例化时会加载构造代码块和构造方法…当方法被调用时加载局部代码块

4. final 关键字

4.1 概述

这里是引用

4.2 测试

package cn.tedu;
//测试final
public class Test01 { 
	public static void main(String[] args) {
		FinalDemo demo = new FinalDemo();
//		demo.name = "" ; The final field FinalDemo.name cannot be assigned
		System.out.println( demo.NAME );//访问静态资源方式1
		System.out.println(FinalDemo.NAME);//访问静态资源方式2
		demo.eat();
	}
}
//1 , 被final修饰的类,是最终的类 --- 不能被继承!!!  The type ZiFinal cannot subclass the final class FinalDemo
//final class FinalDemo{ 
class FinalDemo{
	
	//3,final修饰的成员变量是常量---值不能被修改!!! The final field FinalDemo.name cannot be assigned
	//常量通常为了方便外界调用,都会被static修饰.可以直接被类名访问
	static final String NAME = "玛利亚" ; 
	
	//2 , final修饰的方法是最终方法 --- 不能被重写(可以继承使用,不能被重写修改)!!!Cannot override the final method from FinalDemo
//	final public void eat() {
	public void eat() {
		System.out.println("正在吃饭");
	}
}
class ZiFinal extends FinalDemo{
	//方法重写
	public void eat() {
		System.out.println(123);
	}
}

5.多态

5.1 概述

这里是引用
在这里插入图片描述
在这里插入图片描述

5.2 入门测试

这里是引用

5.3 多态的使用

这里是引用

测试:

这里是引用

6. 拓展

这里是引用

7. 异常

7.1 概述

这里是引用

7.2 异常的继承结构

声明:
这里主要研究exception
exception是程序中所有异常的父类

这里是引用

7.3 暴露异常

异常一:算术运算异常

这里是引用

异常二:类型不匹配

这里是引用

7.4 异常处理

7.4.1 捕获异常

把程序中会出现的异常自己处理掉

这里是引用

7.4.2 抛出异常

把程序中的异常交给调用者来处理

这里是引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值