初识【Java类和对象】

简介: Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。传统的方式:注重的是洗衣服的过程,少了一个环节可能都不行。而且不同衣服洗的方式,时间长度,拧干方式都不同,处理起来就比较麻烦。如果将来要洗鞋子,那就是另一种放方式。

1.面向对象的初步认知


1.1什么是面向对象?


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


1.2面向对象与面向过程


传统洗衣服过程





现代洗衣服过程




 面向对象方式来进行处理,就不关注洗衣服的过程 ,具体洗衣机是怎么来洗衣服,如何来甩干的,用户不用去关心,只需要将衣服放进洗衣机,倒入洗衣粉,启动开关即可,通过对象之间的交互来完成的 


2.类定义和使用


面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。



上图就是 对洗衣机简单的描述,该过程称为对洗衣机对象 ( 实体 ) 进行抽象 ( 对一个复杂事物的重新认知 ) ,但是这些简化的抽象结果计算机也不能识别,开发人员可以采用某种面相对象的编程语言来进行描述,比如:Java语言。


2.1简单认识类


类是用来对一个实体 ( 对象 ) 来进行描述的 ,主要描述该实体 ( 对象 ) 具有哪些属性 ( 外观尺寸等 ) ,哪些功能 ( 用来干啥) ,描述完成后计算机就可以识别了。


比如:洗衣机,它是一个品牌,在Java中可以将其看成是一个类别。

属性:产品品牌,型号,产品重量,外观尺寸,颜色...

功能:洗衣,烘干、定时....

2.2类的定义格式


 java 中定义类时需要用到 class 关键字 ,具体语法如下


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

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


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


class WashMachine{
public String brand; // 品牌
public String type; // 型号
public double weight; // 重量
public double length; // 长
public double width; // 宽
public double height; // 高
public String color; // 颜色
public void washClothes(){ // 洗衣服
System.out.println("洗衣功能");
}
public void dryClothes(){ // 脱水
System.out.println("脱水功能");
}
public void setTime(){ // 定时
System.out.println("定时功能");
}
}


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


注意事项:

类名注意采用大驼峰定义

成员前写法统一为 public ,后面会详细解释

此处写的方法不带 static 关键字 . 后面会详细解释


3.类的实例化


3.1什么是实例化


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

比如:



public class Main{
public static void main(String[] args) {
PetDog dogh = new PetDog(); //通过new实例化对象
dogh.name = "阿黄";
dogh.color = "黑黄";
dogh.barks();
dogh.wag();
PetDog dogs = new PetDog();
dogs.name = "阿黄";
dogs.color = "黑黄";
dogs.barks();
dogs.wag();
}
}
//输出结果:
//阿黄: 旺旺旺~~~
//阿黄: 摇尾巴~~~
//赛虎: 旺旺旺~~~
//赛虎: 摇尾巴~~~


注意事项:

new 关键字用于创建一个对象的实例 .

使用 . 来访问对象中的属性和方法 .

同一个类可以创建多个实例 .

3.2类和对象的说明


1.  类只是一个模型 一样的东西,用来对一个实体进行描述,限定了类有哪些成员

2. 类是一种自定义的类型 ,可以用来定义变量

3. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量

4. 做个比方。 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。


4.this引用


4.1为什么要有this的引用


我们先来看下面的一个例子:


public class Date {
      public int year;
      public int month;
      public int day;
      public void setDay(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) {
      // 构造三个日期类型的对象 d1 d2 d3
      Date d1 = new Date();
      Date d2 = new Date();
      Date d3 = new Date();
      // 对d1,d2,d3的日期设置
      d1.setDay(2020,9,15);
      d2.setDay(2020,9,16);
      d3.setDay(2020,9,17);
      // 打印日期中的内容
      d1.printDate();
      d2.printDate();
      d3.printDate();
   }
}


以上代码定义了一个日期类,然后 main 方法中创建了三个对象,并通过 Date 类中的成员方法对对象进行设置和打印,代码整体逻辑非常简单,没有任何问题。

但是如果形参名不小心和成员变量名相同了,比如:


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


那函数体中到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计自己都搞不清楚了。

三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和 printDate函数如何知道打印的是哪个对象的数据呢?  


一切让this引用来揭开这层神秘的面纱。


4.2什么是this引用


    this引用指向当前对象 ( 成员方法运行时调用该成员方法的对象 )。 在成员方法中所有成员变量的操作,都是通过该 引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

public class Date {
     public int year;
     public int month;
     public int day;
     public void setDay(int year, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
}
     public void printDate(){
        System.out.println(this.year + "/" + this.month + "/" + this.day);
     }
}
 
public static void main(String[] args) {
     Date d = new Date();
     d.setDay(2020,9,15);
     d.printDate();
}




4.3this引用的特性


1. this 的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型

2. this 只能在 " 成员方法 " 中使用

3. 在 " 成员方法 " 中, this 只能引用当前对象,不能再引用其他对象

4. this 是 “ 成员方法 ” 第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this 负责来接收

相关文章
|
1天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
15 6
|
3天前
|
IDE Java 编译器
Java:如何确定编译和运行时类路径是否一致
类路径(Classpath)是JVM用于查找类文件的路径列表,对编译和运行Java程序至关重要。编译时通过`javac -classpath`指定,运行时通过`java -classpath`指定。IDE如Eclipse和IntelliJ IDEA也提供界面管理类路径。确保编译和运行时类路径一致,特别是外部库和项目内部类的路径设置。
|
4天前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
18 6
|
2天前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
10 2
|
3天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其独特的“不重复性”要求,彻底改变了处理唯一性约束数据的方式。
【10月更文挑战第14天】从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其独特的“不重复性”要求,彻底改变了处理唯一性约束数据的方式。本文深入探讨Set的核心理念,并通过示例代码展示了HashSet和TreeSet的特点和应用场景。
9 2
|
3天前
|
存储 Java 索引
Java 中集合框架的常见接口和类
【10月更文挑战第13天】这些只是集合框架中的一部分常见接口和类,还有其他一些如 Queue、Deque 等接口以及相关的实现类。理解和掌握这些集合的特点和用法对于高效编程非常重要。
|
8天前
|
Oracle Java 关系型数据库
重新定义 Java 对象相等性
本文探讨了Java中的对象相等性问题,包括自反性、对称性、传递性和一致性等原则,并通过LaptopCharger类的例子展示了引用相等与内容相等的区别。文章还介绍了如何通过重写`equals`方法和使用`Comparator`接口来实现更复杂的相等度量,以满足特定的业务需求。
13 3
|
8天前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
8天前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
21 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
9天前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第3天】Java零基础教学篇,手把手实践教学!
10 1