【Java SE】Java中的类和对象

1. 初步认识

1.1 基本概念

类是一种高配的结构体,对C语言来说,结构体只能表示事物的属性,但对于Java中的类来说,既能表示属性也能表示行为(方法)。

类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了。 类是用来对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥),描述完成后计算机就可以识别了.

2. 类的定义

2.1 类的定义和使用

public class 类名{
    属性
    方法
}
类名 对象名 = new 类名();
public class WashMachine {
    public String brand; //品牌
    public String type; // 机型
    public double weight; //重量
    public String color; //颜色

    public void washClothes(){ //洗衣服
        System.out.println("洗衣功能");
    }
    public void dryClothes(){
        System.out.println("脱水功能");
    }
    public void setTime(){
        System.out.println("定时功能");
    }
}

2.2 类的定义的注意事项:

1.定义类的时候一般是一个文件中只定义一个类.(一个文件也可以定义多个类,但要求只能有一个类是public)
2.当指定了public的类之后当前的文件名,必须和public的类名是一致的
3.Java中没有“声明"这样的说法

3. 类的实例化(创建对象)

和数组类似都需要new 关键字

Dog dog = new Dog();

dog变量名也是一个引用类型,new出来的对象都在堆上创建新空间

Dog dog1 = new Dog();
dog1.name = "大黄";
Dog dog2 = new Dog();
dog2.name = "小黑";

使用dog 调用name,就是根据dog中的引用找到对应的name
使用dog2调用name,就是根据dog2的引用找到对应的 name

注意事项:


类中方法

JVM中有一个专门的内存空间,称为“方法区",一个类中的方法,都是只在内存中有一份的.被所有的对象共用.

4. this引用

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。

public class Data {
    public int year;
    public int month;
    public int day;
    public void setDate(int year, int month, int day){
        year = year;
        month = month;
        day = day;
    }
}

上面的部分,编译器见到year时会首先把year理解成形参。

public void setDate(int year, int month, int day){
    this.year = year;
    this.month = month;
    this.day = day;
}

this是一个特殊的引用,只能在方法中使用,作用就是表示当前的实例。

Data day1 = new MyData();
day1.setDate(2025,2,25);

通过day1来调用setDate方法,day1这个引用就是setData中的this

针对第二点,如果给方法加上static,就无法使用this

5. 对象的构造及初始化

5.1 如何初始化对象

在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败。

public static void main(String[] args) {
    int a;
    System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a

要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。如果是对象:

public static void main(String[] args) {
    Date d = new Date();
    d.setDate(2025,2,25);
}
// 代码可以正常通过编译

需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。通过上述例子发现两个问题:

1. 每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

5.2 构造方法

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同并且不能有返回值,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

public Date(){


}

可以根据需要写任意个构造方法,满足不同的初始化方式

第一种,不指定参数,类中自动初始化

第二种,在实例化时需要指定参数

package boke;

public class MyData {
    public int year;
    public int month;
    public int day;

    public MyData(){
        year = 2025;
        month = 2;
        day = 25;
        System.out.println("调用第一种构造方法");
    }

    public MyData(int year, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("调用第二个构造方法");
    }

    public static void main(String[] args) {
        MyData day1 = new MyData();
        MyData day2 = new MyData(2025,2,25);
    }
}

构造方法特性:

构造方法中,可以通过this调用其他构造方法来简化代码(但必须在第一行):

public MyData(){
        //System.out.println(year); 注释取消掉,编译会失败
        this(2025,2,25);
}

public MyData(int year, int month, int day){
    this.year = year;
    this.month = month;
    this.day = day;
    System.out.println("调用第二个构造方法");
}

5.3 对象初始化方式

除了构造方法外,还引入了其他的初始化方式

1. 就地初始化,无参数的构造方法可以用下面这种方法代替,更常见的写法。

public class MyData {
    public int year = 2025;
    public int month = 2;
    public int day = 25;
}

2. 代码块初始化

//代码块初始化
{
    year = 2025;
    month = 2;
    day = 25;
    System.out.println("代码块初始化");
}

注意三种初始化的执行顺序.(按下来后面执行的逻辑会覆盖前面的.)

1.就地初始化
2.代码块初始化
3.构造方法


Idea可以快速生成构造方法(按住Alt+Insert)——>constructor(构造方法)

直接打印实例化后的对象:

MyData day1 = new MyData();
System.out.println(day1);

与数组类似,同为引用类型,可以转为字符串,按住Alt+Insert,使用toString方法。toString是一个特殊的方法,当打印对象的时候,编译器会自动调用toString把对象转成String

    public String toString() {
        return "MyData{" +
                "year=" + year +
                ", month=" + month +
                ", day=" + day +
                '}';
    }

6. 包package

在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组,称为软件包,有点类似于目录。

当把某个类放到包中的时候, 此 idea就会自动在类的最上方添加package 语句来声明这个类属于哪个包中。

package object;

Explorer——>windows自带的文件资源管理器

1. 包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如 com.bit.demo1 ).

2. 别人写的代码,通常也会使用包组织,要想使用别人的代码,就需要在你当前代码中,导入对应的包

3. 处于不同包的两个类名一样的类,一般不会报错

import java.util.Date;
public class Package {
    public static void main(String[] args) {
        //使用Java标准库中的Data
        Data data = new Data();
    }
}

7. 封装

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

通常的原则:
1.哪些属性/方法要private,哪些要public,取决于实际的代码场景~~
2.原则上,属性一般都是设为private.方法有些设为public,有些设为private
private修饰的成员变量,在类外无法访问,如下:

public class Student {
    private int id;
    private String name;
    private int age;
    private String gender;
    private double score;
}

Java中的成员变量和局部变量的区别:

有些程序,不允许用户看到成员变量是什么,比如性别,这个时候我们使用getter方法获得该成员变量,也可以使用setter方法设置该变量的内容。(IDEA是能自动生成真正写的时候,根据实际情况分析一下,某个属性是否要给外面进行使用)

public String getGender() {
        return gender;
}

public void setGender(boolean isMale) {
    if(isMale){
        gender = "male";
    } else{
        gender = "female";
    }
}

8. static

8.1 基本概念

在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对
象,是所有对象所共享的。而实例属性,创建多个实例时,这些属性就会有多份。

8.2 static修饰成员变量

没有使用static时:

public class Test {
    public int n = 10;
    public int m = 20;

    public static void main(String[] args) {
        Test t1 =  new Test();
        t1.n = 100;
        t1.m = 200;

        Test t2 = new Test();
        t2.n = 1000;
        t2.m = 2000;
        System.out.println("t1.n=" + t1.n );
        System.out.println("t1.m=" + t1.m );
        System.out.println("t2.n=" + t2.n );
        System.out.println("t2.m=" + t2.m );
    }
}

成员变量m使用static修饰时:

public static int m = 20;

Test.m = 2000;

本身m作为类属性,就应该通过类名.的方式来访问的.Java中,拿着对象.的方式,也能使用

静态成员变量特性(也叫类属性)
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3. 类变量存储在方法区当中
4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁,可以近似的看待程序启动到程序结束)(不加static是伴随对象的一生,new出对象开始,到这个对象被gc了为止)

8.4 static修饰成员方法

Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的(通过类名.方法调用,此时方法内部不能使用实例属性,也不能使用其他实例方法)。注意:static修饰属性,决定属性存储的位置,static修饰方法,不影响方法存储的位置(方法都是在方法区和类在一起)

静态方法中不能使用this!!!而使用实例方法/属性,本质上都是使用this(实例方法中可以调用静态方法或属性)。有this,则四个属性和方法都能用,但是没有this,只能使用静态属性或者方法。

【静态方法特性】
1. 不属于某个具体的对象,是类方法
2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
3. 不能在静态方法中访问任何非静态成员变量

4. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用

9. 代码块

9.1 基本概念和分类

使用{} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:

普通代码块
构造块
静态块
同步代码块(后续讲解多线程部分再谈)

9.2 普通代码块

普通代码块:定义在方法中的代码块.

定义方法{}
if{}
while{}
for{}

9.3 构造代码块

构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。执行时机是在new对象的时候,在构造方法之前

public class Student {
    private int id;
    private String name;
    private int age;
    private String gender;
    private double score;

    public Student(){
        System.out.println("I am Student init()!");
    }
    //实例代码块
    {
        this.name = "子涵";
        this.age = 18;
        this.gender = "male";
        this.score = 4.0;
        System.out.println("I am instance init()!");
    }
}

9.4 静态代码块

使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。在构造代码块之前加static,执行时机是在类加载的时候只执行一次(由于静态的成员,,也能进行“就地初始化"
一般也没有必要专门写静态代码块初始化静态变量)

public class Student {
    private int id;
    private String name;
    private int age;
    private String gender;
    private double score;
    private static String classRoom;

    public Student(){
        System.out.println("I am Student init()!");
    }
    static{

    }
    //实例代码块
    {
        this.name = "子涵";
        this.age = 18;
        this.gender = "male";
        this.score = 4.0;
        System.out.println("I am instance init()!");
    }

    // 静态代码块
    static {
        classRoom = "计科2002";
        System.out.println("I am static init()!");
    }

注意事项
        静态代码块不管生成多少个对象,其只会执行一次
        静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
        如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
        实例代码块只有在创建对象时才会执行。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值