08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)

简介: 08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)

8 面向对象基础

8.1 面向对象
8.1.1 面向对象的思想

面向对象程序设计(Object Oriented Programming)

  • 一切客观存在的事物都是对象,万物皆对象。
  • 任何对象,一定具有自己的特征和行为。
  • 面向过程 C
  • 着重于“过程”
  • 优点:性能高
  • 缺点:耦合度高、不易于扩展、不易于维护
  • 面向对象 Java
  • 着重于“对象”
  • 优点:耦合度低、易于扩展、易于维护
  • 缺点:性能低
8.1.2 什么是程序

程序是为了解决现实问题,模拟现实世界

在java程序猿眼中,世界是由对象组成的

8.2 对象与类
8.2.1 对象

面向对象编程思想(Object Oriented Programming)

  • 一切客观存在的事物都是对象,万物皆对象。
  • 任何对象,一定具有自己的特征和行为。
8.2.1.1 对象概念

具有明确的行为(方法)和特征(属性|变量)的实体

8.2.1.2 对象包括特征和行为:
  1. 特征:称为属性,一般为名词,代表对象有什么。
  2. 行为:称为方法,一般为动词,代表对象能做什么。
8.2.1.3 程序中的对象

现实中的对象多数来自于“模板”,程序中的对象也应该具有“模板”。

8.2.2 类

在一组相同或类似的对象中,抽取出共性的特征和行为,保留所关注的部分。

类的定义

属性:通过变量表示,又称实例变量

语法:数据类型 属性名;

位置:类的内部,方法的外部。

方法:又称实例方法。

语法:
  public 返回值类型 方法名(形参){
    //方法的主体
  }

注意:不再书写static,后续详解。
8.3 创建类与对象
8.3.1 创建类

类的由来:类是由多个具有相同特征和行为的对象抽取出来的

如果定义一个类:

1、确定类名

2、编写成员变量

3、编写成员方法

属性:通过变量表示,又称实例变量。

public class Student { //类:学生对象模板 
  //编写属性(变量)    成员属性(变量)
  String name;
  int age;
  String gender;
  double score;
  //....  
  //方法        成员方法
    //从面向对象阶段起,方法都不要加static
  public void study() {
    System.out.println("学习");
  } 
  public void sleep() {
    System.out.println("睡觉");
    public void study(){
        System.out.println("学生学习...");
  } 
  //...
}
8.3.2 创建对象

语法:类名 对象名 = new 类名();

Student stu = new Student();

public class TestStudent {
  public static void main(String[] args) {
    //创建Student对象
    Student stu = new Student();
    //使用对象(1、给对象属性赋值和取值  2、调用对象的方法)
    //给对象属性赋值
    stu.name = "张三";
    stu.age = 20;
    stu.gender = "男";
    stu.score = 100;  
    //对象属性取值
    System.out.println(stu.name);
    System.out.println(stu.age);
    System.out.println(stu.sex);
    System.out.println(stu.score);
    //调用对象的方法
    stu.study();
    stu.sleep();
    //=====================================================
    Student stu1 = new Student();
    //重复上面的事情 
  }
}
8.4 类和对象的关系

类:定义了对象应具有的特征和行为,类是对象的模板

对象:拥有多个相同特征和行为的实体,对象是类的实例

面向对象就是从具体到抽象,再从抽象到具体的过程

类:模板(一个)-----------创建--------->>>对象:实例(多个)

8.5 实例变量

实例变量

变量:局部变量和成员变量

  • 成员变量包含:实例【非静态】变量和类【静态】变量。
8.5.1 实例变量和局部变量的区别
区别 局部变量 实例(成员)变量
位置 定义在方法内 定义在方法外,类的里面
默认值 没有默认值 系统提供默认值,与之前讲的数组一致
作用域 所在的{} 在整个类中
重名 在不同的作用域可以重名 不能重名
生命周期 方法执行完被销毁 当对象被销毁的时候销毁

特殊情况:局部变量可以与实例变量重名

如果成员变量和局部变量的名称相同的时候,java中遵循就近原则

/**
 * 定义在类的里面,方法的外面的属性称之为 实例属性(变量)
 * 在方法的里面定义的变量称之为局部变量 
 *  实例变量和局部的区别
 *    1、定义的位置不同
 *          局部变量:定义在方法中
 *         实例变量:定义在类里面,方法的外面
 *      2、作用域不同
 *          局部变量:只能定义的作用域中使用(就是所在{}内)
 *        实例变量:在整个类中都可以使用
 *      3、默认值不同
 *        注意:变量必须要赋值才能使用!!!
 *        局部变量:没有默认值
 *        成员变量:有默认值(整数型:0, 浮点型:0.0, 字符型: 空格,boolean型:false, 引用类型:null)
 *      4、生命周期不同
 *        局部变量:退出作用域就会被销毁
 *          成员变量:对象被创建出现,对象被销毁的时候销毁
 *          
 *      5、重名问题:
 *        局部变量:在不同的作用域中可以重名
 *        成员变量:不能重名
 *       当成员变量和局部变量重名的时候,java遵循就近原则
 */

**成员变量的默认值: 整数:0 小数:0.0 字符:\u0000(空字符) **

布尔:false 其他:null

8.6 实例方法
8.6.1 实例方法

实例方法当对象被创建的时候产生(不使用static修饰)

8.6.2方法的重载

有些情况下,对象的同一种行为可能存在多种实现过程。(到底采用哪种实现过程,需要取决于调用者给定的参数。)

重载(Overload):一个类中定义多个相同名称的方法,参数列表不同。要求:方法名称相同、参数列表不同(类型、个数、顺序)。与修饰符、返回值类型无关。调用带有重载的方法时,需要根据传入的实参去找到与之匹配的方法。好处:减少给多个功能相同的方法命名,方便开发人员使用。


方法重载:在一个类中的出现同名方法称之为方法的重载


方法重载的要求:


1、同名不同参(参数类型、个数、顺序)


2、与返回值,访问修饰符无关


调用重载的方法会根据传递的参数不同,去执行不同的方法


重载的好处:方便、灵活、屏蔽使用差异

public void sleep() {
    System.out.println("正常人睡觉,8小时");
}

public void sleep(int hour) {
    System.out.println("其他人睡觉,"+hour+"小时");
}

方法:包含实例方法(非静态方法)和类方法(静态方法)


包含两部分:方法的声明和方法的实现。


方法的声明:


代表对象能做什么。

组成:修饰符 返回值类型 方法名(形参列表)

方法的实现:


代表对象怎么做:即如何实现对应的功能。

组成:{ 逻辑代码 }

8.7 构造方法
8.7.1 构造方法的概念

构造方法【构造器】:类中的特殊方法,用于创建类的对象

  • 作用:创建类的对象(实例化)
  • 语法:public 构造方法名(){}
  • 构造方法名必须与类名完全一致
  • 没有返回值类型
  • 特点:
  • 1、如果一个类没有编写构造方法, 那么jvm会默认提供一个无参构造方法,但是如果一个类提供了构造方法,那么jvm就不会再提供给这个无参构造方法
  • 2、构造方法可以重载
  • 3、一个类无论提供多少个构造方法,一定要保留一个无参构造方法
  • 场景:
  • 给对象的属性赋值
8.7.2 对象创建过程

对象的创建过程:

  • 内存中开辟对象空间
  • 为各个属性赋予初始值
  • 执行构造方法中的代码
8.7.3 对象的内存分配

存储对象的变量p(引用)中保存对象的地址,通过变量中的地址访问对象的属性和方法。

8.7.4 构造方法的重载

构造方法也可重载,遵循重载规则。

8.7.5 构造方法为属性赋值

  • 创建对象的同时,将值传入构造方法
  • 由构造方法为各个属性赋值
8.8 this关键字

this关键字:


含义:表示当前类的对象,在对象被创建的时候自动产生


作用: 可以调用本类的属性、方法、构造方法


调用本类的属性

语法:this.属性名

在本类中调用本类的属性this关键可以省略

当前成员变量与局部变量重名的时候,this.属性名表示的是成员变量,不加this表示局部变量(就近原则)

调用本类的方法:

语法:this.方法名();

在本类中调用本类的方法this关键可以省略

调用本类的构造方法(只能在构造方法中使用)

语法:this(构造参数);

特点:

避免无穷递归(构造方法循环调用)

调用本类构造方法的时候,this(构造参数)必须写在构造方法的第一行

在构造方法中使用this,表示成员变量

public class Person {
  String name;
  int age;
  
  public Person() {}

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
}
补充 文档注释常用标签
标签 含义
@author 标识一个类的作者例如 @author wgy
@version 指定类的版本
@see 指定参考的链接或内容
@param 说明一个方法的参数
@since 指定从哪个JDK版本开始提供支持
@return 说明返回值类型
小结:
  1. 什么是对象:一切客观存在的事物都是对象,万物皆对象,每个对象都有特征和行为。
  2. 什么是类:定义了对象应具有的特征和行为,类是对象的模板。
  3. 什么是方法重载:方法名相同、参数列表不同。
  4. 构造方法:类中用于创建对象的特殊方法,名称与类名相同,没有返回值,不可通过句点调用。
  5. this关键字:代表当前实例,
    通过this.访问实例属性,实例方法,this()/this(xxx)访问本类中的其他构造方法。
  6. 对象的创建过程:
  • Student s=new Student();
  • 在堆中开辟空间,属性赋值为默认值
  • 执行构造方法,初始化属性
  • 把对象的地址赋值给变量
目录
相关文章
|
6天前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
14天前
|
Java 编译器
Java重复定义变量详解
这段对话讨论了Java中变量作用域和重复定义的问题。学生提问为何不能重复定义变量导致编译错误,老师通过多个示例解释了编译器如何区分不同作用域内的变量,包括局部变量、成员变量和静态变量,并说明了使用`this`关键字和类名来区分变量的方法。最终,学生理解了编译器在逻辑层面检查变量定义的问题。
Java重复定义变量详解
|
17天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
20天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
17天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
12 2
|
20天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
18 0
|
2月前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
31 10
|
2月前
|
存储 Java
Java的对象和类的相同之处和不同之处
在 Java 中,对象和类是面向对象编程的核心。
|
2月前
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
|
3月前
|
机器学习/深度学习 人工智能 算法
探索人工智能在医疗诊断中的应用与挑战Java编程中的对象和类:基础与实践
【8月更文挑战第27天】随着人工智能(AI)技术的飞速发展,其在医疗领域的应用日益广泛。本文深入探讨了AI技术在医疗诊断中的具体应用案例,包括图像识别、疾病预测和药物研发等方面,并分析了当前面临的主要挑战,如数据隐私、算法偏见和法规限制等。文章旨在为读者提供一个全面的视角,理解AI在改善医疗服务质量方面的潜力及其局限性。