java学习笔记

本文深入探讨面向对象编程的三大核心特征:封装、继承、多态。解析它们的意义、作用及实现方法,如封装的步骤、继承的语法、多态的应用场景等,帮助读者掌握面向对象编程的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象的三大特征:封装、继承、多态

为什么要封装?封装的好处是什么?
封装的好处:

  1. 封装之后,对于那个事物来说,看不到这个事物复杂的一面,只能看到该事物简单的那一面。复杂性封装,对外提供简单的操作入口。
  2. 封装之后才会形成真正的“对象”,真正的“独立体”
  3. 封装就意味着以后的程序可以重复使用,并且这个事物应该适应性比较强,在任何场合都能使用。
  4. 封装之后,对于事物本身,提高了安全性。

封装的步骤

  1. 所有属性私有化,使用private关键字进行修饰,private表示私有的,修饰的所有数据只能在本类中访问。
  2. 对外提供简单的操作入口。
    –对外提供两个公开的方法,分别是set方法和get方法。
  3. set方法的命名规范:
    public void setAge(int a){
    age = a;
    }
  4. get方法的命名规范:
    public void getAge(){
    return age;
    }

背会:

  • setter和getter方法没有static关键字
  • 有static关键字修饰的方法怎么调用:类名.方法名(实参);
  • 没有static关键字修饰的方法怎么调用:引用.方法名(实参);

关于java类中的构造方法:

  1. 构造方法又被称为构造函数/构造器/
  2. 构造方法语法结构:
    [修饰符列表] 构造方法名 (形式参数列表){
    构造方法体;
    }
  3. 对于构造方法来说,“返回值类型”不需要指定,并且也不能写void
  4. 对于构造方法来说,构造方法的方法名必须和类名保持一致。
  5. 构造方法的作用:
    构造方法存在的意义是,通过构造方法的调用,可以创建对象。
  6. 构造方法应该怎么调用?
    new 构造方法名(实参列表)
  7. 构造方法调用执行之后,有返回值吗?
    每一个构造方法执行结束之后都有返回值,但是这个“return 值;”这样的语句不需要写。
    并且返回值类型是构造方法所在类的类型
  8. 当一个类中没有定义任何构造方法的话,系统默认给该类提供一个无参数的构造方法,这个构造方法被称为缺省构造器。
  9. 当一个类显示的将构造方法定义出来了,那么系统则不再默认为这个类提供缺省构造器。
  10. 构造方法支持重载机制,在一个类当中编写多个构造方法 ,这多个构造方法显然已经构成方法重载机制。

构造方法的作用:

  1. 创建对象
  2. 创建对象的同时,初始化实例变量的内存空间。【给实例变量赋值】

成员变量之实例变量,属于对象级别的变量,这种变量必须先有对象才能有实例变量。

参数的传递(主要研究和学习的是方法在调用的时候,涉及到参数传递的问题,到底是怎么传递数据的?)
java语言当中方法调用的时候涉及到参数传递的问题,参数传递实际上是变量中保存到具体值。

结论:
方法调用的时候,涉及到参数传递的问题,传递的时候,java只遵循一种语法在这里插入代码片机制,就是将变量中的“值”传递过去了,只不过有时候这个值是一个字面值,有时候这个值是另一个java对象的内存地址0x1234.

关于java语言当中的this关键字:

  1. this是一个关键字,翻译为:这个
  2. this是一个引用,this是一个变量,this变量中保存了内存地址指向了自身,this存储在JVM堆内存java对象内部。
  3. 创建100个Java对象,每个对象都有this。
  4. this可以出现在实例方法当中,this指向当前正在执行这个动作的对象。(this代表当前对象)
  5. this在多数情况下都是可以省略不写的
  6. this不能使用在带有static的方法当中
    在这里插入图片描述

重点:
没有static关键字的方法被称为“实例方法”,实例方法访问:“引用.”
没有static关键字的变量被称为“实例变量”

注意:当一个行为/动作指向的过程当中是需要对象参与的,那么这个方法一定要定义为“实例方法”,不要带static关键字。

结论:
在带有static的方法中不能“直接”访问实例变量和实例方法。因为实例变量和实例方法都需要对象的存在,而static的方法中是没有this的,也就是说当前对象是不存在的。自然也是无法访问当前对象的实例变量和实例方法。

“this.”什么时候不能省略?
用来区分局部变量和实例变量的时候不能省略。

this可以使用在哪?

  1. 可以使用在实例方法当中,代表当前对象【语法格式:this.】
  2. 可以使用在构造方法当中,通过当前构造方法调用其他的构造方法【语法格式:this(实参);】

重点【记忆】:this()这种语法执行出现在构造函数第一行。

什么时候成员变量声明为实例变量呢?
–所有对象都有这个属性,但是这个属性的值会随着对象的变化而变化【不同对象的这个属性具体的值不同】

什么时候成员变量声明为静态变量呢?
–所有对象都有这个值,并且所有对象的这个属性的值是一样的,建议定义为静态变量,节省内存大开销。

静态变量在类加载的时候初始化,内存在方法区中开辟。反问道时候不需要创建对象,直接使用“类名.静态变量名”的方式访问。

关于Java中的static关键字:

  1. static英语单词的翻译为静态
  2. static修饰的方法是静态方法
  3. static修饰的变量是静态变量
  4. 所有static修饰的元素都称为静态的,都可以使用“类名.”的方式访问,当然也可以用引用.的方式访问【不建议】
  5. static修饰的所有元素都是类级别的特征,和具体的对象无关。

可以使用static关键字来定义“静态代码块”:

  1. 语法格式:
    static{
    java语句;
    }
  2. 静态代码块在类加载时执行,并且只执行一次。
  3. 静态代码块在一个类中可以编写多个,并且遵循自上而下的顺序依次执行。
  4. 静态代码块的作用是什么?用在哪?什么时候用?
    –例如,项目中要求在类加载的时机执行代码完成日志的记录。那么这段记录日志的代码就可以编写到静态代码块中,完成日志记录。
    –静态代码块是java的一个特殊的时刻,被称为类加载时刻,若希望在此刻执行一段特殊的程序,这段程序可以直接放到静态代码块当中。
  5. 跳出在静态代码块当中完成预备工作,先完成数据的预备工具,例如,初始化连接池…

方法什么时候定义为静态的?
–方法描述的是动作,当所有的对象执行这个动作的时候,最终产生影响是一样的,那么这个动作已经不属于某一个对象动作了,可以将这个动作提升为类级别的动作,模板级别的动作。

静态方法中无法直接访问实例变量和实例方法。

大多数方法都定义为实例方法,一般一个行为或者一个动作在发生的时候,都需要对象的参与。但是也有例外,例如:大多数“工具类”中的方法都是静态方法,因为根据类就是方便编程,为了方便方法的调用,自然不需要new对象是最好的。

关于java语言当中的继承:

  1. 继承是面向对象三大特征之一,分别是封装、继承、多态
  2. 继承基本的作用是:代码复用。但是继承最重要的作用是:有了继承才有了以后的“覆盖“和“多态”机制。
  3. 继承的语法格式:
    [修饰符列表] class 类名 extends 父类名{
    类体=属性+方法;
    }
  4. java语言当中的继承只支持单继承,一个类不能同时继承很多类,只能继承一个类。
  5. 关于继承的一些术语:
    –B类继承A类,其中;
    A类称为:父类、基类、超类、superclass
    B类称为:子类、派生类、subclass
  6. 在java语言当中子类继承父类都继承哪些数据?
    –私有的不支持继承
    –构造方法不支持继承
    –其他数据都可以被继承
  7. 虽然java语言当中只支持单继承,但是一个类也可以间接继承其他类
  8. JAVA语言中假设一个类没有显示继承任何类,该类默认继承JavaSE库当中提供的java.lang.Object类
    java语言中任何一个类中都有Obeject类的特征。

关于java语言当中的覆盖

  1. 方法覆盖又被称为方法重写,(override、overwrite)
  2. 什么时候使用方法重写?
    当父类中的方法已经无法满足当前子类的业务需求,子类有必要将父类中继承过来的方法进行重新编写,这个重新编写的过程称为方法重写/方法覆盖。
  3. 什么条件满足之后方法会发生重写?【代码满足什么条件】
    • 方法重写发生在具有继承关系的父子类之间
    • 方法重写的时候:返回值类型相同,方法名相同,形参列表相同
    • 方法重写的时候:访问权限不能更低,可以更高
    • 方法重写的时候:抛出异常不能更多,可以更少
  4. 建议方法重写的时候尽量复制粘贴
  5. 注意:
    私有方法不能继承,所以不能覆盖
    构造方法不能继承,所以不能覆盖
    静态方法不存在覆盖
    覆盖只针对方法,不谈属性

关于java语言当中的多态:

  1. Animal、Cat、Bird三个类之间的关系:
    Cat继承Animal
    Bird继承Animal
    Cat和Bird之间没有任何继承关系
  2. 关于多态中涉及到的几个概念:
    • 向上转型(upcasting)
      • 子类型–>父类型;又被称为自动类型转换
    • 向下转型(downcasting)
      • 父类型–>子类型;又被称为强制类型转换【需要加转换符】
    • 记忆:无论是向上还是向下转型,两种类型中之间必须要有继承关系,否则编译无法通过。

注:向下转型也需要两种类型之间必须有继承关系,不然编译报错,强制类型转换需要加强制类型转换符。

什么时候需要使用向下转型呢?

  • 当调用的方法是子类型中特有的,在父类型当中不存在,必须进行向下转型。

java.lang.ClassCastException (类型转换异常,这种异常总是在“向下转型”的时候会发生。)

  1. 以上异常只会在强制类型转换的时候会发生,也就是说“向下转型”存在隐患。
  2. 向上转型只要编译通过,运行一定不会出问题
  3. 向下转型编译通过,运行可能错误
  4. 怎么避免向下转型出现的ClassCastException?
    • 使用instanceof运算符可以避免出现以上的异常
  5. instanceof运算符怎么用?
    • 语法格式:
      (引用 instanceof 数据类型名)
    • 以上运算符的执行结果类型是布尔类型,结果可能true/false
    • 关于运算结果true/false:
      假设(a instanceof Animal)
      true表示:a这个引用指向的对象是一个Animal类型
      false表示:a这个引用指向的对象不是一个Animal类型
  6. java规范中要求:在进行强制类型转换之前,建议采用instanceof运算符进行判断,避免ClassCastException异常的发生。

多态的作用:降低程序的耦合度,提高程序的扩展力

关于java语言中的final关键字

  1. final是一个关键字,表示最终的,不可变的
  2. final修饰的类无法继承
  3. final修饰的方法无法被覆盖
  4. final修饰的变量一旦赋值之后,不可重新赋值【不可二次赋值】
  5. final修饰的实例变量:
    实例变量有默认值+final修饰的变量一旦赋值不能重新赋值,所有java语言最终规定实例变量使用final修饰之后,必须手动赋值,不能采用系统赋值。
  6. final修饰的引用一旦指向某个对象之后,不能再指向其他对象,那么被指向的对象无法被垃圾回收器回收。final修饰的引用虽然指向某个对象之后不能指向其他对象,但是所指向的对象内部的内存是可以被修改的。
  7. final修饰的实例变量是不可变的,这种变量一般和static联合使用,被称为“常量”。
    常量的定语语法格式:
    public static final 类型 常量 = 值;
    java规范中要求所有常量的名字全部大写,每个单词之间使用下划线连接。
    例:public static final GUO_JI = “中国”;

关于java语言当中的包机制:

  1. 包又称为package,java中引入package这种语法主要是为了方便程序的管理。不同功能的类被分门别类放到不同的软件包当中,查找比较方便,管理比较方便,易维护。
  2. 怎么定义package呢?
    • 在java源程序的第一行上编写package语句。
    • package只能编写一个语句。
    • 语法结构:
      package 包名;
  3. 包名的命名规范:
    公司域名倒序 + 项目名 + 模块名 + 功能名;
    主要采用这种方式重复几率较低。
  4. 包名要求全部小写,包名也是标识符,必须遵守标识符的命名规则
  5. 一个包对应一个目录。
  6. 使用了package机制之后应该怎么编译,怎么运行?
    • 使用了package机制之后,类名不是Test01了,是:com.bjpowernode.javase.day11.Test01
    • 编译:javac java源文件路径(在硬盘上生成一个class文件:Test01.class)
    • 手动方式创建目录,将Test01.class字节码文件放到指定的目录下
    • 运行:
      java com.bjpowernode.javase.day11.Test01

import语句用来完成导入其他类,同一个包下的类不需要导入,不在同一个包下需要手动导入。

import语法格式:
import 类名;
import 包名.*;

import语句需要编写到package语句之下,class语句之上。

结论:什么时候需要import?

  • 不是java.lang包下,并且不在同一个包下 的时候,需要使 用import进行引入。

访问控制权限修饰符:

  1. 访问控制权限修饰符来控制元素的访问范围
  2. 访问控制权限修饰符包括:
    • public 表示公开的,在任何位置都可以访问
    • protected 同包,子类
    • 缺省 同包
    • private 表示私有的,只能在本类中访问
  3. 访问控制权限修饰符可以修饰类、变量、方法…
  4. 当某个数据只希望子类使用,使用protected进行修饰
  5. 修饰符的范围:
    private < 缺省 < protected < public

类只能采用public和缺省的修饰符进行修饰。【内部类除外】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值