Java之类和对象(一)

目录

1、面向对象

1.1.什么是面向对象

1.2面向对象与面向过程

1.2.1传统洗衣服过程

1.2.2现代洗衣服过程

2、类定义和使用

2.1认识类

2.2类的定义格式

2.3定义一个狗类

3.类的实例化

3.1类的实例化

3.2类和对象的说明

4.this引用

4.1this引用的缘由

4.2什么是this引用

4.3this引用的特性

5.对象的构造及初始化

5.1如何初始化对象

5.2构造方法

5.3构造方法特性


目录

1、面向对象

1.1.什么是面相对象

1.2面向对象与面向过程

1.2.1传统洗衣服过程

1.2.2现代洗衣服过程

2、类定义和使用

2.1认识类

2.2类的定义格式

2.3定义一个狗类

3.类的实例化

3.1类的实例化

3.2类和对象的说明

4.this引用

4.1this引用的缘由

4.2什么是this引用

4.3this引用的特性

5.对象的构造及初始化

5.1如何初始化对象

5.2构造方法

5.3构造方法特性


1、面向对象

1.1.什么是面向对象

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

1.2面向对象与面向过程

1.2.1传统洗衣服过程

 正如上图所示,传统的方式:注重的是洗衣服的过程,少了一个环节可能都不行。

1.2.2现代洗衣服过程

 基本上现代洗衣服是依靠洗衣机来进行。

1.总共有四个对象:人、衣服、洗衣粉、洗衣机。
整个洗衣服的过程:人将衣服放进洗衣机、倒入洗衣粉,启动洗衣机,洗衣机就会完
成洗衣过程并且甩干。
整个过程主要是:人、衣服、洗衣粉、洗衣机四个对象之间交互完成的,人不需要关
新洗衣机具体是如何洗衣服的,是如何甩干的。

2.以 面相对象方式来进行处理,就不关注洗衣服的过程 ,具体洗衣机是怎么来洗衣服,如何来甩干的,用户不用去关 心,只需要将衣服放进洗衣机,导入洗衣粉,启动开关即可,通过对象之间的交互来完成的
注意:面向过程和面相对象并不是一门语言,而是解决问题的方法,没有好坏之分,都有其专门的应用场景。

2、类定义和使用

2.1认识类

类是用来对一个实体 ( 对象 ) 来进行描述的 ,主要描述该实体 ( 对象 ) 具有哪些属性 ( 外观尺寸等 ) ,哪些功能 ( 用来干啥 ) , 描述完成后计算机就可以识别了。
比如:洗衣机,它是一个品牌,在 Java 中可以将其看成是一个类别。
属性:产品品牌,型号,产品重量,外观尺寸,颜色 ...
功能:洗衣,烘干、定时 ....

2.2类的定义格式

定义类时需要用到class关键字

// 创建类
class ClassName {
field ; // 字段 ( 属性 ) 或者 成员变量
method ; // 行为 或者 成员方法
}

其中class定义类的关键字,ClassName为类的名字,{}中为类的主体。

类中包含的内容称为类的成员。属性主要是用来描述类的,称之为类的成员属性或者类成员变量。方法主要说明类具有哪些功能,称为类的成员方法。

例:将洗衣机类在计算机中定义完成,经过javac编译之后形成.class文件,在JVM的基础上计算机就可以识别了。

class WashMachine{//类名采用大驼峰
    public String brand; // 品牌
    public String type; // 型号
    public double weight; // 重量
    public double lenght; // 长
    public double weidth; // 宽
    public double height; // 高
    public String color; // 颜色
    public void WashClothes(){ // 洗衣服
        System.out.println("洗衣功能");
    }
    public void dryClothes(){ // 脱水
        System.out.println("脱水功能");
    }
    public void setTime(){ // 定时
        System.out.println("定时功能");
    }
}
注意
  • 类名注意采用大驼峰定义
  • 成员前写法统一为public
  • 此处写的方法不带 static 关键字

2.3定义一个狗类

class Dog{
    //属性----》字段
    public String name="阿黄";//属性在方法的外面,在类的里面-----》叫做成员属性
    public int age=8;
    public String color="黑色";//如果是静态成员变量需要加上static

    public void eat(){//属性

        System.out.println("吃饭!");
    }

    public void bark(){//行为
        System.out.println("汪汪!");
    }
}
注意事项:
1. 一般一个文件当中只定义一个类
2. main 方法所在的类一般要使用 public 修饰
3. public 修饰的类必须要和文件名相同
4. 不要轻易去修改 public 修饰的类的名称,如果要修改,通过开发工具修改
5.当成员变量没有初始化的时候,他们的值都是默认值.
引用类型都是null,简单类型都是对应的0值.

 

3.类的实例化

3.1类的实例化

定义了一个类,就相当于在计算机中定义了一种新的类型 ,与 int double 类似,只不过 int double java 语言自带 的内置类型,而类是用户自定义了一个新的类型,比如上述的:PetDog 类和 Student 类。它们都是类 ( 一种新定义的 类型) 有了这些自定义的类型之后,就可以使用这些类来定义实例 ( 或者称为对象 )
用类类型创建对象的过程,称为类的实例化 ,在 java 中采用 new 关键字,配合类名来实例化对象。

例:对于上面定义的狗类来说,用main方法在类中进行一个实例化对象

 public static void main(String[] args) {
       Dog dog=new Dog();//通过new关键字实例化一个对象
        System.out.println(dog.name);//快捷键dog.name.sout---》阿黄
        dog.name="旺财";
        System.out.println(dog.name);//旺财
    }

 注意事项

  • new 关键字用于创建一个对象的实例
  • 使用 “.”来访问对象中的属性和方法.
  • 同一个类可以创建多个实例.

3.2类和对象的说明

1. 类只是 一个 模型 一样的东西,用来对一个实体进行描述,限定了类有哪些成员 .
2. 类是一种自定义的类型 ,可以用来定义变量,但是 在Java 中用类定义出来的变量我们成为对象 .
3. 一个类可以实例化出多个对象, 实例化出的对象 占用实际的物理空间,存储类成员变量
4. 做个比方。 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图 ,只设计出需要什么东 西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

4.this引用

4.1this引用的缘由

对于如下一个日期类来说

public class MyDate {

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

    public void setDay(int y,int m,int d){
        year=y;
        day=d;
        month=m;
    }

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

    public static void main(String[] args) {
        MyDate myDate=new MyDate();
        myDate.setDay(2023,4,5);
        myDate.printDay();
    }
}

运行结果为

 问题1:当形参名不小心与成员变量名相同时:

public void setDay ( int year , int month , int day ){
year = year ;
month = month ;
day = day ;
}

那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?

问题2:声明两个实例化对象时,调用的是哪一个方法

public static void main(String[] args) {
// 构造三个日期类型的对象 d1 d2 
Date d1 = new Date();
Date d2 = new Date();
// 对d1,d2的日期设置
d1.setDay(2020,9,15);
d2.setDay(2020,9,16);

// 打印日期中的内容
d1.printDay();
d2.printDay();

}
两个对象都在调用 setDay printDay 函数,但是这两个函数中没有任何有关对象的说明, setDay printDay 函数如何知道打印的是那个对象的数据呢
一切让 this 引用来揭开这层神秘的面纱。

4.2什么是this引用

java 编译器给每个 成员方法 增加了一个隐藏的引用类型参数,该引用参数指向当前对象 ( 成员方法运行时调用该成 员方法的对象 ) ,在成员方法中所有成员变量的操作,都是通过该引用去访问 。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

 如上图所示,this.year指的是public int year中的year,等式后面的year指的是局部变量中的

year

运行如下代码

public class MyDate {

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

    public void setDay(int year,int month,int day){
        /**
         * year=year;
         * day=day;
         * month=month;
         */
        this.year=year;
        this.day=day;
        this.month=month;
    }

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

    public static void main(String[] args) {
        MyDate myDate=new MyDate();
        myDate.setDay(2023,4,5);
        myDate.printDay();

        MyDate myDate1=new MyDate();
        myDate1.setDay(2023,3,5);
        myDate1.printDay();
    }
}

运行结果为

 this引用是编译器自动添加的,用户在实现代码时一般不需要显式给出。

注意: this 引用的是调用成员方法的对象

4.3this引用的特性

1. this 的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this 只能在 " 成员方法 " 中使用
3. " 成员方法 " 中, this 只能引用当前对象,不能再引用其他对象,具有 final 属性
4. this 成员方法 第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this 负责来接收
5.this不 可以为空

this有3种用法:

  1. this.成员变量(普通的成员变量不能是静态的)
  2. this.成员方法(普通的成员方法不能是静态的)
  3. 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.printDate();
d.setDate(2023,4,5);
d.printDate();
}
// 代码可以正常通过编译

5.2构造方法

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

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


    public MyDate(){
        this(2023,4,4);//调用带有3个参数的构造方法,等打印完在进行下一行
        System.out.println("不带参数的构造方法");
       // this(2023,4,4);//报错,this在构造方法中调用其他的构造方法必须放在第一行
    }

    public MyDate(int year,int month,int day){

        this.year=year;
        this.day=day;
        this.month=month;
        System.out.println("带3个参数的构造方法");
    }


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

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

    public static void main(String[] args) {
        MyDate myDate=new MyDate();
    }

    public static void main2(String[] args) {
        //MyDate myDate=new MyDate();
        MyDate myDate=new MyDate(2023,4,5);

    }

    public static void main1(String[] args) {

         MyDate myDate=new MyDate();

                  myDate.setDay(2023,4,5);
                  myDate.printDay();

                  MyDate myDate1=new MyDate();
                  myDate1.setDay(2023,3,5);
                  myDate1.printDay();
    }
}
一个对象的产生,最起码分为2步:(new......)
1、为对象分配内存
2、调用合适的构造方法(构造方法不止一个)

构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。

 当我们没有提供任何的构造方法的时候,编译器会帮我们提供一个不带参数的构造方法,也就是说,一个类至少有1个构造方法。
但是当类中写了两个构造方法时,删除了一个,还有一个构造方法时,此时系统不提供构造方法

5.3构造方法特性

1. 名字必须与类名相同
2. 没有返回值类型,设置为 void 也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次 ( 相当于人的出生,每个人只能出生一次 )
4. 构造方法可以重载 ( 用户根据自己的需求提供不同参数的构造方法 )

当两个方法的方法名相同,参数类型不同时,构成了重载 ,如下图:

 当调用不带参数的构造方法时:

 当调用带3个参数的构造方法时:

无参数的构造方法也是可以通过this调用参数的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张张_张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值