java类和对象的详解

一*相关的概念:

1.1.面向对象简述:

java是一门纯面向对象的语言(Object Oriented Program,继承OOP),在java面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要是要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对于事物的认知,对于大型程序的设计,扩展以及维护都非常友好。

三个基本特征:

(1)封装:保护内部的操作不被破坏,隐藏代码的实现细节;
(2)继承:在父类的基础之上继续在子类内部进行扩充;
(3)多态:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

1.2.类的简述:

类是用来对对象进行描述的,它主要是描述这一类的对象共同的一些属性或者行为。

例1:创建类

public class Student{

    int age;
    String name;//字段(属性)或者成员变量
    

    public void learning(){
        
        System.out.println("正在学习");

    }
    
    public void playing(){//行为或者成员方法

        System.out.println("正在玩耍");

    }
}

class为定义类的关键字,Student为类名,{}中为类的主题。类中包含的内容称为类的成员。属性主要是是用来描述这个类,称为类的成员属性或者类的成员变量。方法主要是说明类具有哪些功能或者有哪些行为,称为类的成员的方法。


1.3.对象的简述:

当类创建好后,通过这个类去创建一个具有类的属性或者行为的实体,这个实体就是对象。

例2:创建对象

public class Student{

    int age;
    String name;//字段(属性)或者成员变量
    

    public void learning(){

        System.out.println("正在学习");

    }
    
    public void playing(){//行为或者成员方法

        System.out.println("正在玩耍");
    }
}

public class Test{

    public static void mian(String[] args){
        
        Student s1=new Student();//通过new实例化对象
        Student s2=new Student();
        s1.name="张三";    
        s1.age=21;
        s1.learning();
        s1.playing();
    }
}

通过new关键字来实例化对象,即创建一个对象。使用 . 来访问对象中的属性和方法。同一个类可以创建多个对象。

二*类和对象的说明:

2.1.类是对象的模板。

2.2.对象是这个类的具体实现。

2.3.类是一种自定义的类型,可以用来定义变量。

2.4.实例化出的对象才能实际存储数据,占用空间。

三*对象的构造:

3.1.概念:

构造方法:是一个特殊的成员方法(也称为构造器)。名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象生命周期只调用一次。注意:  当没有自己显式定义一个构造方法时,编译器会自动提供一个默认的无参构造方法。但是当自己定义后,编译器就不会提供默认的无参构造方法。

例3:构造方法

public class Date{

    public int year;
    public int month;
    public int day;

    //无参的构造方法
    public Date(){
        this.year=2022;
        this.month=6;
        this.day=15;
}


    //带有参数的构造方法
    public Date(int year,int month,int day){
        this.year=year;        //this 表示对于当前的对象的引用
        this.month=month;
        this.day=day;
}

    public void printDate(){
        System.out.println(year+"-"+month+"-"+day);
}

    public static void main(String[] args){
    
            Date.date1=new Date();
            date1.printDate();
            Date.date2=new Date(2022,6,15);
            date2.printDate();
    }
}

这里如果没有自定义无参的构造方法,Date.date1=new Date();就会报错,因为此时有自定义有参的构造方法后,编译器不会默认提供无参的构造方法了。所以当实例化对象时,要注意是否有参数,如果同时存在有参和无参,这个时候就要自定义无参的构造方法了,不然就会报错。

例4.在构造方法中调用另一个构造方法:

public class Date{

    public int year;
    public int month;
    public int day;

    //无参的构造方法
    public Date(){
        this(2022,6,15)        //this()调用另一个有参的构造方法
}


    //带有参数的构造方法
    public Date(int year,int month,int day){
        this.year=year;        //this 表示对于当前的对象的引用
        this.month=month;
        this.day=day;
} 
    public void printDate(){
        System.out.println(year+"-"+month+"-"+day);
}

    public static void main(String[] args){
    
            Date.date1=new Date();
            date1.printDate();
}

注意:this引用

1.this表示当前所实例化对象的引用,存了当前对象的地址,故this.+属性/方法可以访问到类中的成员变量和成员方法。

2.this只能在"成员方法"中使用,且只能引用当前的对象,不能引用其他的对象。

3.this(...)在构造方法中可以调用另一个构造方法,但是必须是在该构造方法中的第一条语句,其次不能形成闭环,即构造方法A与构造方法B相互调用。

显然上述的构造方法,由于方法名相同,参数列表不同,构成了方法的重载。

3.2构造方法的作用:

就是对对象中的成员进行初始化,但并不负责给对象开辟空间。

四*对象的初始化:

4.1.默认初始化:

成员变量在定义时,没有给初始值,编译器默认会初始化

例子5:默认初始化

public class Date{

    public int year;//编译器默认为对应类型的0值
    public int month;
    public int day;

    public Date(){
        System.out.println(this.year);
        System.out.println(this.month);
        System.out.println(this.day);
    }
    public static void main(String[] args){
    
        Date d=new Date();
    }
}

4.2.就地初始化:

在声明成员变量时,就直接给出了初始值

例子6:就地初始化

public class Date{

    public int year=2022;
    public int month=6;
    public int day=15;
    public static void main(String[] args){
        Date d = new Date();
        System.out.println(d.year+"-"+d.month+"-"+d.day);
    }
}

五*关于new这条语句,在JVM层面处理的过程:

5.1.检测对象对应的类是否加载了,如果没有加载则加载;

5.2.为对象分配内存空间;

5.3.处理并发安全问题;(比如多线程同时申请对象,JVM要保证给对象分配的空间不冲突)

5.4.初始化所分配的空间(即对象空间被申请好后,对象中包含的成员已经设置好了默认的初始的"0"值)。

5.5.设置对象头信息。

5.6.调用构造方法,给对象中各个成员赋值

你可能感兴趣的:(java,开发语言)