类和对象

声明: 本文主要作为作者的复习笔记,由于作者水平有限,难免有错误和不准确之处,欢迎读者批评指正.

面向对象的认知

什么是面向对象OOP: 在Java中一切皆对象,找对象,用对象;

类的定义与使用

使用关键字class来定义类;
class 类名称{
// 属性 成员属性, 对象属性
// 方法 成员方法, 对象方法
}

定义Person类
class Person {
// 属性 => 成员变量,这些属性的值和具体的对象有关
String name; // 姓名
int age; // 年龄
String sex; //性别

//吃饭行为 - 成员方法,行为和具体对象有关
public void eat() {

}

//睡觉行为 - 成员方法
public void sleep(){

}

  1. 一个源文件只能存在一个主类(主类必须和源文件名称相同): public class;
  2. class声明的普通类可以存在多个;
  3. 类只是一个模板,没有具体的意义;
  4. 该类的所有对象都具备的成员属性和成员方法(行为)定义在类中;
  5. 不同对象的属性值和具体表现出来的行为都是不同的;

类的实例化 => 通过类产生对象,就称之为类的实例化

  • 在Java中使用关键字class定义的类,相当于在计算机中产生了一个新的类型;
    class Student => Student就和String一样,是一个新的类型;
  • 通过产生的新类型产生具体对象,称之为类的实例化(使用new关键字来产生对象);
    语法格式: 类名称 引用名称 = new 类名称();
    Dog dog = new Dog();
    产生了Dog类的实例化对象,通过该对象"."操作符就可以访问成员属性和成员方法;
  • 类中的成员属性和成员方法都是和具体对象相关的;
  • 对象具体的属性值不同,表现出来的行为也就不同;
  • 成员属性和成员方法必须通过具体的对象来调用;

构造方法

初始化对象调用构造方法,构造方法就是为了产生对象,给对象属性做初始化操作;
Dog dog1 = new Dog(); //构造方法
dog1.barks(); //成员方法(参数)
dog1.wag(); //成员方法(参数)

构造方法特点

  • 构造方法名字与类名称相同,无法自定义方法名称;
  • 构造方法没有返回值类型声明,void;
  • 构造方法在构建对象时,由编译器自动调用,且只在对象产生时调用一次;
  • 若在定义类时,没有明确定义构造方法,则编译器会编译时生成默认的无参构造; 若在类中定义了构造方法,则默认的无参构造就不再生成;
  • 构造方法是在产生对象时由编译器自动调用,为对象初始化服务;

命名不规范的普通方法,不是构造方法:
void Dog(){
//是不是构造方法?(不是)
}

Dog dog = new Dog();
这一行代码背后JVM具体做的事情:

  1. 先检测Dog这个类是否被加载到JVM中; 类加载是一个比较复杂的问题,简单理解就是Dog这个类是否已经被加载到内存中,没有就加载到JVM中,否则就执行下一步; JVM运行起来可能会加载上万个类,也有很多类不是立即加载的; 程序中可能会自定义非常多的类,这些类不是程序一启动就加载进来的,而是用谁再加载谁;
  2. 执行关键字new,看到new就在堆上开辟空间; 为对象在堆上开辟空间,开辟的内存大小以这个类中成员属性的类型和个数来定; Java中对象到底存放在内存的哪个具体的位置,又是如何寻址的,我们是无法知道的; 内存的寻址是JVM来运行的,引用数据类型的大小是由JVM动态计算的,对程序员和用户不可见;
  3. 调用构造方法为每个成员属性赋初始值 => 构造方法就是在产生对象时给属性赋值的;

编译器的就近原则

程序中调用一个变量或方法时编译器查找属性/方法有优先级,优先查找距离调用位置最近的变量或方法,找到了就直接调用.

this

  • this修饰成员变量
    使用this.属性名称 => 直接从类中寻找同名变量,打破就近匹配原则;
  • this修饰方法
    this修饰成员方法,表示调用类中成员方法; 当有继承关系之后,明确调用的是当前类的成员方法;
    语法: this.方法名称
  • this调用构造方法(构造方法之间才能互相调用)
    语法: this(参数); //表示调用构造方法;
  • this表示当前对象引用
    当前是通过哪个对象来调用的方法或属性,this就指代谁(可以把this当成一面镜子,当镜子前站的是哪个对象,this就指代谁);

构造方法的调用

  • 构造方法只能通过产生对象时,由编译器来自动调用,为成员变量赋初始值;
  • 成员方法中不能调用构造方法;
  • 构造方法之间可以互相调用;
  • 构造方法是为了属性做初始化,不同的构造方法可能为不同属性赋值;
  • this构造方法调用必须写在构造方法首行,在当前的构造方法中调用其他的构造方法语句必须写在当前构造方法的首行;
  • this的构造方法调用不能成环,是线性的,例如两个参数的有参构造调用一个参数的有参构造,然后一个参数的有参构造调用无参构造;
  • 必须等待其他构造方法调用结束之后再执行当前其他属性的构造,有先后关系,你依赖别的构造方法先执行结束再调用当前的初始化逻辑;

static关键字以及用法

static表示静态,与类相关,和具体的对象无关;

  • static修饰属性,称之为类属性,静态属性,存放在JVM的方法区;
    当某个类的所有对象对于某一个属性,大家属性值都相同,该属性就应该设计为类属性,和类强相关,和具体的对象无关;
    要在类中定义类属性,使用static关键字; 类属性和类强绑定,没有对象也能用;

  • static修饰方法 - 类方法,直接通过类名称调用,与对象无关;
    例如: JDK中Math - 数学类; Math.max(a,b) => 通过Math类直接调用;
    Arrays - 数组工具类 Arrays.copyOf(); Arrays.toString(); Arrays.sort();

  • static修饰的静态域(静态属性,静态方法)和成员域(成员属性和成员方法)之间的关系;
    不能在任何静态域中访问成员域(方法、属性);
    在成员方法中可以调用静态属性或静态方法,但不推荐,一般直接使用类名称来访问静态域;
    static无法直接修饰外部类(*.java中直接定义的类) ;
    static可以修饰内部类(一个类嵌套在另一个类的内部);

  • static变量的初始化
    构造方法一般初始化的都是成员属性,构造方法是产生对象时为对象初始化的;
    静态变量一般就地初始化或者在静态代码块中初始化;

代码块

使用{}定义的一段代码称之为代码块; 根据代码块出现的位置以及关键字的不同,分为以下四种代码块:

  • 普通代码块: 直接定义在方法内部,不加任何修饰符定义的代码块称之为普通代码块 => 解决变量重名问题;

  • 构造块: 直接定义在类中,使用{}的代码块称之为构造块;
    按照书写顺序从上到下执行; 构造块优先于构造方法执行;
    编译后,会将多个构造块中的所有代码按照顺序编译到构造方法的源代码之前,统一合并到构造方法中;

  • 静态变量块: 使用static修饰,直接定义在类中的代码块称之为静态代码块(一般用于初始化静态变量);
    静态代码块在类加载时执行一次,和具体产生对象无关; 若有多个静态代码块,按照代码的书写顺序依次执行;
    主类中的静态代码块还会优先于主方法执行; main存在于主类中,要执行主方法首先得将主类加载到JVM中,当主类一加载,主类中的静态块就会自动执行;

堆区: 类中的所有对象默认共享此内存区域;

方法区: 类中的静态变量,常量存储在方法区;

  • Java中不支持在方法中定义静态变量,在方法中定义的一律都是局部变量,都在栈帧中存储;
  • 成员方法必须通过对象调用;
  • 静态变量没有对象,直接通过类调用;
  • 静态属性通过类名称直接调用,引用值为null时,只有调用成员方法或者成员变量才会抛出空指针异常,静态变量或者静态方法不会报错;

拓展

  • 类中的变量都有默认值,默认值就是其数据类型的默认值;
  • 成员变量所有的赋值操作都在构造方法中进行;
  • 成员变量是和对象强绑定的,当产生对象时,成员变量才会开辟空间并赋值;
  • 定义类时只有类型声明没有赋值;
  • 构造方法就是为了成员变量赋值的,因此构造方法也可以重载,重载只是参数的个数不同; 此处构造方法的重载与类型无关,因为类型在类中定义过了,我们只是决定在不同的构造方法给哪些属性赋值而已; 无参构造都是默认值,一个都不赋值; 有参构造就根据参数的个数来决定赋值哪几个成员变量;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值