当前位置: 首页 > news >正文

30天学习Java第四天——面向对象

面向对象

概述

  1. 面向过程与面向对象

    • 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步步实现,使用的时候一个个依次调用就行了。

      面向过程关注于首先功能的步骤上,适合简单的流程,速度快

    • 面向对象就是分析出解决这个问题都需要哪些对象的参加,然后让对象与对象之间协作起来形成一个系统。

      面向对象关注于实现功能需要哪些对象的参与,耦合度低,扩展力强

  2. 面向对象三大特征

    1. 封装
    2. 继承
    3. 多态

类与对象

  • 类 = 属性 + 方法

  • 定义一个类

    public class Student {
    	
        //类中的实例变量
        String name;
        int age;
        boolean gender;
        
        //实例方法
        //实例方法不加static
        public void learning(){
            System.out.println("正在学习···")
        }
    
    }
    
    public class StudentTest {
        public static void main(String[] args) {
    		//局部变量
            int i = 10;
            
            //实例化学生类对象
            //s1也是局部变量
            //s1中存的是堆内存中Student对象的内存地址,是对Student对象的一个引用
            Student s1 = new Student();
            String name = s1.name;
            int age = s1.age;
            boolean gender = s1.gender;
    
            name = "张三";
            System.out.println(name);
        }
    }
    
    
  • 为什么要定义一个类?

    要通过类实例化对象,让对象与对象之间协作形成系统解决问题。

  • 实例变量属于成员变量,成员变量没有赋值,系统会自动赋默认值

  • 内存图

    在这里插入图片描述

    • 元空间:存储类的元信息,字节码等。元空间是JVM中方法区的实现。(Java8之前叫’永久代’)。使用的是本地内存,不是JVM内存
    • 所有new出来的对象,都存在堆内存中
    • 虚拟机栈中存的栈帧。当方法被调用时,会给该方法分配空间,在虚拟机栈中压栈,压入一个栈帧。这个栈帧就是该方法的活动空间。每个栈帧中包含:局部变量表,操作数栈等
    • 局部变量存在栈中,实例变量存在堆内存的对象中,s1只是接收实例对象的一个引用,也是一个局部变量,存在虚拟机栈的栈帧中
  • 实例对象与实例方法的访问

    访问实例变量与实例方法,必须先new对象,通过对象访问

  • =空指针异常NullPointerException=

    引用一旦为null,表示引用不再指向对象了。这时候通过引用访问类中的属性方法,编译不报错,执行时就行报空指针异常错误
    空引用调用实例变量\方法,一定会空指针异常

  • =值传递与引用传递=(其实就是一个保存的是字面量值,一个保存的是内存地址)

    • 可以通过画JVM内存图清晰的看出来

    • 值传递不改变原来的值,只是复制了一份

      在这里插入图片描述

    • 引用传递复制的是变量保存的地址,因此改变值,改变的是这个地址内的数据,原来的数据也就被改变了

      在这里插入图片描述

  • this关键字

    • 调用实例变量需要引用.属性,如果想在实例方法中使用实例变量,也需要引用.属性,但是此时还没有new对象,因此使用this作为引用。
    • this也是一个引用,保存的是当前对象的地址
    • this大部分可以省略,除了用来区分实例变量与局部变量的时候
    • this不能在静态方法中使用(静态方法是通过类.方法的方式调用的)
    • 在一个构造方法中调用本类的其他构造方法,可以使用this(构造参数)
    public class Student {
        
       String name;
        
       public void study(){
           //this作为引用,引用name属性
           this.name = "张三"
       }  
    }
    
    public class StudentTest {
        public static void main(String[] args){
            Student u1 = new Student();
            u1.fun();	//u1调用fun()方法时,fun()方法中的this指的就是u1
        }
    }
    

    在这里插入图片描述

    实例方法的栈帧中第一个槽位中存储的就是this,this的地址是调用该方法对象的地址。所以this的值也是会变的,谁调用它,它就保存谁的地址

面向对象三大特性之——封装

  1. 为什么封装
    为了保护属性安全,不然谁都可以读取修改类中的属性。将实例变量封装起来,在getter与setter方法中可以定义一些安全性措施。
  2. 如何封装
    • 属性私有化(使用 private 修饰)
    • 对外提供访问入口(提供public修饰的get和set方法用于读写)

构造方法

  1. 构造方法的作用
    • 创建对象
    • 初始化对象
  2. 如何定义构造方法
    [修饰符列表] 构造方法名 (形参列表){
    构造方法体;
    }
    注意:构造方法名与类名一致,不需要提供返回值类型
  3. 如何调用构造方法
    使用new调用
  4. 知识点:
    • 构造方法执行结束后,会返回创建的对象的内存地址
    • new一个对象实际就是调用类的构造方法,创建的对象
    • 如果一个类没有显式定义构造方法,系统会默认提供一个无参的构造方法(称为缺省构造器)
    • 我们可以显式的定义构造方法,可以在构造方法中同时完成实例变量的初始化操作。显式定义了构造方法,系统就不会提供缺省构造器了。
    • 在Java中可以定义多个构造方法,这些构造方法自动构成了方法的重载
    • 构造方法执行原理

      构造方法的执行有两个阶段

      1. 对象创建阶段
        new的时候在堆中开辟空间,然后赋默认值,在构造方法的方法体执行之前就完成了。
      2. 初始化阶段
        执行构造方法体,开始进行初始化
        先后顺序不可颠倒,一定是先创建了对象,后执行了初始化操作
  5. 构造代码块
  • 语法:就是一对大括号 { }

    public class A {
    	{
    		构造代码块;
    	}
    	
    	// 构造方法
    	public A(){
    		
    	}
    }
    
  • 构造代码块什么时候执行?
    每一次new的时候都会执行一次构造代码块
    构造代码块是在构造方法体执行之前执行的
    也就是在对象创建之后,初始化之前
    创建对象–》执行构造代码块–》执行构造方法体进行初始化

  • 构造方法块的使用场景
    执行一些通用的初始化操作

static关键字

  • static修饰的变量:静态变量
  • static修饰的方法:静态方法
  • 所有static修饰的,访问时,直接用类名.,不需要new对象
  • 当一个属性是对象级别的,要将其定义为实例变量
    在这里插入图片描述
  • 当一个属性对于所有对象的值都是一样的,可以将其定义为static,能够省一些内存空间。在调用static属性时,尽量使用类名.的方式
  • 静态变量存在堆内存中,在类加载时初始化
    static
  • 静态代码块
    • 在类加载时执行,只执行一次
    • 可以定义多个,自上而下依次执行
    • 如果有些需求需要在类加载时执行,可以将其写入静态代码块中,这是一个类加载时刻代码
static {
	静态代码块;
}

注:本文章源于学习动力节点老杜的java教程视频后的笔记整理,方便自己复习的同时,也希望能给csdn的朋友们提供一点帮助。

相关文章:

  • ubuntu-drivers-common 包功能详解
  • LWIP网络模型及接口简介(DAY 01)
  • 16 | 实现简洁架构的 Store 层
  • 深度学习视觉2D检测算法综述
  • 外包招聘舞弊利益分配,如何规避这种情况?
  • 加一(js实现,LeetCode:66)
  • rtsp在网页上显示(webrtc-stream)
  • 【C++ STL】 容器详解:priority_queue 学习
  • 大语言模型学习--向量数据库Milvus实践
  • 【大模型学习】第十六章 模型微调技术综述
  • 【eNSP实战】MSTP与VRRP配合使用
  • 图论part2|200. 岛屿数量、695. 岛屿的最大面积
  • 如何制作Windows系统盘、启动盘?(MediaCreationTool_22H2)
  • 韦伯望远镜的拉格朗日点计算推导过程,包含MATLAB和python运动轨迹仿真代码
  • Redis 数据持久化之AOF
  • 3-2 深入解析数字电路设计中的竞争条件及解决策略
  • blazemeter工具使用--用于自动生成jmeter脚本并进行性能测试
  • 【动手学深度学习】基于SoftMax回归算法实现图片分类
  • docker-compose部署MongoDB分片集群
  • 如何绕过 reCAPTCHA V2/V3:Python、Selenium 与其他工具的实战指南
  • 媒体:黑话烂梗包围小学生,“有话好好说”很难吗?
  • 习近平在上海考察
  • 打工人的“小长假模式”,已经迫不及待地开启了
  • 杭州打造商业航天全产业链,请看《浪尖周报》第22期
  • “下山虎”张名扬一回合摘下“狮心”:你们再嘘一个给我听听
  • 戴昕谈隐私、数据、声誉与法律现实主义