Java之类和对象

1.面向对象

1.1 什么是面向对象?

Java面向对象的概念是指在计算机层程序中,模拟现实世界中的概念,借助对象的描述在计算机中用类似的实体模拟现实世界中的实体。在面向对象的世界里,一切皆为对象,面向对象主要依靠对象之间的交互来完成一件事。

1.2面向对象与面向过程

例如,将大象放进冰箱需要几步?
总共有两个对象,分别为大象和冰箱。
需要三步,打开冰箱门,将大象放进冰箱,关上冰箱门,我们并不需要知道是如何将大象放进冰箱的。
面向对象的方法来处理问题,就不需要关注将大象放进冰箱的过程,是通过对象之间的交互来完成的

2. 类的定义和使用

面向对象关注的是对象,是现实生活中的实体,例如一名学生,他有名字,学号,性别,班级,年龄,生日,籍贯等属性,这些属性是对这个学生的描述。

2.1 类

类就是对一个对象进行描述的,例如上面的学生的例子。

2.2 类的定义

在Java中是这样定义类的
要用到class关键字,class是定义类的关键字。

class ClassName{
	field;//成员变量
	method;//成员方法
}

例如:

class Student {
    public int id;//学号
    public String name;//姓名
    public String sex;//性别
    public String birthday;//生日
    public String birthplace;//籍贯

    //学习
    public void study(){
        System.out.println("正在学习");
    }
    
    //吃饭
    public void eat(){
        System.out.println("正在吃饭");
    }
    
    //睡觉
    public void sleep(){
        System.out.println("正在睡觉");
    }
}

注意

  1. 类名建议采用大驼峰方式
  2. 刚学习如何定义类,成员变量前统一使用public关键字
  3. 成员方法前不使用static关键字

2.3例题

定义一个狗类,当然是我最喜欢的仔仔啦!嘻嘻在这里插入图片描述
仔仔的属性有名字,性别,年龄,颜色……,成员方法有睡觉,吃饭,加启动(竖中指)bushi,狗叫……

让我们来一起实现下

public class Dog {
    public String name;
    public String sex;
    public int age;
    public String color;
    
    public void sleep(){
        System.out.println(name + "在睡觉");
    }
    
    public void eat(){
        System.out.println(name + "在吃红烧肉");
    }
    
    public void bark(){
        System.out.println(name + "在狗叫");
    }
}

注意

  1. 建议一个Java文件只定义一个类
  2. main方法所在的类一般要使用public修饰
  3. public修饰的类必须和文件名相同
    例如,一个Java文件中定义了许多类,被public修饰的类一定要与文件名相同

不相同时就会出错
在这里插入图片描述

  1. 改类名的时候需要通过开发工具改,不要直接在代码中改

在这里插入图片描述

3. 类的实例化

用类类型创建对象的过程,就是类的实例化
就像我定义了狗这个类,我想实例化仔仔这个对象。在Java中使用new关键字来实例化对象。用 . 来访问对象的成员变量和成员方法。

public class Main {
    public static void main(String[] args) {
        Dog dog1 = new Dog();
        dog1.name = "仔仔";
        dog1.color = "屎色";

        dog1.eat();
        dog1.bark();

        Dog dog2 = new Dog();
        dog2.name = "小白";
        dog2.color = "白色";

        dog2.sleep();
        dog2.eat();
    }
}

在这里插入图片描述
仔仔在吃红烧肉,嘻嘻
在这里插入图片描述
每人限领一个!!!
在这里插入图片描述

一个类中可以创建多个实例。

画JVM布局分布图,加深理解
在这里插入图片描述

4.this引用

让我们来看下列代码,一起了解为什么要使用this关键字

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

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

    public void printDate(){
        System.out.println(year + "-" + month + "-" + day);
    }
}
public static void main(String[] args) {
        Date date1 = new Date();
        Date date2 = new Date();
        Date date3 = new Date();

        date1.setDate(2014, 5, 4);
        date2.setDate(2024, 6, 2);
        date3.setDate(2021, 3, 4);

        date1.printDate();
        date2.printDate();
        date3.printDate();
    }

当我们在编写setDate方法时,形参与成员变量相同,如下代码所示

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

那到底是谁给谁赋值呢?
我们在main函数中创建了三个对象,当三个对象同时调用setDate和printDate方法时,两个方法是如何知道打印的是哪个数据?

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

所以Date类可以这样写

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

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

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

注意

  1. this只能在成员方法中使用
  2. this在成员方法中只能引用当前对象
  3. 其实在成员方法的参数中,第一个参数就是this,但是被隐藏了
    在这里插入图片描述
    在成员方法执行的时候,编译器会将调用成员方法对象的引用传递给成员方法,用this来接收。

5. 对象的构造和初始化

5.1 构造方法

5.1.1 什么是构造方法

构造方法是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次,构造方法是对成员变量进行初始化的作用。

一定要记住啊,这个真的很重要!好多题都会考,一起来看下如何定义构造方法

class Dog {
    public String name;
    public String sex;
    public int age;
    public String color;

    //无参数的构造方法
    public Dog(){

    }

    //四个参数的构造方法
    public Dog(String name,String sex,int age,String color){
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.color = color;
    }

    public void show(){
        System.out.println("姓名:" + name + "性别:" + sex + "年龄:" + age + "颜色:" + color);
    }

	public static void main(String[] args) {
        Dog dog = new Dog();
        dog.show();
    }
}


5.1.2 构造方法的特性

  1. 没有返回值
  2. 构造方法的名字必须与类名相同
  3. 在创建对象时,编译器会自动调用构造方法,构造方法只执行一次(创建对象时没有传递参数,就是调用无参数的构造方法;如果传递了参数,根据参数来决定调用的到底是哪个构造方法)
  4. 构造方法可以重载,例如上述代码中,无参数的构造方法和带有四个参数的构造方法实现了重载
  5. 当用户没有写构造方法时,编译器会自动提供一个无参数的构造方法(但是,当用户自己定义了构造方法时,编译器就不会提供了)

由于编译器自动提供无参数的构造方法,并没有报错
在这里插入图片描述

当用户提供了构造方法,编译器将不会提供
在这里插入图片描述
6. 可以使用快捷键来生成构造方法
Alt + Insert
在这里插入图片描述

  1. 在构造方法中,可以用this来调用其他构造方法
    在这里插入图片描述
  2. this的调用不能成环
    在这里插入图片描述

5.2 初始化

当我们在main方法中定义一个变量而没有初始化时,会报错
在这里插入图片描述
而我们在定义类的时候,没有给成员变量进行初始化,并没有报错,这是因为在一个类的成员变量中,没有初始化前,java会对每个成员变量赋一个默认值。

5.2.1 默认初始化

数据类型默认值
byte0
short0
int0
long0
float0.0f
double0.0
char‘\u0000’
booleanfalse
referencenull

5.2.2 就地初始化

就地初始化就是在声明成员变量时,直接初始化
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值