Java面向对象编程(OOD)
面向对象编程(Object-Oriented Programming,OOP)
- 本质:以类的方式组织代码,以对象的组织(封装)数据
- 三大特性:封装,继承,多态
*从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象;
从代码运行的角度考虑是先有类后有对象。类是对象的模板。
- this指代当前类
构造器(类似于python的__init__())
- 一个类即使什么都不写,也会存在一个构造方法(无参构造)。
- 必须和类的名字相同
- 必须没有返回类型,也不能写void
- 一旦有了有参构造,如果想使用无参构造,无参就必须要显示定义
- 快捷方式:ALT+insert 选择constructor
对象内存分析

封装
对象私有,get/set
继承
extends 关键词 意思是扩展,子类是父类的扩展
for example: public class Student extens Person {}
子类继承了父类,就会拥有父类的全部方法。属性私有后就不能访问该属性
快捷键:ctrl+H 可以查看树的结构
在java中所有类都默认直接或间接继承object类
Java中类只有单继承,没有多继承。(一个儿子只有一个爸爸,但是一个爸爸可以有多个儿子)
super
this 代表当前的类
super 代表父类
- 调用父类的构造方法,必须放在子类构造器的第一行
- super必须只能出现在子类的方法或者构造方法中
- super和this不能同时调用构造方法
无参构造时先调用父类的无参构造。
方法重写(需要有继承关系,子类重写父类的方法,和属性无关)
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大但不能缩小 public > Protecte > Default > private
- 抛出的异常:范围可以被缩小,但不能扩大
- 子类的方法和父类必须一致,但方法体可以不同
静态方法:方法的调用只和左边,定义的数据类型有关
非静态的方法且public:重写,子类会重写父类的方法
重写快捷键: ALT + Insert 选中override
多态:对象的多种形态
- 多态的前提?
有继承/实现关系
有父类引用指向子类对象有方法的重写 - 多态的好处?
使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
多态调用成员变量编译看左边,运行也看左边;
编译看左边: javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。/运行也看左边: java运行代码的时候,实际获取的就是左边父类中成员变量的值
多态调用成员方法编译看左边,运行看右边;
编译看左边: javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。/运行看右边: java运行代码的时候,实际上运行的是子类中的方法。
一个对象的实际类型是确定的,但是可以指向的引用类型就不确定了。下面是父类的引用指向子类
Student s1 = new Student();
Person s2 = new Student();
Object s3 = new Student();
Student能调用的方法都是自己的或者是继承父类的
Person可以指向子类,但是不能调用子类的都有方法,除非强制转换成子类类型
对象能执行哪些方法,主要看对象左边的类型,和右边的关系不大
当子类重写了父类的方法时,调用的是子类的方法
- 不能重写的:
- static方法,属于类,它不属于实例
- final 常量
- private方法
instanceof (类型转换 引用类型
Javabean类
用来描述一类事物的类。比如,Student, Teacher,Dog,Cat
私有化成员变量,书写空参构造,书写全部参数有参构造,提供get/set行为,写成员方法
测试类
用来检查其他类是否书写正确,带有main方法的类,是程序的入口
工具类
帮助我们做一些事情,但是不描述任何事物的类
- 类名见名知意
- 私有化构造方法 (不让外界创建它的对象)
- 方法定义为静态
抽象类
public abstract 返回值类型 方法名(参数列表);
public abstract claa 类名{}
抽象方法,子类必须强制重写;抽象方法所在的类就是抽象类
抽象方法:将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法
抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类
- 抽象类不能实例化
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
- 可以有构造方法。(当创建子类对象时,给属性进行赋值)
- 抽象类的子类
要么重写抽象类中的所有抽象方法
要么是抽象类
接口
就是一种规则,是对行为的抽象
- 使用interface来定义
public interface 接口名{}
- 接口不能实例化
- 接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名{}
- 接口的子类(实现类)(真正意义上接口是没有子类的)
要么重写接口中的所有抽象方法
要么是抽象类
注意1∶接口和类的实现关系,可以单实现,也可以多实现。
public class类名implements接口名1,接口名2{}
注意2:实现类还可以在继承一个类的同时实现多个接口。
public class类名extends父类implements接口名1,接口名21
- 成员变量:只能是常量,默认修饰符 public static final
- 构造方法: 没有
- 成员方法: 默认修饰符 public abstract
- 接口中默认方法的注意事项:
- JDK8后,接口中可以定义默认方法。用default修饰。public default void show(){}。默认方法不是抽象方法,不强制被重写。如果被重写,那就要去掉default关键字
- public可以省略,default不能省略
- 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
- 接口中静态方法的注意事项:
- public static void show(){}
- public可以省略,static不能省略。
- 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用。不会被重写
- JDK9后可以写私有方法
- private void show(){} 普通的私有方法,给默认方法服务的
- private static show () {} 给静态方法服务的
类和接口的区别
- 类和类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承
- 类和接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
- 接口和接口的关系:继承关系,可以单继承,也可以多继承。如果实现类实现了最下面的子接口,那就需要重写所有的抽象方法
接口的应用
- 接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了。
- 当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。
适配器设计模式
- 当一个接口中抽象方法过多,但是我只要使用其中一部分的
时候,就可以适配器设计模式 - 书写步骤:编写中间类XXXAdapter,实现对应的接口。对接口中的抽象方法进行空实现,让真正的实现类继承中间类,并重写需要用的方法为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰
内部类
- 在一个类的里面,再定义一个类。这个类称为内部类
- 内部类的事物是外部类的一部分,内部类单独出现没有任何意义
- 内部类的访问特点:内部类可以直接访问外部类的成员,包括私有外部类。要访问内部类的成员,必须创建对象
- 成员内部类:写在成员位置的,属于外部类的成员
- 静态内部类:只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象
- 局部内部类
- 匿名内部类:隐藏了名字的内部类
new 类名或者接口名(){
重写方法;}
浙公网安备 33010602011771号