Day6.面向对象编程——java入门
1.什么是面向对象编程(Object-Oriented Programming,OOP)
- 本质:以类的方式组织代码,以对象的组织(封装)数据。
- 抽象
- 三大特性:
- 封装
- 继承
- 多态
- 从认识论角度考虑是现有对象后有类,对象,是具体的事物。类,是抽象的,是对象的抽象。
- 从代码运行角度考虑是先有类后有对象。类是对象的模板。
2.类与对象的关系
- 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但并不能代表某一个具体事物
- 对象是抽象概念的具体实例
- 张三就是人的一个具体实例
- 能购体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念
3.创建与初始化对象
-
使用new关键字创建对象
- 使用new关键字创建的时候,除了分配内存空间,还会给创建的对象进行初始化以及对类中构造器的调用
- 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点:
- 1.必须和类的名字相同
- 2.必须没有返回类型,也不能写void
-
构造器必须掌握
示例:
// java -- >class public class Person { // 一个类及时什么都不写,它也会存在一个方法 // 显示的定义构造器 String name; // 实例化初始值 // 1.使用new关键字,本质是在调用构造器 // 2.用来初始化值 public Person(){ } //有参构造:一旦定义有参构造,无参就必须显示定义 public Person(String name){ this.name = name; } }
4.对象的引用
-
引用类型: 基本类型(8)
对象是通过引用来操作的:栈—>堆
5.封装
-
通常,应禁止直接访问一个对象中数据的实际表示,而应通过 操作接口来访问,这成为信息隐藏
-
关键:属性私有,get/set
-
优势: 1.提高程序的安全性,保护数据 2.隐藏代码的实现细节 3.统一接口 4.系统可维护增加了
6.继承
- 继承的本质是对某一批类的抽象
- 继承是类和类之间的一种关系。除此之外,还有依赖、组合、聚合等
- 继承关系的两个类,一是子类(派生类),一是父类(基类)。子类继承父类,使用关键字extends来表示
- 子类和父类之间,从意义上讲应该具有“is a”的关系
- super
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中
- super和this不能同时调用构造方法
- super vs this
- 代表对象不同
- this:本身调用者这个对象
- super:代表父类对象的应用
- 前提
- this:没有继承也可以使用
- super:只能在继承条件才可以使用
- 构造方法
- this():本类的构造
- super():父类的构造
- 代表对象不同
- 重写:需要有继承关系,子类重写父类的方法
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大但不能缩小;public>protected>default>private
- 抛出的异常:范围可以被缩小,但不能扩大;
- 重写,子类的方法必须和父类必须一直,方法体不同!
- 为什么需要重写
- 父类功能,子类不移地那个需要,或者不一定满足
7.多态
- 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。
- 一个对象的实际类型是确定的,但可以只想对象的应用类型有很多
- 多态存在的条件
- 有继承关系
- 子类重写父类的方法
- 父类引用指向子类对象
- 运行原理:如果子类中重写了父类方法,并且对象左边数据类型是子类,那么调用相同方法时,运行的是子类的方法;如果对象数据类型为父类,则调用父类的方法 ;如果子类中没有重写父类方法,并且对象左边数据类型是子类,那么调用父类方法。
- 注意事项:
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系,类型转换异常!
- 存在条件:继承关系,方法需要重写;父类引用指向子类对象
- instanceof (类型转换)引用类型,判断一个对象是什么类型
- 类之间的转化
- 父类引用指向子类的对象
- 把子类转换为父类,向上转型
- 把父类转换为子类,向下转型;强制转换
- 方便方法的调用,减少重复的代码:简洁
8.abstract 抽象
-
// 抽象类的所有方法,继承了他的子类,都必须要实现它的方法
-
不能new出来,只能靠子类实现
-
抽象类中可以写普通方法,抽象方法必须在抽象类中
9.接口
- 接口就是规范,定义的是一组规则。
- 接口可以实现多继承,实现类必须重写接口的方法
- 作用:
- 约束
- 定义一些方法,让不同的个人实现
- public abstract
- public static final
- 接口不能被实例化,接口中没有构造方法
- implements可以实现多个接口
10.内部类
-
内部类就是在一个类的内部再定义一个类,如:A类中定义一个B类,B就是A的内部类,A就是B的外部类
-
内部类分为:
-
成员内部类
public class Outer { private int id; public void out(){ System.out.println("这是外部类的方法"); } public class Inner{ public void in(){ System.out.println("这是内部类"); } // 获取外部类的私有属性 public void getID(){ System.out.println(id); } }
-
静态内部类
public class Outer { private int id; public void out(){ System.out.println("这是外部类的方法"); } } // 静态内部类 public static class Inner{ public void in(){ System.out.println("这是内部类"); }
-
局部内部类
public class Outer { //局部内部类 public void method(){ class Inner{ public void in(){ } } } }
-
匿名内部类
public class Test{ public static void main(String[] args){ // 匿名内部类 //没有名字初始化类 new Apple().eat(); } } class Apple{ public void eat(){ System.out.println("1"); } }
-
Day7.异常——java入门
1.异常是什么
- 异常指程序运行中出现的不期而至的各种状况:文件不存在,非法参数等。
2.异常的类别
- 异常分为Error和Exception两类
- 检查性异常:最具代表的检查性异常时用户错误或问题引起的异常。
- 运行时异常:运行时异常是可能被程序员规避的异常,运行时异常可以在编译时被忽略
- 错误ERROR:错误不是异常,是脱离程序员控制的问题
3.Error和Exception的区别
- Error通常时灾难性的错误,再程序控制之外,java虚拟机(JVM)一般会选择终止线程;
- Exception通常情况下时可以被程序处理的,并且在程序中应该去处理
4.异常处理机制
- 抛出异常
- 捕获异常
- 异常处理关键字
- try
- catch
- finally
- throw
- throws
5.自定义异常
// 自定义异常类
public class MyException extends Exception{
// 传递数字>10
private int detail;
public MyException(int a){
this.detail = a;
}
// toString:异常信息打印
@Override
public String toString() {
return "MyException{" + detail +
'}';
}
}
6.实际应用
- 处理运行异常,采用逻辑去合理规避并辅助try-catch处理
- 在多重catch块后面可以加一个catch(Exception)来处理可能会被遗漏的异常
- 对于不确定的代码,也可以加上try-catch,处理潜在的异常
- 尽量去处理异常,切忌知识简单地调用printStackTrace()去打印输出
- 如何处理异常,更具具体的业务需求和异常类型去决定
- 使用finally去释放占用的内存