面向对象编程
本质:以类的方式组织代码,以对象的组织封装数据
方法的实例化
(1)JVM 读取指定 classpath 路径下的 class 文件,加载到内存,如果有直接父类,也会加载父类;
(2)堆内存分配空间;
(3)执行父类、子类静态代码块;
(4)对象属性进行默认初始化;
(5)调用构造方法;
(6)在构造方法中,先调用父类构造方法初始化父类数据;
(7)初始化父类数据后,显示初始化,执行子类的构造代码块;
(8)再进行子类构造方法的特定初始化;
(9)初始化完毕后,将地址赋值给引用
三大特性
1.封装:
该露的露,该藏的藏
程序设计追求 高内聚 低耦合 :类的内部操作数据细节自己完成,不允许外干涉;低耦合:仅暴露少量的方法给外部使用
通常,应该禁止直接访问一个对象中数据的实际表示,而应该通过操作借口来访问
属性私有private 给属性提供一些共有的 get/set方法
意义:提高程序安全性,保护数据,隐藏代码实现细节,统一接口,提高了代码的可维护性
2.继承:extends
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
通过继承实现代码复用。Java中所有的类都是通过直接或间接地继承java.lang.Object类得到的。继承而得到的类称为子类,被继承的类称为父类。子类不能继承父类中访问权限为private的成员变量和方法。子类可以重写父类的方法,及命名与父类同名的成员变量。但Java不支持多重继承,即一个类从多个超类派生的能力。在开发中尽量减少继承关系,这样做是为了把程序的耦合度降低。
super超类:
super 调用父类的构造方法,必须在构造方法的第一个,必须只能出现在子类的方法或者构造方法 ,super和this不能同时调用构造方法
与this的区别
1.代表对象不同:
this:本身调用着的这个对象
super:代表父类的对象的引用
2.前提:
this:没有继承也能是引用
super:只有在继承条件下才能使用
3.构造方法:
this:本类的构造
super:父类的构造
方法的重写:
前提:需要有继承关系,子类重写父类的方法
方法名必须相同;参数列表必须相同;修饰符范围可以扩大但是不能缩小;跑出的异常可以缩小但是不能扩大。
为什么需要去重写:
父类的功能子类不一定需要或者不一定满足子类需求
3.多态:
定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现的技术:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
作用:消除类型之间的耦合关系。
多态存在的三个必要条件
要有继承;
要有重写;
父类引用指向子类对象。
多态的优点
可替换性(substitutability)——多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
可扩充性(extensibility)——多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
接口性(interface-ability)——多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
灵活性(flexibility)——它在应用中体现了灵活多样的操作,提高了使用效率。
简化性(simplicity)——多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要
isntanceof 引用类型 判断一个对象是什么类型
父类引用子类的对象
Person person =new Student();
把父类转换成子类,高转低,强制转换 (Student)person
把子类转化成父类,低转高 可能丢失子类的方法
方便方法的调用,减少重复代码
static
静态方法去和类一同加载
静态代码块和匿名代码块
静态代码块,随着类加载同时加载,永久只执行一次
匿名代码块随着类对象的创建每次都会会执行
public class Student {
{
//匿名代码块
System.out.println("匿名代码块");
}
static {
//静态代码块,随着类加载同时加载,永久只执行一次
System.out.println("静态代码块");
}
public void Test(){
System.out.println("构造方法");
}
public static void main(String[] args) {
Student s=new Student();
s.Test();
System.out.println("================================");
Student s1=new Student();
s1.Test();
}
}
abstract抽象类
抽象类里面可以写普通方法,但是抽象方法必须在抽象类中
抽象方法,只有方法名,没有方法的实现 由子类继承并实现 单继承
存在的意义:将重复的代码抽象出来 提高开发效率
接口
接口就是规范,定义的是一组规则,体现了“如说你是,则必须能…” 的思想
接口的本质是契约,制定好以后,大家共同遵守
接口中的所有定义都是抽象的
public interface UserService {
//接口中的所有定义都是抽象的 public abstract
void add(String name);
void del(String name);
void update(String name);
void find(String name);
}
接口都需要有实现类
//一个类可以实现多个接口,等同于多继承
public class UserServiceImp implements UserService,TimeService{
@Override
public void add(String name) {
}
@Override
public void del(String name) {
}
@Override
public void update(String name) {
}
@Override
public void find(String name) {
}
}
接口的作用:
1:约束
2:定义一些方法,让不同的的人实现
3:接口不能被实例化,接口中没有构造方法
4:implements可以实现多个接口
5:必须要重写接口中的方法
异常
运行中出现的不期而遇的各种状况,java将异常当做对象处理,并且定义一个java.lang.Throwable作为所有异常的超类
检查性异常
运行时异常 RuntimeException
1.处理异常时,采用逻辑合理规避同时辅助try-catch处理
2.尽量添加finally语句块去释放占用的资源
3.尽量去处理异常,而不是简单地打印输出
4.对于不确定的代码,也可以加try-catch 处理潜在的异常