Java——面向对象(下)

面向对象(下)

1.类的继承

在现实生活中,继承一般指的是子女继承父辈的财产。在程序过程中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。例如,猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物。
在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新的类被称为子类,现有的类被称为父类,子列会自动拥有父类的属性和方法。在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。

继承使用的关键字
	extends
格式:
	class A extends B {
	
	}
	A类是B类的一个子类
	B类是A类的唯一父类
	Java中的继承是一个单继承模式

基本要求:
	1. 子类继承父类之后,可以使用父类的非私有化成员变量和成员方法
			【非私有化成员】
	2. 子类不能继承得到父类的私有化内容。

子类可以对父类的方法进行重写,但是方法名要与所重写的父类方法名一致。
class Father {
	// public修饰的公开成员变量name
	public String name;
	
	// private修饰的私有化成员变量salary
	private double salary;

	public Father() {
		System.out.println("Father类构造方法");
	}

	public Father(String name, double salary) {
		this.name = name;
		this.salary = salary;
	}
	
	/*
	 * public修饰的公开方法
	 */
	public void game() {
		System.out.println("黄金矿工");
	}
	
	private void testPrivate() {
		System.out.println("父类私有化方法");
	}
}

/*
 * Son类是Father类的一个子类
 * Father类是一个Son类的唯一父类
 */
class Son extends Father {
	int age;
	
	public Son() {
		System.out.println("Son类的构造方法");
	}
	
	public void work() {
		System.out.println("我是一个学生");
	}
}

public class Demo1 {
	public static void main(String[] args) {
		Son son = new Son();
		
		// 可以使用自定义的成员变量和成员方法
		son.age = 16;
		son.work();
		
		// 通过继承之后,可以获取到父类中的非私有化成员变量和成员方法
		son.name = "张三";
		son.game();
	}
}
super关键字:
		1.使用super关键字访问父类的成员变量和成员方法。
			具体格式如下:
				super.成员变量
				super.成员方法(参数)
		2.使用super关键字访问父类的构造方法
			格式:
				super(参数)

2.接口

2.1生活中的接口

生活中比较常见的接口:
USB接口,国标插座,Type-C, 3.5MM, ARJ45, Lighting接口, HDMI, VGA, SATA, M.2, DisplayPort,雷电口, PCI-E

这些接口有什么作用?
USB接口 USB-A
1. 鼠标连接,键盘连接,声卡连接,麦克风,摄像头,补光灯,U盘,移动硬盘
2. 规范,都是USB设备
3. 设备本身决定了,要做什么事情。

2.2 Java中接口使用

格式:
interface 接口名 {
成员变量
成员方法
}

类【遵从】接口
implements
class 类名 implements 接口 {
}

接口中成员变量和成员方法缺省属性原因
从生活角度
USB接口规定了尺寸和连接方式,但是该接口做什么内容,是由设备决定的!!!
尺寸是固定 ==> 成员变量 缺省属性是public static final

设备做什么事情,不管但是规定连接方式 ==> 成员方法,需要设备自己完成
缺省属性 public abstract修饰

2.3接口使用总结
  1. 接口中的
    成员变量缺省属性 public static final
    成员方法缺省属性 public abstract

  2. 一个非abstract类遵从interface接口,需要强制完成接口中所有缺省属性为public abstract的成员方法

  3. 接口和接口之间,允许使用extends关键字继承,并且允许一个接口,继承多个接口
    interface A extends B, C
    生活中: 协议直接的向下兼容问题

  4. 接口中可以使用default关键字修饰方法,default方法拥有方法体,可以认为是非强制实现方法,不要求遵从接口的非abstract强制实现,JDK1.8新特征

/*
 * 接口演示
 */
/**
 * 接口A
 *  
 * @author Anonymous
 */
interface A {
	// 【缺省属性】public static final
	int num = 10;
	
	// 【缺省属性】public abstract
	void test();
}

interface B {
	void testB();
}

/**
 * TypeA 类遵从接口A
 * 
 * @author Anonymous
 */
class TypeA implements A, B {

	@Override
	public void test() {
		System.out.println(num);
		System.out.println("TypeA遵从接口A,实现接口A中缺省属性为abstract的成员方法");
	}
	
	@Override
	public void testB() {
		System.out.println("TypeA同时遵从接口B,实现接口B中缺省属性为abstract的成员方法");
	}
	
}

public class Demo1 {
	public static void main(String[] args) {
		TypeA typeA = new TypeA();
		typeA.test();
	}
}

3.多态

在Java中,允许使用一个父类类型的变量来引用一个子类类型的对象,根据被引用子类对象的特征的不同,得到不同的运行结果。接下来通过一个案列来演示多态的使用。

/*
从生活中映射USB接口
	interface USB
		规定USB设备必须完成的方法
		void connect();

鼠标类 implements USB 
	鼠标是一个USB设备,必须完成connect方法
键盘类 implements USB
	键盘是一个USB设备,必须完成connect方法
 */
/**
 * USB接口
 * @author Anonymous
 *
 */
interface USB {
	/**
	 * 要求所有的USB设备,必须完成的方法,告知USB接口连接之后完成的
	 * 功能是什么
	 */
	void connect();
}

/**
 * 鼠标类,遵从USB接口,实现connect方法
 * 
 * @author Anonymous
 */
class Mouse implements USB {
	@Override
	public void connect() {
		System.out.println("鼠标连接USB接口,控制光标");
	}
}

/**
 * Logi类,继承Mouse鼠标类
 * 		1. 鼠标设备
 * 		2. Logi间接遵从USB接口,是一个USB设备
 * @author Anonymous
 *
 */
class Logi extends Mouse {
	@Override
	public void connect() {
		System.out.println("Logi Master 2S");
	}
}

/**
 * 键盘类,遵从USB接口,实现connect方法
 *
 * @author Anonymous
 */
class Keyboard implements USB {
	@Override
	public void connect() {
		System.out.println("键盘连接USB接口,输入设备");
	}
}

/**
 * IKBC继承Keyboard类
 * 		1. 键盘设备
 * 		2. 间接遵从USB接口,也是一个USB设备
 * @author Anonymous
 *
 */
class IKBC extends Keyboard {
	@Override
	public void connect() {
		System.out.println("IKBC C87 静音红轴");
	}
}

/**
 * PC电脑类,使用USB接口,这里需要通过USB接口连接一个USB设备
 * 
 * @author Anonymous
 */
class PC {
	/**
	 * 电脑类连接USB接口连接方法,这里需要的是一个USB设备
	 * 
	 * @param usb USB接口对应的设备
	 */
	public void usbConnect(USB usb) {
		// usb设备执行connect方法
		usb.connect();
	}
}

public class Demo1 {
	public static void main(String[] args) {
		
		// 电脑中有一个方法是使用USB接口连接USB设备
		PC pc = new PC();
		
		// 鼠标和键盘都是USB设备
		Mouse mouse = new Mouse();
		Keyboard keyboard = new Keyboard();
		
		// 电脑需要通过USB接口连接USB设备,mouse鼠标就是USB设备
		pc.usbConnect(mouse);
		// keyboard键盘也是USB设备
		pc.usbConnect(keyboard);
		
		// 传入一个Logi类对象
		pc.usbConnect(new Logi());
		// 传入一个IKBC类对象
		pc.usbConnect(new IKBC());
	}
}

4.异常(Exception)

在这里插入图片描述
从这个图中就可以看出
1.运行时异常是数组越界、空指针、类转换错误之类的异常,解决方法是修 改代码
2.而其他异常,也就是已检查异常,则是需要抛出或者捕捉
转载于:https://www.cnblogs.com/dolphin007/p/4446105.html

4.1异常处理
捕获异常:
	try - catch 结构
try - catch - finally 结构 后期设计到资源问题,再讲解

格式:
	try {
		// 有可能出现异常代码
	} catch (/* 对应处理的异常对象 */) {
		// 处理方式
	}
public class Demo3 {
	public static void main(String[] args) {
		test(10, 2, null);
	}
	
	public static void test(int num1, int num2, int[] arr) {
		int ret = 0;
		
		try {
			ret = num1 / num2;
			System.out.println("测试代码");
			arr[0] = 10;
		} catch (ArithmeticException e) {
			e.printStackTrace();
		} catch (NullPointerException e) {
			e.printStackTrace();
		}
		
		System.out.println("ret:" + ret);
	}
}
4.2抛出异常
throw
	在方法内抛出异常
throws
	在【方法声明】位置,告知调用者当前方法有哪些异常抛出
	声明的异常需要生成对应的文档注释
/*
 * 抛出异常总结:
 * 		1. 一个代码块内,有且只能抛出一个异常
 * 		2. 从throw位置开始,之后的代码不在运行
 * 		3. 代码中存在使用throw抛出异常,在方法的声明位置必须告知调用者这里有什么异常
 *	
 */
public class Demo4 {
	// 调用带有异常抛出的方法,如果选择继续抛出需要在当前方法的声明位置
	// 告知其他调用者,这里有什么异常抛出
	public static void main(String[] args) 
			throws NullPointerException, ArithmeticException {
		// 调用一个带有异常抛出的方法
		
		// 捕获处理
		try {
			test(10, 2, null);
		} catch (ArithmeticException e) {
			System.out.println(e.getMessage());
		} catch (NullPointerException e) {
			System.out.println(e.getMessage());
		}
		
		
		// 可以继续抛出异常
		test(10, 0, null);
	}
	
	/**
	 * 测试方法
	 * 
	 * @param num1 int类型
	 * @param num2 int类型
	 * @param arr int类型数组
	 * @throws ArithmeticException 除数不能为0
	 * @throws NullPointerException 操作数组null地址异常
	 */
	public static void test(int num1, int num2, int[] arr) 
			throws ArithmeticException, NullPointerException {
		// 参数合法性判断
		/*if (0 == num2 || null == arr) {
			System.out.println("Input Parameter is Invalid!");
			return;
		}*/
		// 抛出异常方式来处理当前的参数合法性判断
		if (0 == num2) {
			// 有可能会导致算术异常
			throw new ArithmeticException("算术异常");
		}
		
		if (null == arr) {
			// 存在数组操作空指针异常
			throw new NullPointerException("数组空指针异常");
		}
		
		System.out.println(num1 / num2);
		arr[0] = 10;
	}
}
发布了4 篇原创文章 · 获赞 3 · 访问量 170

猜你喜欢

转载自blog.csdn.net/weixin_44690301/article/details/104443589