Java 面向对象1

类和对象

  1. 面向对象
    • 关注现实存在的事物的各方面信息,从对象的角度出发,根据事物的特征进行程序设计
    • 对象:用来描述客观事物的一个实体
    • 类:具有相同属性和方法的一组对象的集合
  2. 属性
    • 对象具有的各种静态特征
    • “对象有什么”
  3. 方法
    • 对象具有的各种
    • “对象能做什么”
    • 在方法中通过对象作为参数,传递的是它的引用,可以通过引用获取该对象的所有信息。
    • 抽象的概念
    • 模板
    • 类是模子,确定对象将会拥有的特征(属性)和行为(方法)
    • 类是对象的类型
    • 构造方法
      • 注意事项
        • 构造方法与类同名且没有返回值(必须与类名相同)
          1
          2
          3
          4
          5
          // 构造方法的语法格式:
          // 没有返回值类型 , 构造方法名 与类名相同
          public 构造方法名(){
          // 初始化代码
          }
        • 只能在对象实例化的时候调用
      • 特点
        • 当没有指定构造方法时,系统会自动添加无参的构造方法
        • 当有指定构造方法,无论是有参、无参的构造方法,都不会自动添加无参的构造方法
        • 一个类中可以有多个构造方法
        • this(); 访问其它无参或带参 构造方法
    • this 关键字
      • this:当前对象的默认引用
      • this 的使用
        • 调用成员属性,解决成员属性的局部变量同名冲突
        • 调用成员方法
        • 调用重载的构造方法 this();
          • 通过 this() 调用构造方法,必须放在方法体内的第一行!!!
  4. 对象
    • 基本概念
      • 一个看得到、摸着着的具体实体
      • 对象是类的实例表现
      • 万物皆对象
      • 对象是特定的类型数据
    • 对象实例化
      • 实例化对象过程可以分为两部分
        • 声明对象 Class 对象名称
          • 在内存的栈中开辟一个空间,此时栈空间的数据是空的
        • 实例化对象 new Class
          • 经过实例化的环节,会在内存的堆中开辟一块空间,在此完成具体属性赋值等相关操作
            声明对象和实例化对象通过 = 赋值符号完成。经过赋值操作,将内存的堆地址,传递到栈当中的内存空间里。
      • 内存分配 栈[局部变量] ,堆[动态数据]
    • 注意事项
      • 需要多次访问同一对象时,必须进行声明
      • 同一作用范围内,不能定义同名对象
      • 可以同时声明多个引用,用逗号分割
        1
        2
        3
        4
        Cat one,two;
        one = new Cat();
        two = new Cat();
        Cat three = new Cat();four = new Cat();

封装

  1. 将类的某些信息隐藏在类的内部,不允许外部程序直接访问,通过该类提供的方法来实现对隐藏信息的操作和访问
    • 隐藏对象的信息
    • 留出访问的接口
  2. 特点
    • 只能通过规定的方法访问数据
    • 隐藏类的实例细节,方便修改和实现
  3. 实现步骤
    • 1、修改属性的可见性 ,设为 private
    • 2、创建 getter/setter 方法 ,设为 public 用户属性的读写
    • 3、在 getter/setter 方法中加入属性控制语句,对属性的合法性进行判断
  4. 包(类似文件夹)
    • 作用
      • 管理 Java 文件
      • 解决同名文件冲突
    • 定义包
      • 语法 package 包名;例:package com.zje.animal;
      • 注意
        • 一个 Java 源文件只能有一个 package 语句,必须放在 Java 源文件中的第一行
        • 包名全部英文小写
        • 建议每个包内存储信息功能单一
        • 包命名规则:域名倒序+模块+功能
        • Java 中一个包不能存在同名类
    • 导入包
      • 语法 import 包名.类名;
      • 导入包中全部类 import com.xxx.*; 导入包中指定类 import com.xxx.animal.Cat;
    • 常用系统包
      • java.lang
        • 包含 Java 语言基础的类,该包系统加载时 默认导入。如 System、String、Math
      • java.util
        • 包含 Java 语言中常用工具。如 Scanner、Random
      • java.io
        • 包含输入、输出相关功能的类。如File、InputStream
    • 问题
      • 如何实现跨包的类调用?
        • 建议采用“import 包名.类名;” 的方式加载,提高效率
        • 加载类的顺序跟 import 导入语句的位置无关
        • “import 包名.*”; 无法访问指定包名下的类,无法访问子包下的类
      • 有几种调用形式?
        1. 使用 import 语句导入目标类:这种方式可以直接在代码中使用 TargetClass 而无需指定完整的包路径。
        import com.example.targetpackage.TargetClass;
        
        1. 使用完整的包路径访问目标类:这种方式需要在代码中完整地指定目标类的包路径。
        com.example.targetpackage.TargetClass targetObject = new com.example.targetpackage.TargetClass();
        
        1. 使用 static import 导入目标类的静态成员:这种方式可以直接访问目标类的静态成员,无需指定类名。
        import static com.example.targetpackage.TargetClass.staticMethod;
        staticMethod(); // 直接调用静态方法
        
        1. 使用 default 访问修饰符允许同一个包下的类进行访问:这种方式需要将目标类的方法声明为 default 访问修饰符,这样同包下的其他类就可以访问该方法。
        // com.example.targetpackage.TargetClass
        default void defaultMethod() {
          // 此方法可被同包下的其他类访问
        }
        
  5. static 关键字
    • 1、类对象共享
    • 2、类加载时产生,销毁时释放,生命周期长
    • 注意事项
      • 在成员方法中,可以直接访问类中的静态成员
      • 静态方法中不能直接访问非静态成员,只能直接调用静态成员
      • 只能通过对象实例化后,对象.成员方法的方式访问非静态成员
      • 静态方法中不能使用 this
    • 静态成员访问方式
      • 1、对象.成员
      • 2、类.成员
  6. 代码块
    • 普通代码块:每此调用方法 顺序执行,先出现,先执行。
    • 构造代码块:在类中定义,创建对象时调用,优先于构造方法执行。可以有多个
    • 静态代码块
      • static { <语句> }
      • 类加载时调用,优先于构造代码块执行
      • 无论产生多少类实例,静态代码块只执行一次,构造代码块在每次对象构造的时候调用

成员属性的初始值

数据类型 默认值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char ‘\u0000’
boolean false
引用类型对象的初始值 null