3.Java SE 面向对象

面向对象概述

  1. 面向过程(强调步骤):当需要实现一个功能时,每一个具体的步骤都要亲力亲为,详细处理每一个细节。
    举例(洗衣机):把衣服脱下来–>找一个盆–>放点洗衣粉–>加点水–>浸泡10分钟–>揉—揉–>清洗衣服–>拧干–>晾起来。

  2. 面向对象(强调对象):当需要实现一个功能的时候,不必关心具体操作,只需要找一个已经具有改功能的人来帮忙就行了。
    举例(洗衣机):把衣服脱下来–>打开全自动洗衣机–>扔衣服–>按钮–>晾起来。

1、面向对象三条学习主线

Java类及类的成员:属性、方法、构造器;代码块、内部类
面向对象的大特征:封装性、继承性、多态性、(抽象性)
其它关键字:this、super、static、final、abstract、interface、package、import等

类及类的成员

属性(全局变量)与局部变量

  1. 局部变量:不可以使用权限修饰符没有默认初始化值
  2. 加载位置:
    ① 属性:加载到空间(非 static )。
    ② 局部变量:加载到空间
  3. 属性赋值先后顺序:默认初始化 - > 显示初始化 / 在代码块中赋值(静态先于非静态) - > 构造器初始化 - > 对象.方法 / 对象.属性
  4. 其他自行百度。

方法

重载

  1. 重载:同一个类、相同方法名,参数列表不同。(两同一不同
  2. 可变形参:必须放在形参的最后面;重载两同情况下,与形参类型相同的数组之间不能共存(重载),与形参不同的方法构成重载。

重写

  1. 定义:子类继承父类之后,可以对父类中同名同参数的方法,进行覆盖操作。
  2. 注意:子类不能重写父类中声明为 private 权限的方法。
  3. 子类方法重写修饰符(抛出异常类型)权限 >= 父类被重写方法修饰符(抛出异常类型)权限。
  4. 返回值类型:父类 void ,子类只能是 void ;父类 A 类型,子类 A 类型 / A 类型的子类;父类基本数据类型,子类相同的基本数据类型。

构造器(含 this 和 super )

  1. 没有定义构造器,系统也会有默认空参构造器。一旦自己定义了构造器,则系统不会在提供。

  2. JavaBean 概念:类是公共的、有无参公共构造器、属性对应 get 和 set 方法。

  3. 关键字 this :可以调用 属性、方法;理解为,当前对象 或 当前正在创建的对象。
    ① 在类的方法(构造器也是方法)中,通常情况下,我们省略 this.。但如果方法的形参类的属性同名时,就必须显示使用this.,表名此变量是属性,不是形参。
    ② 在构造器中,可以显示用this(形参列表),来调用本类中的其他构造器。此时必须放在当前构造器的首行且最多只能声明一个

  4. 关键字 super :可以调用 属性、方法、构造器;理解为,指向自己超类对象的一个指针,而这个超类指的是离自己最近的一个父类。
    ① 与 this 类似,可以用 super.xxx 来引用父类中声明的属性或方法,通常情况省略super。但是如果子类和父类中定义了相同的属性时,必须显示使用super
    ② 当子类重写父类中的方法时,而我们想要父类中的方法,就必须显示使用super调用。
    ③ 在子类构造器中使用super(形参列表),调用父类中的构造器;此时必须声明在子类构造器的首行
    ④ 在构造器的首行,没有显示声明this(形参列表)super(形参列表),则默认调用父类的空参构造器:super()。

  5. this 和 super 的使用注意:
    ① 不能出现在同一个构造器中,因为 this 调用的构造器里面必然会有 super() 语句存在,构造器中相同的语句失去了意义,编译不通过。
    ② 都不可以在 static 环境中使用。
    ③ 从本质上讲,this 是指向本对象的一个指针,然而 super 是 Java 关键字。

代码块

  1. 代码块是用来初始化类、对象的信息,多个代码块按顺序执行;只能用 static 修饰符,因此又分为静态代码块和非静态代码块。
  2. 静态代码块(含 static):随着类的加载而执行,而且只执行一次;不能调用非静态结构。
  3. 非静态代码块:随着对象的创建而创建,没创建一次就执行一次;可以调用静态和非静态结构。

内部类

  1. Java 中允许将一个类 A 声明在另一个类 B 中,则类 A 就是内部类,类 B 就是外部类。这样看其实类 A 就是 类 B 的成员(类比属性),可以调用类 B 的结构,可以被 static 和 四种不同的权限修饰符修饰。又因为类 A 是一个类,可以定义属性、方法、构造器等,可以被abstract、final修饰,当然用final修饰肯定就不能被继承了,不用自然是可以的。
  2. 关于分类,无非就是 静态 、非静态、局部、成员;静态不能访问非静态结构(常识了)。值得一提的是匿名内部类,它的特点如下:
    ① 必须继承一个抽象类或者实现一个接口。
    ② 不能定义任何静态结构。
    ③ 当所在的方法形参需要被匿名内部类使用时,必须声明为 final。因为声明周期不一样。
    ④ 不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
    ⑤ 理解 Lambda 表达式 可能就好理解一下。
  3. 内部类的优点
    ① 可以访问外部内的私有内容
    ② 不为同一包的其他类所见,具有很好的封装性。
    ③ 有效实现了“多继承”,优化了 Java 单继承的缺陷。举例;有类 A、类 B,类 C 继承类 A,类 C 里面匿名内部类 B。
    ④ 可以很方便的定义回调。

面向对象的三大特征

封装性

  1. 我们设计程序,追求高内聚,低耦合,隐藏对象内部的复杂性,只对外公开简单的接口。从而提高系统的可扩展性和可维护性。
  2. 提现:① 不对外暴露私有方法。② 私有属性,提供 get 、set 方法。等。

继承性

  1. 好处:减少了代码冗余,提高代码了代码的复用性,便用功能扩展,为多态的使用提供了前提。
  2. 给子类带来的好处:子类可以获得父类中声明的所有属性和方法(间接父类中的也一样获得),其中 private 修饰的也能获得,只是因为封装性的影响不能调用。除此之外,子类还可以在此之上拓展功能。
  3. 继承的局限性:一个类只能有一个父亲。
  4. 理解 java.lang.Object 类:所有的除 java.lang.Object 类之外的类都直接或者间接的继承与 java.lang.Object 类。
    ① Object 类只声明了一个空参构造器,没有属性,方法有:equals() / toString() / getClass() / hashCode() / clone() / finlize() /wait() / notify() / notifyAll()
    ② equals()方法:Object 中源码 如下:
public boolean equals(Object obj){
					return (this == obj);
		}// 基本数据类型比较数值,引用类型比较地址值。
// 像String、Date等类都是重写了 equals() 方法。
//重写举例
Class User{
    String name;
    int age;
// 判断学生是否相等,就是 名字 年龄 是不是一样,所以比较的是 名字 和 年龄。
    public boolean equals(Object obj){
			if(obj == this) return true;
			if(obj instanceof User){
					User u = (User) obj;
					return this.age == u.age && this.name.equals(u.name);
				}
				return false;
			}
	}

多态性

  1. 何为多态性?:父类的引用指向子类的对象。例子如下(顺便解释向上转型):
Person p = new Man();//向上转型,也是多态的提现
Object obj == new Date();
  1. 使用方法:总结为,编译,看左边;运行,看右边;解释:在编译时,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。此外,多态只适用于方法,不适用于属性。
  2. 向下转型:使用强制类型转换符:()。为的是想调用子类中声明的方法和属性,因为如果一个变量类型为父类,只能调用父类中声明的属性和方法。
    ① 注意:使用 instanceof 进行判断,否则可能出 ClassCastException 的异常。

关键字

static

  1. 存在的意义:
    ① 主要意义在于:创建独立于具体对象的域变量或方法。即使没有创建对象,也能调用其属性和方法(如工具类)。
    ② 以静态代码块去优化程序性能。因为静态代码块 只会按类的加载按顺序执行且只执行一次
  2. 独特之处: 被 static 修饰的变量或者方法独立于该类的任何对象,也就是说,它是共享的
  3. 注意事项:
    ① 在静态方法内,不能使用 this 和 super 关键字。
    ② 静态只能访问静态,非静态都可以访问。
    ③ 从生命周期去理解。

final

  1. 修饰类,此类不能被继承。不能修饰抽象类,因为抽象类必须有人继承他,不然没有意义。
  2. 修饰方法,表名此方法不可以被重写。
  3. 修饰变量,此变量不可变,表示常量。一旦赋值后,不能重新赋值。
  4. static final ,用来修饰全局变量。

abstract

  1. 修饰类(抽象类):此类不能实例化;一定有构造器,便于子类实例化时调用。
  2. 修饰方法(抽象方法):只有方法的声明,没有方法体;它一定在抽象类里面;如果子类没有重写父类中所有的抽象方法,则表示子类也是一个抽象类。
  3. 注意:不能用来修饰:私有方法、静态变量、final 方法、final 类、属性、结构体等结构。

interface

  1. 弥补了java单继承的局限性。和 类 是两个并列的结构。
  2. 不能定义构造器,意味着接口不能实例化;可以用 implements 实现它,如果实现它的类覆盖了接口中的所有抽象方法,则此实现类可以实例化。否则此实现类依然是一个抽象类。
  3. 接口和接口直接可以继承,而且可以多继承。
  4. Java 8 中接口的新规范:
    ① 其中定义的静态方法,只能通过接口调用。
    ② 实现类,可以调用接口中的默认方法,如果重写了默认方法,则调用重写后的。

相关面试题

在 Java 中定义一个不做事且没有参数的构造方法的作用?

Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

在调用子类构造方法之前会先调用父类没有参数的构造器,其目的是?

帮助子类初始化工作。

在一个静态方法内调用一个非静态成员为什么是非法的?

由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

hashCode 与 equals()

  1. hashCode() 介绍:用于获取哈希码,也叫散列码;它返回一个 int 整数;这个数的作用是确定该对象在哈希表中的索引位置;hashCode 定义在 Object 中,这意味着所有类都含有 hashCode 函数。
  2. 了解散列表:它存储的是键值对,它能根据 快速检索出 对应的 。这其中就是利用了散列码,也就是哈希码。
  3. hashCode 和 equals 的相关规定
    ① 如果两个对象相等,则 hashCode 一定相同。
    ② 两个对象相等,对两个对象分别调用 equals 方法都返回 true;
    ③ 两个对象拥有相同的 hashCode 值,它们也不一定相等。
    ④ equals 被覆盖过,则 hashCode 也必须被覆盖。因为 hashCode 的默认行为是堆上的对象产生独特值,如果没有重写它,则这两个 Class 的对象永远不会相等,及时两个对象拥有相同的数据。

参考https://thinkwon.blog.csdn.net/article/details/104390612https://www.bilibili.com/video/BV1Kb411W75N?from=search&seid=12153546638638215026&spm_id_from=333.337.0.0https://blog.csdn.net/weixin_47894020/article/details/110120194?ops_request_misc=&request_id=&biz_id=102&utm_term=java%20%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%20%E6%A6%82%E8%BF%B0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-110120194.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二爷.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值