我的 Java 入门进阶之路 (二)

一、面对对象思想

1.1 面对对象思想概述

Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。面向对象思想就是在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算机事件的设计思想。它区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。


1.2 与面对过程思想的区别:

举例一:在这里插入图片描述
在这里插入图片描述
举例二:

import java.util.Arrays;

/*
面向过程:当需要实现一个功能的时候,每一个具体的步骤都要亲力亲为,详细处理每一个细节。
面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事儿。
 */
public class Demo01PrintArray {

    public static void main(String[] args) {
        int[] array = { 10, 20, 30, 40, 50, 60 };

        // 要求打印格式为:[10, 20, 30, 40, 50]
        // 使用面向过程,每一个步骤细节都要亲力亲为。
        System.out.print("[");
        for (int i = 0; i < array.length; i++) {
            if (i == array.length - 1) { // 如果是最后一个元素
                System.out.println(array[i] + "]");
            } else { // 如果不是最后一个元素
                System.out.print(array[i] + ", ");
            }
        }
        System.out.println("==============");

        // 使用面向对象
        // 找一个JDK给我们提供好的Arrays类,
        // 其中有一个toString方法,直接就能把数组变成想要的格式的字符串
        System.out.println(Arrays.toString(array));
    }

}

1.3 面对对象的特点:

面向对象思想是一种更符合我们思考习惯的思想,它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。面向对象的语言中,包含了三大基本特征,即封装、继承和多态。


1.4 类与对象:

在这里插入图片描述


1.5 类的定义:

在这里插入图片描述

public class Student{
   //成员变量
  String name;//姓名
  int age;//年龄
  //成员方法
  //学习的方法
 public void study() {
   System.out.println("好好学习,天天向上");
   }
  //吃饭的方法
 public void eat(){
   System.out.println("学习饿了要吃饭");
  }
}

1.6 对象的使用:

在这里插入图片描述

/*
通常情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用。

1. 导包:也就是指出需要使用的类,在什么位置。
import 包名称.类名称;
import com.xxw.advancecodes.Student;
对于和当前类属于同一个包的情况,可以省略导包语句不写。

2. 创建,格式:
类名称 对象名 = new 类名称();
Student stu = new Student();

3. 使用,分为两种情况:
使用成员变量:对象名.成员变量名
使用成员方法:对象名.成员方法名(参数)
(也就是,想用谁,就用对象名点儿谁。)

注意事项:
如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样。
 */
public class DemoStudent {

    public static void main(String[] args) {
        // 1. 导包。
        // 我需要使用的Student类,和我自己Demo02Student位于同一个包下,所以省略导包语句不写

        // 2. 创建,格式:
        // 类名称 对象名 = new 类名称();
        // 类根据Student,创建了一个名为stu的对象
        Student stu = new Student();

        // 3. 使用其中的成员变量,格式:
        // 对象名.成员变量名
        System.out.println(stu.name); // null
        System.out.println(stu.age); // 0
        System.out.println("=============");

        // 改变对象当中的成员变量数值内容
        // 将右侧的字符串,赋值交给stu对象当中的name成员变量
        stu.name = "赵丽颖";
        stu.age = 18;
        System.out.println(stu.name); // 赵丽颖
        System.out.println(stu.age); // 18
        System.out.println("=============");

        // 4. 使用对象的成员方法,格式:
        // 对象名.成员方法名()
        stu.eat();
        stu.study();
    }

}

在这里插入图片描述
注意: 如果成员变量没有进行赋值,那么将会有一个默认值,规则和数组一样。 而局部变量没有默认值,必须赋值,除了方法里面参数(也是局部变量),被调用就一定会赋值,所以这里没问题


1.7 类与对象的练习:

定义一个手机类:

/*
定义一个类,用来模拟“手机”事物。
属性:品牌、价格、颜色
行为:打电话、发短信

对应到类当中:
成员变量(属性):
    String brand; // 品牌
    double price; // 价格
    String color; // 颜色
成员方法(行为):
    public void call(String who) {} // 打电话
    public void sendMessage() {} // 群发短信
 */
public class Phone {

    // 成员变量
    String brand; // 品牌
    double price; // 价格
    String color; // 颜色

    // 成员方法
    public void call(String who) {
        System.out.println("给" + who + "打电话");
    }

    public void sendMessage() {
        System.out.println("群发短信");
    }
}

定义一个测试类:

public class DemoPhone {

    public static void main(String[] args) {
        // 根据Phone类,创建一个名为one的对象
        // 格式:类名称 对象名 = new 类名称();
        Phone one = new Phone();
        System.out.println(one.brand); // null
        System.out.println(one.price); // 0.0
        System.out.println(one.color); // null
        System.out.println("=========");

        one.brand = "苹果";
        one.price = 8388.0;
        one.color = "黑色";
        System.out.println(one.brand); // 苹果
        System.out.println(one.price); // 8388.0
        System.out.println(one.color); // 黑色
        System.out.println("=========");

        one.call("乔布斯"); // 给乔布斯打电话
        one.sendMessage(); // 群发短信
    }

}

1.8 对象内存图:

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述


1.9 成员变量和局部变量区别:

变量根据定义位置的不同,我们给变量起了不同的名字。如下图所示

在这里插入图片描述在这里插入图片描述


二、类的封装

2.1封装概述:

面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问要访问该类的数据,必须通过指定的方式适当的封装可以让代码更容易理解与维护,也加强了代码的安全性


2.2 原则:

属性隐藏起来,若需要访问某个属性,提供公共方法对其访问


2.3 封装的步骤:

  1. 使用private关键字来修饰成员变量。
  2. 对需要访问的成员变量,提供对应的一对getXxx方法、setXxx方法。

2.4 封装的操作——private关键字 :

private的含义

1.private是一个权限修饰符,代表最小权限。
2.可以修饰成员变量和成员方法。
3.被private修饰后的成员变量和成员方法,只在本类中才能访问。

private的使用格式:

private  数据类型  变量名;
  1. 使用private修饰成员变量,代码如下:
public class Student {
   private String name ;
   private int age;
}
  1. 提供 getXxx 方法 /setXxx方法,可以访问成员变量,代码如下:

在这里插入图片描述


2.5 封装的优化 1 ——this 关键字 :

我们发现 setXxx 方法中的形参名字并不符合见名知意的规定,那么如果修改与成员变量名一致,是否就见名知意了呢?代码如下:在这里插入图片描述经过修改和测试,我们发现新的问题,成员变量赋值失败了。也就是说,在修改了setXxx()的形参变量名后,方法并没有给成员变量赋值!这是由于形参变量名与成员变量名重名,导致成员变量名被隐藏,方法中的变量名,无法访问到成员变量,从而赋值失败。所以,我们只能使用this关键字,来解决这个重名问题

this的含义:

this代表所在类的当前对象的引用(地址值),即对象自己的引用。

记住:方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。

this使用格式:

this.成员变量名

使用this修饰方法中的变量,解决成员变量被隐藏的问题,代码如下:

在这里插入图片描述
在这里插入图片描述


2.6 封装的优化 2 —— 构造方法:

当一个对象被创建时候,构造方法用来初始化该对象,给对象的成员变量赋初始值。

小贴士:无论你与否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个无参数构造方法,一旦自己定义了构造方法,Java自动提供的默认无参数构造方法就会失效。

构造方法的定义格式:

在这里插入图片描述
构造方法的写法上,方法名与它所在的类名相同。它没有返回值,所以不需要返回值类型,甚至不需要void。使用构造方法后,代码如下:

public class Student {

    // 成员变量
    private String name;
    private int age;

    // 无参数的构造方法
    public Student() {
        System.out.println("无参构造方法执行啦!");
    }

    // 全参数的构造方法
    public Student(String name, int age) {
        System.out.println("全参构造方法执行啦!");
        this.name = name;
        this.age = age;
    }

}

注意事项:

  1. 如果你不提供构造方法,系统会给出无参数构造方法。
  2. 如果你提供了构造方法,系统将不再提供无参数构造方法。
  3. 构造方法是可以重载的,既可以定义参数,也可以不定义参数。

2.7 标准代码——JavaBean

JavaBean 是Java语言编写类的一种标准规范。符合JavaBean的类,要求类必须是具体的和公共的,并且具有无参数的构造方法,提供用来操作成员变量的setget方法。

在这里插入图片描述
编写符合JavaBean规范的类,以学生类为例,标准代码如下:

/*
构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法。
格式:
public 类名称(参数类型 参数名称) {
    方法体
}

注意事项:
1. 构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样
2. 构造方法不要写返回值类型,连void都不写
3. 构造方法不能return一个具体的返回值
4. 如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数、方法体什么事情都不做。
public Student() {}
5. 一旦编写了至少一个构造方法,那么编译器将不再赠送。
6. 构造方法也是可以进行重载的。
重载:方法名称相同,参数列表不同。
 */
public class Student {

    // 成员变量
    private String name;
    private int age;

    // 无参数的构造方法
    public Student() {
        System.out.println("无参构造方法执行啦!");
    }

    // 全参数的构造方法
    public Student(String name, int age) {
        System.out.println("全参构造方法执行啦!");
        this.name = name;
        this.age = age;
    }

    // Getter Setter
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

}

测试类,代码如下:

public class DemoStudent {

    public static void main(String[] args) {
        Student stu1 = new Student();
        stu1.setName("迪丽热巴");
        stu1.setAge(20);
        System.out.println("姓名:" + stu1.getName() + ",年龄:" + stu1.getAge());
        System.out.println("=================");

        Student stu2 = new Student("古力娜扎", 21);
        System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
        stu2.setAge(22);
        System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
    }

}

在这里插入图片描述


三、快速生成JavaBean 规范类 小技巧

在这里插入图片描述在这里插入图片描述


3.1 生成一个无参数的构造方法:

先快捷键 Alt + Insert ,然后执行图片所示:
在这里插入图片描述


3.2 生成一个有参数的构造方法:

在这里插入图片描述


3.3 生成get / set方法:

在这里插入图片描述


未完待续 … . . …

猜你喜欢

转载自blog.csdn.net/haduwi/article/details/106950729