11.面向对象

面向对象

  • 面向对象编程:本质就是“以类得方式组织代码,以对象得组织(封装)数据”

类与对象得关系

  • 类是一种抽象得数据类型,它是对某一类事物的描述/定义,但是并不能代表某一个具体的事物。
    • 动物,食物,手机等
    • Person,Food,Phone等,这些类都是用来描述某一个具体事物应该具备的特点和行为。
  • 对象是抽象概念的具体实例
    • 张三就是人的具体实例。
    • 能够体现出具体的特点和功能的是实例,而不是一个抽象的概念。

创建与初始化对象

  • 使用new关键字创建对象;
//类目 实例化对象名 = new 构造方法;
Classname name = new Classname();

构造器

  • 构造器本质就是一个名称和类目相同的方法,没有返回值,也不能写void。当你用new去实例一个对象,就会调用构造器。
  • 默认构造器:每个类都隐式的存在一个无参构造器。
  • 如果该对象不想被外部实例,那么只需要在构造器加上private修饰符。
  • 构造器的重载和普通方法一致,如果重载了构造器,那么无参构造器就必须显式的存在,否则实例化对象时无法使用无参构造器。
  • 构造器的作用:1、new实例化对象;2、初始化对象的值。

Java三大特性

封装
  • 封装的定义

​ 封装(Encapsulation)是面向对象方法的重要思想,就是把对象的属性和方法的实现过程结合成整体,尽量隐藏对象的内部信息。

  • 封装的好出
  1. 提高程序的安全性,保护数据;
  2. 隐藏代码的实现细节;
  3. 增加程序的可维护性;
  4. 提供统一的接口
继承

继承的概念

  • 继承就是子类继承父类的特征和行为,也就拥有了父类的所有方法

继承的格式

class 父类 {
}
 
class 子类 extends 父类 {
}

为什么要继承

  • 继承可以增加代码的复用性。例如Person类有say()方法,那么Man就可以继承Person,这样Man也就拥有了say()方法,避免重新写一遍say()方法,提高代码的复用性。

继承的特性

  • 子类拥有父类非 private 的属性、方法。
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法。
  • Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

super和this关键字

  • super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

  • this关键字:指向自己的引用。

  • super()方法是隐式存在于子类的第一行。若显式存在,也必须在子类第一行

  • this()方法必须在子类的第一行

重写

定义:在子类中创建一个与父类方法名相同、返回值类型相同(或是该返回值的子类)、形参相同的方法,只是具体的实现内容不一样,这就是方法的重写(Override)

为什么要重写:

父类的方法无法满足子类的需求,因此子类可以沿用父类的方法重写方法体的内容,定义自己的方法。这样可以提高方法的扩展性和复用性,不同的对象去调用相同的方法名,返回不一样的结果。体现了java的多态性。

总结:

  1. 重写方法的方法名和参数列表要和被重写方法一致。
  2. 在重写的时候,重写方法的返回值类型可以是被重写方法返回值类型的子类。
  3. 重写方法不能使用比被重写方法更严格的权限,即重写方法的权限要大于或者等于被重写方法的权限。
  4. private修饰不支持继承,所以无法重写private修饰的方法。final修饰的方法也不能重写。static修饰的方法也不能被重写。虽然在子类中可以存在与父类中private方法和static方法相同名称的方法,但是并不存在多态,所以并不是重写。
  5. 静态方法和非静态方法是不一样的:在静态方法中,方法的调用只和左边声明的对象类型有关,左边是什么类型,就调用该类型对应的方法。
  6. 抛出的异常的范围可以缩小,但不能大于被重写的方法;

访问权限:

修饰符 同一个类中 同一个包中 子类 不同包中
public Yes Yes Yes Yes
protected Yes Yes Yes
default Yes Yes
private Yes
多态
  • 即同一个方法可以根据发送对象的不同而采用多种不同的行为方式。

  • 一个对象的实际类型是确定的,但是可以指向对象的引用的类型有很多(父类,有关系的类)

  • 多态存在的条件

    • 有继承关系
    • 子类重写父类方法
    • 父类引用指向子类
  • 多态是方法的多态,属性没有多态性

  • instanceof

    //引用类型 instanceof 类目
    obj instanceof Class
    

    其中 obj 为一个对象实例,Class 为类名或者一个接口名,当 objClass 的实例,或是其子类实例,或是其接口的实现类实例,都返回 true,否则返回false

    需要注意的是obj 必须为引用类型,不能是基本类型。

  • 总结:

    • 父类引用指向子类的对象
    • 把子类转换为父类,向上转型,不需要强转
    • 把父类转为子类,向下转型,需要强转
    • 方便方法的调用,提高代码的复用性

static关键字

  1. static方法:
    1. static方法被称为静态方法,静态方法不依赖于任何对象就可以进行访问。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
    2. 如果该静态方法在当前类,那么就可以直接写方法名调用,否则通过类名调用。
  2. static变量
    1. static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
    2. static成员变量初始化顺序按照定义的顺序执行。
  3. static代码块
    1. static代码块可以放在类的任意位置,只在类加载的时候执行一次,因此可以用来优化程序性能

​ 扩展:

  1. 静态导入包
//通过static关键字可以导入对应的方法
import static java.lang.Math.random;

//通过方法名直接调用方法
System.out.println(random());

抽象类(abstract)

  1. 抽象类通过abstract关键字修饰。
  2. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
  3. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  4. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
  5. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
  6. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类

接口(interface)

接口在java中是一种抽象类型,无法实例化,但是可以被其他类实现。

接口的声明

[可见度] interface 接口名称 [extends 其他的接口名] {
        // 声明变量
        // 抽象方法
}

接口的实现

public ClassName implements 接口名称A,接口名称B...

接口的特性

  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

抽象类和接口的区别

  1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
  5. 接口没有构造方法。

内部类

[内部类详解](### 面向对象

  • 面向对象编程:本质就是“以类得方式组织代码,以对象得组织(封装)数据”

类与对象得关系

  • 类是一种抽象得数据类型,它是对某一类事物的描述/定义,但是并不能代表某一个具体的事物。
    • 动物,食物,手机等
    • Person,Food,Phone等,这些类都是用来描述某一个具体事物应该具备的特点和行为。
  • 对象是抽象概念的具体实例
    • 张三就是人的具体实例。
    • 能够体现出具体的特点和功能的是实例,而不是一个抽象的概念。

创建与初始化对象

  • 使用new关键字创建对象;
//类目 实例化对象名 = new 构造方法;
Classname name = new Classname();

构造器

  • 构造器本质就是一个名称和类目相同的方法,没有返回值,也不能写void。当你用new去实例一个对象,就会调用构造器。
  • 默认构造器:每个类都隐式的存在一个无参构造器。
  • 如果该对象不想被外部实例,那么只需要在构造器加上private修饰符。
  • 构造器的重载和普通方法一致,如果重载了构造器,那么无参构造器就必须显式的存在,否则实例化对象时无法使用无参构造器。
  • 构造器的作用:1、new实例化对象;2、初始化对象的值。

Java三大特性

封装
  • 封装的定义

​ 封装(Encapsulation)是面向对象方法的重要思想,就是把对象的属性和方法的实现过程结合成整体,尽量隐藏对象的内部信息。

  • 封装的好出
  1. 提高程序的安全性,保护数据;
  2. 隐藏代码的实现细节;
  3. 增加程序的可维护性;
  4. 提供统一的接口
继承

继承的概念

  • 继承就是子类继承父类的特征和行为,也就拥有了父类的所有方法

继承的格式

class 父类 {
}
 
class 子类 extends 父类 {
}

为什么要继承

  • 继承可以增加代码的复用性。例如Person类有say()方法,那么Man就可以继承Person,这样Man也就拥有了say()方法,避免重新写一遍say()方法,提高代码的复用性。

继承的特性

  • 子类拥有父类非 private 的属性、方法。
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法。
  • Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

super和this关键字

  • super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

  • this关键字:指向自己的引用。

  • super()方法是隐式存在于子类的第一行。若显式存在,也必须在子类第一行

  • this()方法必须在子类的第一行

重写

定义:在子类中创建一个与父类方法名相同、返回值类型相同(或是该返回值的子类)、形参相同的方法,只是具体的实现内容不一样,这就是方法的重写(Override)

为什么要重写:

父类的方法无法满足子类的需求,因此子类可以沿用父类的方法重写方法体的内容,定义自己的方法。这样可以提高方法的扩展性和复用性,不同的对象去调用相同的方法名,返回不一样的结果。体现了java的多态性。

总结:

  1. 重写方法的方法名和参数列表要和被重写方法一致。
  2. 在重写的时候,重写方法的返回值类型可以是被重写方法返回值类型的子类。
  3. 重写方法不能使用比被重写方法更严格的权限,即重写方法的权限要大于或者等于被重写方法的权限。
  4. private修饰不支持继承,所以无法重写private修饰的方法。final修饰的方法也不能重写。static修饰的方法也不能被重写。虽然在子类中可以存在与父类中private方法和static方法相同名称的方法,但是并不存在多态,所以并不是重写。
  5. 静态方法和非静态方法是不一样的:在静态方法中,方法的调用只和左边声明的对象类型有关,左边是什么类型,就调用该类型对应的方法。
  6. 抛出的异常的范围可以缩小,但不能大于被重写的方法;

访问权限:

修饰符 同一个类中 同一个包中 子类 不同包中
public Yes Yes Yes Yes
protected Yes Yes Yes
default Yes Yes
private Yes
多态
  • 即同一个方法可以根据发送对象的不同而采用多种不同的行为方式。

  • 一个对象的实际类型是确定的,但是可以指向对象的引用的类型有很多(父类,有关系的类)

  • 多态存在的条件

    • 有继承关系
    • 子类重写父类方法
    • 父类引用指向子类
  • 多态是方法的多态,属性没有多态性

  • instanceof

    //引用类型 instanceof 类目
    obj instanceof Class
    

    其中 obj 为一个对象实例,Class 为类名或者一个接口名,当 objClass 的实例,或是其子类实例,或是其接口的实现类实例,都返回 true,否则返回false

    需要注意的是obj 必须为引用类型,不能是基本类型。

  • 总结:

    • 父类引用指向子类的对象
    • 把子类转换为父类,向上转型,不需要强转
    • 把父类转为子类,向下转型,需要强转
    • 方便方法的调用,提高代码的复用性

static关键字

  1. static方法:
    1. static方法被称为静态方法,静态方法不依赖于任何对象就可以进行访问。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
    2. 如果该静态方法在当前类,那么就可以直接写方法名调用,否则通过类名调用。
  2. static变量
    1. static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
    2. static成员变量初始化顺序按照定义的顺序执行。
  3. static代码块
    1. static代码块可以放在类的任意位置,只在类加载的时候执行一次,因此可以用来优化程序性能

​ 扩展:

  1. 静态导入包
//通过static关键字可以导入对应的方法
import static java.lang.Math.random;

//通过方法名直接调用方法
System.out.println(random());

抽象类(abstract)

  1. 抽象类通过abstract关键字修饰。
  2. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
  3. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  4. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
  5. 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
  6. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类

接口(interface)

接口在java中是一种抽象类型,无法实例化,但是可以被其他类实现。

接口的声明

[可见度] interface 接口名称 [extends 其他的接口名] {
        // 声明变量
        // 抽象方法
}

接口的实现

public ClassName implements 接口名称A,接口名称B...

接口的特性

  • 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
  • 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  • 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

抽象类和接口的区别

  1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
  5. 接口没有构造方法。

内部类

内部类详解

注:
鸣谢《狂神说》,免费java学习地址:https://www.kuangstudy.com/)

posted @   西敲  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示