Java学习笔记-类和对象

一、类

1.概述

类是对现实生活中一类具有共同特征的事物的抽象。它描述一类对象的状态和行为。

例如,汽车可以作为一个类,它具有颜色、品牌等属性,有行驶和刹车等行为。

Java中的类一般包含变量、常量、程序块、方法等:

public class Car {
        String color;
        String brand;
        BigDecimal price;

        void run() {

        }

        void brake() {
            
        }
}

一个car类,包含了三个变量,两个方法

2.方法

Java的方法是语句的集合,方法中的语句放在一起执行一个功能

  • 方法是解决一类问题的步骤的有序组合

  • 方法包含于类或对象中

  • 方法在程序中被创建,在其他地方被引用

方法包含方法头方法体;

方法头的组成:修饰符 返回值类型 方法名 形参

例如:public String run(String carName)

  • 修饰符:是可选的,没有时会有默认值,存在访问控制修饰符和非访问控制修饰符两种
  • 返回值类型:声明该方法执行完成后返回的结果类型,void 代表该方法没有返回结果
  • 方法名:方法的实际名称。方法名和参数表共同构成方法签名。
  • 形参:当方法被调用时,可能会传递值给参数,参与方法内的逻辑判断或运算等,形参类似一个占位符,参数列表指形参的类型,顺序和参数个数,一个方法的参数列表可以为空
  • 方法体:方法包含的具体语句,定义该方法的功能。

方法表示类所具有的行为。

2.1.main方法

类的主方法

main方法是被JVM(Java虚拟机)调用的,main方法为一个程序的执行入口,当一段程序被执行时,main方法第一个执行。

main()方法的方法头是固定不变的:public static void main(String[] args);

2.2.构造方法

构造方法,是Java中一种特殊的方法,其方法名与类名相同,构造方法在对象建立时就运行,且只会运行一次,所以其主要用来初始化成员属性和成员方法的,每个类都有构造方法,如果没有手动编写构造方法,java会自动在该类中添加一个默认的空参数的构造方法。

一个类中可以有多个构造方法,但是其参数列表不可相同(重载的形式);

2.3.静态方法

使用static修饰的方法;

静态方法中,只可以访问静态变量;

在非静态方法中,不可以调用静态方法;

在静态方法中,不能使用super和this关键字;

在当前类的静态方法中,可以通过方法名直接调用其他静态方法;

在非静态方法中,需要通过对象.方法名来调用;

在其他类中可以直接通过类名来调用,即类名.方法名;

静态方法和普通方法的区别:

1.调用方式不同

2.静态方法会被分配一块固定的内存空间,普通方法是会随着对象的调用而加载,使用完后释放内存,动态的分配内存空间。所以普通方法更节省内存,而静态方法运行更快。所以当一段程序中存在过多静态方法时,会长时间占用大量内存。

3.代码块

在Java中,使用”{}”括起来的代码称为代码块;

方法属于普通代码块;

3.1.构造块

用{}括起来的代码段,构造块在创建对象时会被调用,每次创建对象时都会被调用,并且优先于类构造函数执行。

3.2.静态块

用static{}括起来的代码段,只会被执行一次第一次加载此类时执行,静态块优先于构造块执行。

3.3.同步代码块

使用synchronized(obj){}括起来的代码块,主要用于多线程环境下(后续学习-TODO;)

简单示例

public class Car {

    //变量 color和brand
    String color;
    String brand;

    //带String类型参数的构造方法
    Car(String color) {
        System.out.println("带String类型参数的构造方法,初始化汽车颜色");
        this.color = color;
    }

    //不带参数的构造方法
    Car() {
        System.out.println("不带参数的构造方法,初始化汽车品牌");
        this.brand = "奥迪";
    }

    //构造块
    {
        System.out.println("构造块内的程序执行了");
    }

    //静态块
    static {
        System.out.println("静态构造块内的程序执行了");
    }

    //返回String类型的成员方法
    public String getColor() {
        return this.color;
    }

    //带参数,无返回值的方法
    void run(String carColor) {
        System.out.println("一辆" + carColor + "的汽车正在行驶");
    }

    //静态方法
    static void stop(String carColor){
        System.out.println("一辆" + carColor + "的汽车停下了");
    }

    public static void main(String[] args) {
        String color;
        //实例化一个car对象,此对象创建时,传入一个String参数,所以匹配到带参数的构造方法
        Car car = new Car("红色");
        //调用getColor方法获取汽车颜色
        color = car.getColor();
        //调用run方法
        car.run(color);
        stop(color);

        //实例化一个car对象,此对象创建时,没有传入参数,所以匹配到不带参数的构造方法
        Car car1 = new Car();
    }
}

执行后控制台打印结果:
静态构造块内的程序执行了
构造块内的程序执行了
带String类型参数的构造方法,初始化汽车颜色
一辆红色的汽车正在行驶
一辆红色的汽车停下了
构造块内的程序执行了
不带参数的构造方法,初始化汽车品牌

以上示例中简单实现了不同类型的方法和代码块,通过执行结果可以看出它们之间的执行顺序和执行次数;

二、对象

对象是类的一个实例,有状态和行为

比如,汽车是一个类,五菱宏光S就是一个实例对象,其具有颜色、排量、车速等属性,以及启动、加速、刹车等行为。

对象的声明:声明一个对象,包括对象名称和类型。

对象实例化:使用new关键字创建一个对象,在内存中产生一个实际的类的实例,分配内存空间。

对象初始化:创建对象时,调用类的构造方法,对对象进行初始化。

在Java中创建对象:

public class Car {
    String color;
    String brand;

    //带String类型参数的构造方法
    Car(String color, String brand) {
        System.out.println("初始化汽车属性");
        this.color = color;
        this.brand = brand;
    }
	
    //行驶方法
    void run() {
        System.out.println("一辆" + this.color + "的" + this.brand + "汽车正在行驶");
    }

    public static void main(String[] args) {
        //创建一个对象
        Car wuLing = new Car("灰色","五菱宏光S");

        //创建一个对象
        Car audi = new Car("黑色","奥迪Q5");

        //创建了两个对象,分别是wuLing和audi,它们都具有颜色和品牌两个属性,都有行驶的行为
        System.out.println("一辆" + wuLing.color + "的" + wuLing.brand);
        System.out.println("一辆" + audi.color + "的" + audi.brand);

        //调用行驶方法
        wuLing.run();
        audi.run();
    }
}

程序执行结果:
    初始化汽车属性
    初始化汽车属性
    一辆灰色的五菱宏光S
    一辆黑色的奥迪Q5
    一辆灰色的五菱宏光S汽车正在行驶
    一辆黑色的奥迪Q5汽车正在行驶

从以上实例可以看出,一个类可以被实例化出多个对象,这些对象都可以具有类所拥有的属性和行为。

从执行结果可以看出,在对象被创建时,类的构造方法就已经执行。类是不占用内存的,对象在创建时分配内存。

三、this关键字

在Java中,this关键字指向当前对象的引用,可以理解为其代表当前对象。也就是哪个对象调用了this所在的方法,this就代表哪个对象。

例如:

public class Car {
    String color;
    String brand;

    //构造方法
    Car(String color, String brand) {
        System.out.println("初始化汽车属性");
        this.color = color;
        this.brand = brand;
    }

    void run() {
        System.out.println("一辆" + this.color + "的" + this.brand + "汽车正在行驶");
    }

    public static void main(String[] args) {
        //创建一个对象
        Car wuLing = new Car("灰色", "五菱宏光S");

        System.out.println("一辆" + wuLing.color + "的" + wuLing.brand);

        //调用行驶方法
        wuLing.run();
    }
}

在以上代码中,定义了一个car类,car类具有两个成员变量,一个构造方法,一个run()方法,在main方法中创建了wuLing对象

  1. 在创建对象时,调用car的构造方法,构造方法中对this.color和this.brand进行了赋值,因为此时创建的是wuLing对象,所以this代表wuLing,this.color也就代表wuLing对象的color;

  2. 在wuLing对象创建之后,调用了run方法,run方法中存在this.color和this.brand参数,因为是wuLing对象调用的run方法,所以其中的this代表wuLing,this.color也就代表wuLing对象的color;

简单理解了this关键字之后,再了解一下它具体有哪些用法

  1. 用于区分成员变量和局部变量

    在上述代码中存在构造方法,构造方法带有 color、brand两个形参,而Car类中具有同名的两个成员变量,而使用this关键字,可以标明哪个是成员变量,否则会因为无法区分,而初始化值失败。

    Car(String color, String brand) {
        System.out.println("初始化汽车属性");
        this.color = color;
        this.brand = brand;
    }
    

    再看下一个例子:

    public class Car {
        String color;
        String brand;
    
        //带String类型参数的构造方法
        Car(String color, String brand) {
            System.out.println("初始化汽车属性");
            this.color = color;
            this.brand = brand;
        }
    
        void run() {
            System.out.println("一辆" + this.color + "的" + this.brand + "汽车正在行驶");
        }
    
        void test(){
            String color;
            color = "红色";
            System.out.println(color);
            System.out.println(this.color);
            this.run();
        }
    
        public static void main(String[] args) {
            //创建一个对象
            Car wuLing = new Car("灰色", "五菱宏光S");
    
            //调用行驶方法
            wuLing.test();
        }
    }
    
    初始化汽车属性
    红色
    灰色
    一辆灰色的五菱宏光S汽车正在行驶
    

    在上述程序中,test方法中声明了一个局部变量color,并赋值为"红色",而类中还具有一个同名的成员变量,在创建对象时初始化为"灰色",通过执行结果可以看出,使用this关键字便可以区分出哪个是成员变量,哪个是局部变量。

    而且,既然它代表着当前对象,所以也可以用来调用方法,比如在test方法中执行的this.run();

  2. 用于在构造方法中调用其他构造方法。

    例如:

    public class Car {
        String color;
        String brand;
    
        //带String类型参数的构造方法
        Car(String color, String brand) {
            this();
            System.out.println("带参构造方法,初始化汽车属性");
            this.color = color;
            this.brand = brand;
        }
    
        Car(){
            System.out.println("无参构造方法");
        }
    
        public static void main(String[] args) {
            //创建一个对象
            Car wuLing = new Car("灰色", "五菱宏光S");
        }
    }
    
    执行结果:
    无参构造方法
    带参构造方法,初始化汽车属性
    

    在上述代码中,存在Car(String color, String brand)与Car()两个构造方法,Car(String color, String brand)中的this();语句就代表着执行构造方法Car()。同样Car()构造方法也可以是一个带参的构造方法,比如:Car(参数类型 参数名),将this();改为this(参数); 即可。

    需要注意的是:在构造方法中如果使用this();那么它必须放在第一行,否则会编译报错。也就是说this();所调用的构造方法不可影响当前构造方法的初始化结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值