Java-Day007

Dreams don’t come for free. 梦想不会平白无故实现。

  • 面向对象和面向过程
  • 类和对象
    • 对象
  • 类的定义
    • 属性
    • 方法

一、面向对象和面向过程

举个例子:我想要一杯开水,正常来说,我需要找到烧水壶,然后接凉水,烧成开水,在倒进杯子里面,这种方式叫做面向过程。同样的例子,面向对象就是我想要一杯开水,然后我找个人,给他说我想要一杯开水,你怎么弄,要不要用烧水壶烧开水,这些我都不管,我最后只要一杯开水,至于你弄开水的过程和我没关系,只要最后给我一杯开水就行,这是面向对象。

面向对象的本质还是面向过程,那上面的例子来说,虽然我不用自己来做这些事,但是这些事还是需要有人来做,做这些事的人是面向过程的。

二、类和对象

一、类

类就是一类,比方说人类,是一个类,动物也是一个类,一个班级,一个学校也可以是一个类

类就是描述同一类型的事物的一个抽象概念

二、对象

如同上面说的,人类是一个类,动物是一个类、一个班级、一个学校也是一个类

人类中有一个人,叫张三,那么张三就是一个对象,是对人类这个类的实例

动物中有一只猫,那么这个猫也是一个对象

一个班级,一个学校同理

三、类的定义

一、类

1、语法格式

[权限修饰符] class 类名{

}

Tips:类名需要遵循大驼峰原则,单词首字母大写。

2、人类

人类是一个类,所以我们创建一个名字叫做Person的类

public class Person {
    
}

这就是一个最简单的“人”类了,当然,这个类什么功能也没有

Tips:一个.java文件可以写多个类,但是只能有一个类被修饰为public

二、对象

有了人类,就可以创建对象了

1、语法格式

类名 对象名 = new 类名();

2、人类对象

Person person = new Person();

这就是创对象的方式,可以看到new Person后有一个(),这个括号,将在下面解释说明。

三、属性

上面说了,人类是一个类,张三是人类的一个实例(对象)

那么如果只知道他是张三那可不行,还要知道他的性别,他的年龄啊等等

性别和年龄就可以说是人类这个类的属性,毕竟这是每个人类都有的。

1、语法格式

和写变量差不多

[权限修饰符] 类型 属性名 = [默认值];

是不是和变量差不多,只是没有在最后赋值,要知道,变量需要先初始化赋值才能使用的。

而属性不需要初始化赋值,系统会自动给每个属性赋值上一个默认值。

数据类型和默认值对照如下:

数据类型默认值
byte0
shore0
char‘\u0000’
int0
long0
float0.0
double0.0
booleanfalse
引用类型null

四、方法的

还用人类打比方说,张三,他需要吃饭,需要睡觉,那么吃饭和睡觉就可以看作人类这个类的方法,这个方法用于实现人类这个类的一些功能。方法是类的和对象行为特征的抽象。

1、语法格式

[权限修饰符] 返回值类型 方法名([参数列表]){
	方法体
}

2、例子

public void a1(){
    
}

这就是定义了一个,权限被修饰为public的没有返回值的名字叫a1的方法,当然这个方法也没有什么用,因为我没有写方法体。

例子:一个典型的学生类

public class Student {
    int id;
    String name;
    int age;
    String address;

    public void study(){
        System.out.println("学生就该学习。");
    }

    public void sleep(){
        System.out.println("学习了一天,需要睡觉了。");
    }
    
}

这就是一个经典的学生类

定义了一个权限修饰为public的类名叫做Student的类

定义了四个属性,分别是

  • id:学生的ID
  • name:学生的姓名
  • age:学生的年龄
  • address:学生的家庭地址

还写了两个方法,分别是

  • stusy:学习
  • sleep:睡觉

四、构造器(构造方法)

在上面创建对象的时候,后面有一个括号,一个括号,括号里面没有参数,那么就方法表这是一个构造器。这个括号和方法的括号一样,是用来传参数的。

构造器一般是为了给对象进行初始化操作,构造器是一个会自动调用的特殊方法,目的是对象的初始化。构造器应该和类型一致。Java通过new关键字来调用构造器,从而返回该类的实例,是一个特殊的方法。

一、构造器的语法格式

public 类型([参数列表]){
	执行语句
}

1、构造器的四个要点

  • 通过new关键字调用!
  • 构造器虽然有返回值,但是不能定义返回值类型,不能在构造器里面使用return语句。
  • 如果没有定义构造器,则系统会自动给定义一个无参构造器,如果定义了则不会自动添加。
  • 构造器的名字必须和类名一致。

二、构造器的重载

构造器也是方法,只是有点特殊而已,构造器与普通方法一样,也可以重载

public class Student {
    int id;
    String name;
    int age;
    String address;

    public Student() {
    }

    public Student(int id, String name, int age, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public void study(){
        System.out.println("学生就该学习。");
    }

    public void sleep(){
        System.out.println("学习了一天,需要睡觉了。");
    }

}

这样并不会报错,系统会根据你传进去的参数,自动选择最匹配的构造器。

五、引用

对象属于引用类型了,不属于八大基本类型了,和基本类型不同的是,基本类型的参数传递使用的是拷贝,只是把数值拷贝走了,不会修改原数据,但是引用类型不同,这里的数据传递,传递的是对象在内存中的引用地址。

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student(1,"张三",20,"河南");
        Student s2 = s1;
        s2.name = "李四";
        s2.age = 21;
        s2.name = "河北";
        System.out.println(s1);
        System.out.println(s2);
    }
}
public class Student {
    int id;
    String name;
    int age;
    String address;

    public Student() {
    }

    public Student(int id, String name, int age, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public void study(){
        System.out.println("学生就该学习。");
    }

    public void sleep(){
        System.out.println("学习了一天,需要睡觉了。");
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

运行结果
Student{id=1, name=‘河北’, age=21, address=‘河南’}
Student{id=1, name=‘河北’, age=21, address=‘河南’}

可以看到,我把s1赋值给了s2,然后通过s2修改姓名、年龄和地址,随后s1的数据也发生了变化。

六、this关键字

1、thsi关键字的作用1

在构造器里区分是构造器里的参数还是类的属性,加上this就是类的属性。

public Student(int id, String name, int age, String address) {
    this.id = id;
    this.name = name;
    this.age = age;
    this.address = address;
}

2、this关键字的作用2

用来在构造器之间相互调用。

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student(1,"张三",20,"河南");
    }
}
public class Student {
    int id;
    String name;
    int age;
    String address;

    public Student() {
        System.out.println("我是无参构造器");
    }

    public Student(int id, String name, int age, String address) {
        this();
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
        System.out.println("我是有参构造器");
    }

    public void study(){
        System.out.println("学生就该学习。");
    }

    public void sleep(){
        System.out.println("学习了一天,需要睡觉了。");
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

运行结果
我是无参构造器
我是有参构造器

需要注意的是,通过this关键字在构造器之间相互调用,必须把thsi关键字方法构造器内部的第一行。

构造器之间还需要注意递归调用的问题。

七、static修饰符

static属于静态修饰符,被static修饰的属性,方法都是属于类的,与对象无关。

被static修饰的方法或者属性,可以通过类名.属性名或者类名.方法名()调用

public class Test {
    public static void main(String[] args) {
        System.out.println(Student.name);
        Student.study();
    }
}
public class Student {
    int id;
    static String name;
    int age;
    String address;

    public Student() {
        System.out.println("我是无参构造器");
    }

    public Student(int id, String name, int age, String address) {
        this();
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
        System.out.println("我是有参构造器");
    }

    public static void study(){
        System.out.println("学生就该学习。");
    }

    public void sleep(){
        System.out.println("学习了一天,需要睡觉了。");
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}
运行结果
null
学生就该学习。

前面说了,属性会被系统默认的给一个初始值,所以这里会有一个null(空)。

被static修饰的属性,在内存中只会创建一份,不管后面创建了多少对象,都会引用到同一个内存。

public class Test {
    public static void main(String[] args) {
        Student s1 = new Student(1,"张三",20,"河南");
        Student s2 = new Student(1,"李四",20,"河南");
        System.out.println(s1);
        System.out.println(s2);
    }
}
public class Student {
    int id;
    static String name;
    int age;
    String address;

    public Student() {

    }

    public Student(int id, String name, int age, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;

    }

    public static void study(){
        System.out.println("学生就该学习。");
    }

    public void sleep(){
        System.out.println("学习了一天,需要睡觉了。");
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

运行结果
Student{id=1, name=‘李四’, age=20, address=‘河南’}
Student{id=1, name=‘李四’, age=20, address=‘河南’}

可以看到,s2在创建的时候使用的是"李四"这个名字,而s1的名字也被修改为了"李四"。

static修饰的方法不能访问非static修饰的方法或者变量,非static修饰的方法,可以访问stat修饰的变量和方法

static修饰的方法内不能使用this关键字

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值