Javase(day09:面向对象)

1、类

  • 类的定义语法:

[修饰符] class 类名 {
// 书写类中的代码
}

  • 注意点:
    1、使用class修饰的就是类,也就是类必须使用class修饰
    2、使用public来修饰类,则类名必须和源文件名保持一致
    3、一个源文件中可以定义多个类,编译会生成多个字节码文件

  • 类中的组成内容
    1、属性(封装数据,以变量为表现形式)

    • 成员变量:又称为”实例变量“或”非静态变量“,因为成员变量是从属于”对象“的
    • 静态变量:又称为”类变量“,因为静态变量是从属于”类“的
      2、行为(封装功能,以方法为表现形式)
    • 成员方法:又称为”实例方法“或”非静态方法“,因为成员变量是从属于”对象“的
    • 静态方法:又称为”类方法“,因为静态变量是从属于”类“的

2、成员变量

  • 定义位置:定义在类中,方法体和代码块之外
  • 定义语法:

[修饰符] 数据类型 变量名; --> 此处修饰符不能使用static

  • 调用语法:
    对象名.成员变量名; --> 通过对象找到成员变量在内存中的存储位置
    --> 如果是在本类中调用成员变量,可以直接使用”成员变量名“来调用

  • 成员变量的默认值:和数组元素默认值规则一模一样

  • 成员变量初始化顺序:默认初始化 --> 显示初始化 --> 指定初始化

  • 成员变量和局部变量的区别:
    1、定义位置:

    • 成员变量:定义在类中,方法体和代码块之外
    • 局部变量:定义在类中,方法体和代码块之内

    2、存储位置:

    • 成员变量:存储在堆内存中,属于对象的一部分
    • 局部变量:存储在栈内存中

    3、默认值

    • 成员变量:有默认值,默认值规则与数组元素默认值规则相同
    • 局部变量:没有默认值,只声明不赋值的变量,只能做赋值操作,不能做取值操作

    4、生命周期

    • 成员变量:随着对象的创建而”出生“,随着对象的销毁而”死亡“
    • 局部变量:随着变量的创建而”出生“,随着所在作用域代码执行完毕而”死亡“

    5、修饰符

    • 成员变量:可以被public、protected、private、(static变为静态变量)、final等修饰
    • 局部变量:不能被public、protected、private、static修饰,只能被final修饰
  • 成员变量和局部变量的使用
    当成员变量和局部变量同名时,需要给成员变量加上this关键字加以区分

3、成员方法

  • 定义位置:在类中,方法体和代码块之外
  • 定义语法:

[修饰符] 返回值类型 方法名(形参列表) {
return 返回值;
}
--> 此处修饰符不能使用static

  • 调用语法:
    对象名.方法名(实参列表); --> 在本类中调用成员方法,可以直接使用”方法名(实参列表)“进行调用

4、实例化对象

  • 语法:类名 对象名 = new 类名(实参列表);
  • 注意:每个对象都是独一无二的
  • 对象实例化内存分析:
    我们以类为模板,然后实例化出对象。此处在堆内存中创建的对象,则只会为类中的成员变量开辟存储空间。
  • 匿名对象:通过new关键字创建的对象有两种
    1、匿名对象:没有对象名的对象,例如:new Student();
    2、非匿名对象:有对象名的对象,例如:Student stu = new Student();
    在开发中,匿名对象使用较少,但在下列两种情况中,建议使用匿名对象
    1、仅仅作为实参传递
    2、只调用一次该实例化对象中的方法.
  • 内存图:

5、构造方法

  • 语法:

[修饰符] 类名(形参列表) {
// 方法体
}

  • 注意点:
    1、没有返回值,也没有返回值类型
    2、方法名必须时类名
    3、构造方法是一个特殊的方法,有new关键字调用

  • 创建对象步骤分析
    1、创建对象,并为创建的对象中的成员变量开辟存储空间
    2、为成员变量赋默认值
    3、为成员变量显式赋值
    4、调用构造函数,对成员变量进行指定赋值操作

  • 创建对象是由谁来完成的
    答案:new负责创建对象,开辟存储区域;构造函数用于实现成员变量指定初始化的操作,二者缺一不可

  • 构造方法的作用(指定初始化)
    1、无参构造

    • 作用:给成员变量的初始化操作,常用于给数组类型的成员变量在无参构造器中开辟存储空间
    • 注意:在一个类中,没有给出任何构造器,会默认执行一个无参构造器

    2、有参构造

    • 作用:给成员变量的初始化操作,将形参的值赋给成员变量保存,进而完成指定初始化操作
    • 注意:
      1、建议形参名与成员变量名相同,然后使用this关键字区分
      2、在一个类中,如果给出了有参构造方法,就不会执行默认的无参构造方法(除非再自定义一个无参构造方法)
      3、建议每一个类中都定义一个无参构造器,避免在继承中出现子类找不到父类的无参构造器
  • 构造方法的重载
    构造方法也支持方法重载,在调用构造方法时,会根据调用构造方法的形参进行选择

  • 构造方法与成员方法的区别
    1、定义语法:

    • 构造方法没有返回值类型

    2、调用语法:

    • 构造方法:new 构造方法名(实参列表);
    • 成员方法:对象.方法名(实参列表);

    3、调用时期:

    • 构造方法:创建对象时调用
    • 成员方法:对象创建完毕后调用

    4、调用次数

    • 构造方法:只调用一次
    • 成员方法:可以调用任意次数

6、this关键字

  • this关键字概述
    创建一个对象成功后,虚拟机会动态的创建一个引用,该引用指向新创建的这个对象,并且该引用的名字就是this

  • this指代的是什么
    1、在构造方法中:指代的新创建的这个对象
    2、在成员方法中:指代的是调用这个方法的对象
    ......

  • this关键字的使用
    1、操作成员变量:对象.成员变量

    • 如果成员变量和局部变量同名,就需要使用this.成员变量来操作成员变量
    • 如果成员变量和局部变量不同名,可以忽略this关键字

    2、调用成员方法:对象.成员方法(实参列表)

    • 调用当前类的成员方法,可以使用this.成员方法,也可以忽略this

    3、调用构造方法:this(形参列表)

    • 作用:调用当前类的其他构造方法,注意,这里调用构造方法没有创建对象,只是实现了代码的复用
    • 注意:
      1、这种用法只能放在构造方法中,并且只能放在构造方法有效代码的第一行
      2、构造方法不能递归调用,也就是使用这种用法不能导致构造方法陷入死循环,所以不可能所有构造方法都使用this

7、static关键字

1、静态变量

  • 定义位置:定义在类中,代码块和方法体外

  • 定义语法:[修饰符] static 数据类型 变量名;

  • 特点:
    1、静态变量优先于对象存在,在类加载时,静态变量就已经存在了
    2、在一个类中,静态变量只有一份,为类和对象所共享
    3、可以通过对象来操作静态变量,也可以通过类名来操作静态变量,推荐使用类名来操作静态变量

  • 静态变量与成员变量的区别
    1、存储位置

    • 静态变量:存储在方法区
    • 成员变量:存储在堆内存

    2、创建次数

    • 静态变量:只在类加载时创建一次
    • 成员变量:在创建对象时创建,创建多少次对象,就创建多少次成员变量

    3、调用语法

    • 静态变量:可以使用对象.变量名,也可以使用类名.变量名调用
    • 成员变量:只能使用对象.变量名调用

    4、生命周期:

    • 静态变量:类加载时”出生“,程序运行结束时”死亡“
    • 成员变量:对象创建时”出生“,对象销毁时”死亡“
  • 成员变量和静态变量的使用
    成员变量:如果需要存储的数据是”特有数据“,就使用成员变量来存储
    静态变量:如果需要存储的数据是”共享数据“,就使用静态变量来存储

  • 静态变量内存分析

2、静态方法

  • 定义:使用static修饰的方法
  • 特点
    1、静态方法优先于对象存在,在类加载时就已经存在
    2、可以通过对象来调用静态方法(不建议),也可以通过类名来调用(建议)
  • 静态方法与成员方法的区别
    1、操作变量的区别
    成员方法中可以操作成员变量,也可以操作静态变量
    静态方法中只能操作静态变量,不能操作成员变量
    2、调用方法的区别
    成员方法中可以调用本类中的其他成员方法和静态方法
    静态方法中可以调用本类中其他静态方法,不能调用成员方法
    3、操作this的区别
    成员方法可以操作this
    静态方法不可以操作this
  • 静态方法和成员方法的使用
    1、成员方法:在方法中,如果需要直接操作当前类中的成员内容,则使用成员方法
    2、静态方法:在方法中,我们只需要操作当前类中的静态内容,而不需要操作成员内容,建议使用静态方法
    注意:静态方法常用于工具类,如:Arrays和Math

3、类的加载过程

当第一次使用某个类时,会将这个类的信息加载到方法区,并且还会给该类中的静态变量开辟存储区域,并设置该静态变量的默认值

4、代码块

  • 什么是代码块:{}

  • 代码块的分类:
    1、局部代码块

    • 定义位置:在类中,代码块或方法体内部
    • 定义个数:任意多个
    • 执行顺序:从上往下,顺序执行
    • 注意事项:在局部代码块中定义的变量,只能在当前作用域中使用,不能在代码块之外使用

    2、构造代码块

    • 定义位置:在类中,代码块或方法体之外
    • 定义个数:任意多个
    • 执行顺序:从上往下,顺序执行,每次调用构造方法之前,都会执行一次代码块中的代码
    • 注意事项:
      1、创建对象时,会调用构造代码块(也就是执行构造方法时)
      2、在构造代码块中,我们不但可以调用当前类的静态内容,也可以调用当前类的成员内容
      3、创建对象时,成员变量和构造代码块是从上往下,顺序执行,建议将成员变量放在前面
      4、在代码块中定义的变量,则只能在该代码块中执行

    3、静态代码块

    • 定义位置:在类中,代码块和方法体之外
    • 定义个数:任意多个
    • 执行顺序:从上往下,依次执行
    • 注意事项:
      1、类加载时就会执行静态代码块中的代码
      2、在静态代码块中,我们只能操作当前类的静态内容
      3、类加载时,静态变量和静态代码块是从上往下,顺序执行,建议将静态变量放在前面
      4、在静态代码块中定义的变量只能在当前代码块中使用
  • 静态代码块、构造代码块和构造方法的执行顺序
    类加载是执行静态代码块,对象创建时,先执行构造代码块,然后执行构造方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值