cool037

导航

Java面向对象编程(OOD)

面向对象编程(Object-Oriented Programming,OOP)

  • 本质:以类的方式组织代码,以对象的组织(封装)数据
  • 三大特性:封装,继承,多态

*从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象;
从代码运行的角度考虑是先有类后有对象。类是对象的模板。

  • this指代当前类

构造器(类似于python的__init__())

  • 一个类即使什么都不写,也会存在一个构造方法(无参构造)。
    1. 必须和类的名字相同
    2. 必须没有返回类型,也不能写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不能同时调用构造方法
    无参构造时先调用父类的无参构造。

方法重写(需要有继承关系,子类重写父类的方法,和属性无关)

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 修饰符:范围可以扩大但不能缩小 public > Protecte > Default > private
  4. 抛出的异常:范围可以被缩小,但不能扩大
  5. 子类的方法和父类必须一致,但方法体可以不同

静态方法:方法的调用只和左边,定义的数据类型有关
非静态的方法且public:重写,子类会重写父类的方法
重写快捷键: ALT + Insert 选中override

多态:对象的多种形态

  • 多态的前提?
    有继承/实现关系
    有父类引用指向子类对象有方法的重写
  • 多态的好处?
    使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。

多态调用成员变量编译看左边,运行也看左边;
编译看左边: javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。/运行也看左边: java运行代码的时候,实际获取的就是左边父类中成员变量的值

多态调用成员方法编译看左边,运行看右边;
编译看左边: javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。/运行看右边: java运行代码的时候,实际上运行的是子类中的方法。

一个对象的实际类型是确定的,但是可以指向的引用类型就不确定了。下面是父类的引用指向子类
Student s1 = new Student();
Person s2 = new Student();
Object s3 = new Student();
Student能调用的方法都是自己的或者是继承父类的
Person可以指向子类,但是不能调用子类的都有方法,除非强制转换成子类类型
对象能执行哪些方法,主要看对象左边的类型,和右边的关系不大
当子类重写了父类的方法时,调用的是子类的方法

  • 不能重写的:
  1. static方法,属于类,它不属于实例
  2. final 常量
  3. 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
  • 接口中默认方法的注意事项:
    1. JDK8后,接口中可以定义默认方法。用default修饰。public default void show(){}。默认方法不是抽象方法,不强制被重写。如果被重写,那就要去掉default关键字
    2. public可以省略,default不能省略
    3. 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
  • 接口中静态方法的注意事项:
    1. public static void show(){}
    2. public可以省略,static不能省略。
    3. 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用。不会被重写
  • JDK9后可以写私有方法
    1. private void show(){} 普通的私有方法,给默认方法服务的
    2. private static show () {} 给静态方法服务的

类和接口的区别

  • 类和类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承
  • 类和接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
  • 接口和接口的关系:继承关系,可以单继承,也可以多继承。如果实现类实现了最下面的子接口,那就需要重写所有的抽象方法

接口的应用

  • 接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了。
  • 当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。

适配器设计模式

  • 当一个接口中抽象方法过多,但是我只要使用其中一部分的
    时候,就可以适配器设计模式
  • 书写步骤:编写中间类XXXAdapter,实现对应的接口。对接口中的抽象方法进行空实现,让真正的实现类继承中间类,并重写需要用的方法为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰

内部类

  • 在一个类的里面,再定义一个类。这个类称为内部类
  • 内部类的事物是外部类的一部分,内部类单独出现没有任何意义
  • 内部类的访问特点:内部类可以直接访问外部类的成员,包括私有外部类。要访问内部类的成员,必须创建对象
  1. 成员内部类:写在成员位置的,属于外部类的成员
  2. 静态内部类:只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象
  3. 局部内部类
  4. 匿名内部类:隐藏了名字的内部类
new 类名或者接口名(){
    重写方法;}

posted on 2025-03-14 15:45  海然  阅读(15)  评论(0)    收藏  举报