Java核心基础第5篇-Java面向对象_类和对象

2021-07-22

Java面向对象之类和对象

Java面向对象

一、面向对象概述

Java是完全的面向对象编程(Object Oriented Programming),简称OOP

面向对象编程的思维方式更加符合大家的日常生活,因为我们的现实世界都是由各种各样的对象组成,大到飞机、火车、楼房,小到一只狗、笔记本电脑、一本书都是实实在在的对象。然而每个对象都有自己的状态和行为,我们可以通过对象来完成一定的任务。

例如:我们乘坐飞机从深圳飞到湘西去旅游,我们可以直接使用飞机的飞行能力,而不用管飞机这个对象是如何制造的。直接使用即可。

使用面向对象的方式来描述由对象组成的世界,更加符合人类的思维方式;

因为软件出现的目的就是为了:

  • 用计算机的语言描述现实世界
  • 用计算机解决现实世界的问题

Java是目前最为流行的面向对象的编程语言(Python可能不服),拥有面向对象的四大特征:

  • 封装:隐藏内部实现细节,对外提供可访问的方法
  • 继承:子类自动继承父类中所有的非私有属性和方法
  • 多态:同一事物,多种不同的表示形态,例如:重载、重写
  • 抽象:可以不用管具体的实现,定义统一的抽象规则

面向对象编程是Java的核心思想,但是对于初学者来说,学习起来还是比较抽象。所以建议初学者可以配合书籍一起学习,反复观看,从而掌握其中精华。

二、类

2.1 类的概述

类是Java应用程序中,必不可少的单位;创建类的关键字是:class; 其实我们在之前的学习过程中已经接触过类,只是没有专门单独的拿出来讲。

例如:

  • 以下创建了一个名称叫Test01的类
  • 在类中定义了一个main()方法,也是程序的入口
public class Test01{ 
    public static void main(String args[]){
        //创建并且赋值
        int score2[] = {100,90,88,85,66};
        for(int i = 0;i<score2.length;i++) {
            System.out.print(score2[i]+"\t");
        }
    }
}

所以创建类,也没有那么复杂。掌握其基本语法,然后根据自己的需求进行创建即可。

Java作为一门高级语言,我们除了可以创建自己定义的类以外,还内置了许多预定义好的类。

例如:

  • Scanner
  • Math
  • String

2.2 预定义类

所谓预定义类,就是Java语言根据实际业务场景,帮我们预定义好的类。我们只需要掌握如何使用,不需要再去额外创建。

常用的预定义类:

例如:

  • Scanner :键盘输入
  • Math :数学相关类
  • String :字符串类
  • Date :时间日期相关类
  • List :集合类

Java提供的预定义类有点多,好在提供了帮助文档,我们可以根据帮助文档查看:https://www.matools.com/api/java8

image-20210721140233778

后面有章节专门来研究常用的预定义类。

2.3 发现类的过程

1、宠物—现实生活中的对象

image-20210721153118999

如何在计算机中描述它?

世界上具体宠物对象,特别多。那么我们如何用计算机语言来描述这么多宠物对象,如果一个个描述我们肯定是做不到的;所以我们需要掌握其中的规律来对其进行划分。

从现实中抽象出类分为三步走:

  1. 第一步:找出它们的种类
  2. 第二步:找出它们的属性
  3. 第三步:找出它们的行为

2、第一步:找出他们的种类

根据以上信息,找出狗的种类;

Java使用的是class关键字来描述类;

//创建一个名为Dog的类
class Dog{
    
}

image-20210721154912359

3、第二步:发现类的特征

我们可以根据每个对象,抽取出他们相同的特征(属性);但是任何一个对象都会有多个特征

例如:Dog狗类的特征有

image-20210721155843179

虽然特征很多,但是实际我们只存放我们所需要的特征(属性):

class Dog { 
    String name = "旺财"; // 昵称
    int health = 100; // 健康值    
    int love = 0;   // 亲密度
    String strain = "拉布拉多犬"; // 品种 
}

4、第三步:发现类的方法

类的方法也可以称为行为,是动态的。每个方法都可以看出是一个独立的功能

image-20210721160446752

和属性一样,我们存放的也是我们所关心的行为

class Dog { 
    String name = "旺财";   // 昵称
    int health = 100; // 健康值    
    int love = 0;     // 亲密度
    String strain = "拉布拉多犬"; // 品种 
    /* 输出狗的信息 */
    public void print() {
        // 输出狗信息的代码
    } 
}

经过以上三个步骤,我们就可以创建一个完整的类。以及指定了类中包含的属性和方法。

2.4 类的组成

通过以上发现类的过程,我们可以看到类的基本组成:

//语法格式:
[< 修饰符>] class < 类名> 
{
	[<属性声明>]
	[<构造器声明>]
	[<方法声明>]
    [{代码块}]
}

1、属性

定义属性:语法

//语法
[修饰符] 	数据类型 	属性名称	 =  [初始值];

//例如
public String name = "来福";	//创建了一个属性,并且给初始值

修饰符:

  • public: 表示公共的,访问权限最大的,整个项目中都可以访问
  • private: 表示私有的,访问权限最小的,再能在当前类中访问

数据类型:

  • 数据类型可以是8种基本数据类型,也可以是引用数据类型
  • 属性的初始值取决数据类型。 int默认值是0String默认值是null

属性名称:

  • 属性也称为全局变量
  • 只需要符合基本的命名规则和规范即可

2、方法

也称为行为,正常一个方法表示一个具体的功能。例如:跑、吃、睡觉

//语法:
[修饰符]	返回值类型	方法的名称([参数列表]){
	//方法体。就是该方法的具体功能
}	

//案例
public void show(String name){
    System.out.println("我的名字是:"+name);
}

方法组成的四要素:

  • 返回值
  • 方法名称
  • 参数列表
  • 方法体

组成方法的四要素,缺一不可。

2.1 返回值

该方法执行完毕之后,把值返回给方法的调用者

  1. 必须定义返回值的具体的类型,如果没有返回值使用void修饰
  2. 如果有具体的返回值,必须在语句块中使用return语句
//没有返回值
//1.使用void修饰
//2.不用使用return
//3.方法的调用者不能使用变量接收内容
public void add(int num1,int num2) {
    int sum = num1+num2;
}

//有返回值的情况
//1.固定返回值类型
//2.方法体后面必须使用return关键字返回具体的数字
//3.方法执行之后的结果,可以使用变量保存起来
public int desc(int num1,int num2) {
    int d = num1-num2;
    return d;
}
2.2 方法名称

只是一个标识符,符合命名规则和规

规范:

  • 驼峰命名规则; 首个单词首字母小写,之后每隔单词首字母大写 getUserByName();
  • 见名知意
2.3 参数列表

定义方法的时候,参数是可选的。

  1. 形参列表:(形式参数),只是负责定义参数,以及参数的类型和名称。但是该参数每页实际的值
  2. 实参列表:方法的调用时候
//定义方法
// num1,num2表示连个形参
//语法:数据类型 参数名,多个参数之间使用逗号隔开
public int desc(int num1,int num2) {
    int d = num1-num2;
    return d;
}

//方法调用
//abc:变量,接收方法的返回值
//50,20:具体的实参,实参数据类型,个数,顺序必须和形参要一致
int acb = p1.desc(50,20);
2.4 方法体

{}表示方法体,也是方法具体的业务实现

public int desc(int num1,int num2) {
    //具体的业务  根据场景不同。具体 也不同
    int d = num1-num2;
    return d;
}

3、构造方法

3.1 构造方法特征

它具有与类相同的名称;
它不含返回值,也不需要使用void关键字修饰
一个类中可以拥有多个构造方法

public class Person{
    public Person(){
        //默认无参构造
    }
    
    public Person(String name){
        //定义有参构造
    }
}
3.2 构造方法作用

按照指定的规则来创建对象,完成对象的初始化工资;(给所有的属性赋值)

//注意: 构造方法不能使用void修饰,否则就是普通方法。丧失了构造方法的作用
//构造方法通过new 关键字 调用。不能通过对象调用  : 
new Person();   //调用Person无参构造
new User("zhangsan", "深圳华美居", "110"); //调用有参数构造
3.3 构造方法注意
  • Java语言中,每个类都至少有一个构造方法;
  • 如果类的定义者没有显式的定义任何构造方法,系统将自动提供一个默认的构造方法:
  • Java类中,一旦类的定义者显式定义了一个或多个构造方法,系统将不再提供默认的构造方法;
  • 构造器的主要作用:利用构造器参数初始化对象的属性。
public Person(String name,int age){
    this.name = name;
    this.age = age;
}

2.5 类图

描述整个类的信息;

  • 用于分析和设计“类”
  • 直观、容易理解

image-20200824100603128

三、对象

1、简介

  • 万物皆对象,所有的东西都是一个对象
  • 对象是类的具体实现,一个类可以创建任意多个对象
  • 每个对象其实都是一个副本,对象与对象之间互不干涉
  • 关键字: new
  • 使用:
    • 对象名.属性名 -->student.username
    • 对象名.方法名() --->student.eat();

2、创建对象的语法

​ new + 构造方法() : 例如: new Dog(); new Person();
​ 特殊的方法:
​ a.不需要返回值 b.方法名和类名一致;

3、类的访问机制

  • 在一个类中的访问机制:类中的方法可以直接访问类中的成员变量
  • 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。

4、匿名对象

  • 我们也可以不定义对象的引用,而直接调用这个对象的方法。这样的对象叫做匿名对象, 如:

    • new Person().shout();
      
  • 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。

  • 我们经常将匿名对象作为实参传递给一个函数调用