使用面向对象的思想开发程序的好处
1.客户和软件设计开发人员之间、软件设计开发人员内部交流更加顺畅
2.提高软件设计和开发效率
构造函数
作用:大多用于数据的初始化
访问修饰符 构造方法名 ( ) {
//初始化代码
}
方法名与类名相同,可以附带参数
类的封装
概念:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
好处:
1.隐藏类的实现细节
2.只能通过规定方法访问数据
3.方便修改实现
4.方便加入控制语句
步骤:
this关键字使用
1.调用属性
this.health = 100;
this.name = “大黄”;
2.调用方法
this.print();
3.调用构造函数(必须在构造函数中使用且必须是第一条语句)
this();
this(“小黑”,100,100,“雄”);
对象的继承
使用关键字extends
例子:
//父类
class Pet {
//公共的属性和方法
}
//子类继承父类
class Dog extends Pet {
//子类特有的属性和方法
}
注意:子类不会继承父类的构造方法
1.子类访问父类成员
使用super关键字,super代表父类对象
1.1访问父类构造方法
super();
super(name);
1.2访问父类属性
super.name;
1.3访问父类方法
super.print();
super不能访问父类的private成员
2.访问修饰符protected
可以修饰属性和方法
本类、同包、子类可以访问
3.访问修饰符总结
4.多重继承关系的初始化顺序是怎样的
当new一个子类时,执行顺序如下:
父类属性->父类构造方法->子类属性->子类的构造方法
5.方法重写的规则
1.方法名相同
2.参数列表相同
3.返回值类型相同或者是其子类;
4.访问权限不能严于父类
6.抽象类abstract
1.Java中也使用抽象类,限制实例化
例子:
public abstract class Pet {
}
2.abstract也可用于方法——抽象方法
2-1.抽象方法没有方法体
2-2.抽象方法必须在抽象类里
2-3.抽象方法必须在子类中被实现,除非子类是抽象类
7.final用法
1.修饰的类,不能再被继承
2.修饰的方法,不能被子类重写
3.修饰的变量将变成常量,只能在初始化时进行赋值
多态
1.如何实现多态
1.编写父类
2.编写子类,子类重写父类方法
3.运行时,使用父类的类型,子类的对象
Pet pet = new Dog();(自动类型转换)pet可以调用父类Pet与Dog共有的方法,无法调用Dog独有的方法
Dog d=(Dog) pet;(强制类型转换,将pet强制转为Dog类)
instanceof运算符
instanceof通常和强制类型转换结合使用
例子:
public class Master {
public void play(Pet pet){
if (pet instanceof Dog) { //如果传入的是狗狗
Dog dog = (Dog) pet;
dog.catchingFlyDisc();
}else if (pet instanceof Penguin) { //如果传入的是企鹅
Penguin pgn = (Penguin) pet;
pgn.swimming();
}
}
}
2.实现多态的两种形式
使用父类作为方法形参实现多态
使用父类作为方法返回值实现多态
接口
关键字 interface
public interface MyInterface {
public void foo();
//其他方法
}
注意:里面所有的方法都是公有抽象的方法
接口的特性
1.接口不可以被实例化
2.实现类必须实现接口的所有方法
3.实现类可以实现多个接口
4.接口中的变量都是静态常量
5.无构造方法
例子:
1.编写接口
public interface UsbInterface {
/**
* USB接口提供服务。
*/
void service();
}
2.实现接口
public class UDisk implements UsbInterface {
public void service() {
System.out.println("连接USB口,开始传输数据。");
}
}
3.使用接口
UsbInterface uDisk = new UDisk();
uDisk.service();
面向接口编程
1.关心实现类有何能力,而不关心实现细节
2.面向接口的约定而不考虑接口的具体实现
异常
使用try-catch块捕获异常
public void method(){
try {
// 代码段(此处不会产生异常)
} catch (异常类型 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
异常对象常用的方法
1.void printStackTrace()
作用:输出异常的堆栈信息
2.String getMessage()
作用:返回异常信息描述字符串,是printStackTrace()输出信息的一部分
常见的异常类型
异常类型 | 说明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算术错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问 null 对象成员 |
ClassNotFoundException | 不能加载所需的类 |
IllegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,如把"abc"转换成数字 |
在try-catch块后加入finally块
1.是否发生异常都执行
2.不执行的唯一情况
存在return的try-catch-finally块
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
} catch (异常类型 ex) {
// 对异常进行处理的代码段3
return;
}finally{
// 代码段 4
}
}
处理过程与此类似
引发多种类型的异常
1.排列catch 语句的顺序:先子类后父类
2.发生异常时按顺序逐个匹配
3.只执行第一个与异常类型匹配的catch语句
声明异常
声明多个异常用逗号隔开
public static void divide() throws Exception {
//可能出现异常的代码
}
抛出异常
除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
public class Person {
private String name = ""; // 姓名
private int age = 0; // 年龄
private String sex = "男"; // 性别
public void setSex(String sex) throws Exception {
if ("男".equals(sex) || "女".equals(sex))
this.sex = sex;
else {
throw new Exception(“性别必须是\"男\"或者\"女\"!");//抛出异常
}
}
}