Java面向对象程序开发——基础

news/2024/11/9 13:08:57 标签: java, servlet, jvm

文章目录

  • 前言
  • 类和对象
    • 对象
  • 构造方法
  • 匿名对象
  • 变量作用域
  • this关键字
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

Java 是一种以面向对象编程为基础的编程语言
在 Java 编程中,一切皆为对象
每个对象都有其自己的属性和方法
对象可以通过类来定义,并且可以根据需要创建多个对象。
类描述了对象应该有的属性和方法,同时也定义了对象之间的关系。

面向对象指的就是一切以真实存在的个体为思考目标

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

类和对象

把若干个相似的个体归为一类
请添加图片描述
以下是一个简单的 Java 汽车类:
首先要知道哪些数据和行为需要管理
其次类中的属性可以被本类中所有方法直接使用

java">//定义一个类来进行描述
public class Car {
    // 汽车的属性----数据
    String brand; //品牌
    String model; //型号
    int year; //年份
    double price; //价格

    // 汽车的方法----行为
    public void run() {
		System.out.println(brand+"车跑得真快");
	}
    public double getPrice() {
        return price;
    }
}

对象

类仅仅是个定义,一种描述,不能在程序中直接使用

要根据定义的类在程序中创建这个类真正的对象,他是真实存在的

javascript">brand = A
model = V5
year = 2019
price = 280.00

构造方法

java重要创造出对象来,要创造出一个特殊的方法——构造方法

一个类要创建对象,需要调用本类中的构造方法

构造方法语法:

  1. 方法名必须和类名相同
  2. 不能包含返回值类型
  3. 方法体中不能使用return返回一个值

还是以汽车类举例:

java">public class Car {
    // 汽车的属性
    String brand;
    String model;
    int year;
    double price;
    
    public void show() {
        System.out.println("这辆车品牌是" + brand);
    }
    //实际应用中,建议每个类定义两个构造方法
    //1.无参空构造方法
	public Car() {
		
	}
    //2.有参构造方法是通过传参给对象的属性赋初值
    public Car(String b, String m, int y, double p) {
        brand = b;
        model = m;
        year = y;
        price = p;
    }
    
}

接下来创建Car类对象:

java">public static void main(String[] args) {
//创建对象时,需要在new后面调用构造方法【Car() 调用构造方法】
		Car c1=new Car();
		
		//通过对象名.方式来使用属性和方法
		System.out.println(c1.brand);
		c1.brand= "奔驰";
		c1.model= "SUV汽车";
		c1.year = 2019;
		c1.price = 28900.00;
		c1.show();
		
		//定义一个新的,再创建一个对象
		Car c2 = new Car("宝马","小轿车",2022,5120.00);
		System.out.println(c2.brand);
		System.out.println(c2.model);
		System.out.println(c2.year);
		System.out.println(c2.price);
		c2.show();
	}

在这里插入图片描述

定义类时,可以不定义构造方法
在代码编译时 java会给这个类自动添加一个默认的无参构造方法
如果定义类时有构造方法,默认的将不再提供

匿名对象

Java中的匿名对象指的是没有名称的对象,即没有通过赋值给变量或者通过构造器创建实例的对象
匿名对象通常在代码中仅仅需要使用一次或者是只需要创建一个实例时使用
可以使用匿名对象调用方法来执行操作,如下所示:

我这里写一个类名为Animal的类,并加上一个测试类Main来讲解。

首先,我们声明一个Animal类,代码如下:

java">public class Animal {
    String name;

    public Animal() {
        // 无参构造方法
    }

    public Animal(String x) {
        name = x;
    }

    public void introduce() {
        System.out.println("I am an animal, my name is " + name);
    }
}

这个类也有两个构造方法,一个是无参构造方法,另一个是带一个参数的构造方法
带参构造方法接收一个字符串参数,将这个参数赋值给name属性。
类中还有一个introduce()方法,用来输出一个关于这个实例的简单介绍。

我们可以声明一个Animal测试类,代码如下:

java">public class AnimalTester {
	public static void main(String[] args) {
		Animal dog = new Animal("小黑");
		dog.introduce();
		dog.introduce();

		new Animal("小白").introduce();
		new Animal("小灰").introduce();

		// 尽量避免使用匿名对象
	}
}

我们使用带参构造方法创建一个某只狗的对象,并调用它两次的introduce()方法。
然后使用匿名对象创建两个不同的狗,并调用它们的introduce()方法

最后提醒了一下,尽量避免使用匿名对象,因为当我们使用匿名对象时,这个对象是没有被任何变量所引用的,因此一旦离开这个对象所在的语句块,这个对象就会被销毁(会被垃圾回收器回收)。这也是为什么我们要尽量避免使用匿名对象的原因。

变量作用域

全局变量=属性=实例变量
使用范围是本类中所有方法

【例】我们可以写一个类Music,代码如下:

java">public class Music {
    String name;
    int num; //属性或全局变量
	//类中的一个方法
    public void show() {
        System.out.println("这首音乐一共播放了" + num + "次");
    }

    public void test(int n) {
        // 方法中定义的变量可以是参数或方法体中定义的,都称为局部变量
        // 使用范围仅限于当前方法
        double d;
    }
}

Music类中有一个name属性和一个num属性,以及一个show()方法用于展示播放次数。
show()方法中,我们使用+运算符连接字符串和数字。

此外,Music类还有一个test()方法,接受一个参数n,并且在方法体内定义了一个局部变量d

这就是一个简单的Music类的实现。

this关键字

  1. java允许定义和属性同名的局部变量
  2. 访问方法内部时,如果直接使用变量名访问,那么访问的是局部变量
  3. 通过this.属性名,可以访问属性

【例】这里写一个运动员类Athlete,代码如下:

java">public class Athlete {
    String name;
    double height;
    String birthday;

    public void show(){
        System.out.println(this.name + "正在比赛中");
    }

    public Athlete() {
        this("Tom", 1.85, "1995-04-20");
        // 可以在构造方法中使用this(),来调用本类其他重载的构造方法
        // 必须出现在第一行
    }

    public Athlete(String name, double height, String birthday) {
        // System.out.println(this.name);
        this.name = name;
        this.height = height;
        this.birthday = birthday;
    }
}

Athlete类有一个name属性、一个height属性和一个birthday属性,以及一个show()方法用于展示选手正在比赛中。

Athlete类的构造方法中,我们使用this()方法来调用其他构造方法,来避免代码重复。
Athlete()构造方法中,我们将默认值设置为Tom, 1.85和1995-04-20

这就是一个简单的Athlete运动员类的实现

总结

定义类的基本步骤:

  1. 定义属性
  2. 定义两个构造方法(有参无参)
  3. 定义其他方法

构造函数:

当一个对象被创建时,构造方法会初始化对象,给变量赋初值

  1. 构造函数和类名完全一致
  2. 构造函数不要写返回值类型
  3. 默认编译器会创建一个无参的构造函数,但是一旦你写了构造函数,默认的将不再提供

super:
5. super子类的成员方法里调用父类的成员变量
6. super子类的成员方法里调用父类的成员方法
7. super可以在子类的构造方法里调用父类的构造方法

【例】
定义一个三角形类Triangle:

1、定义三个方法:getArea()求面积、getPer()求周长,showAll()分别在控制台输出底边、高、面积、周长。
2、有两个属性:底边base、高height。
3、通过构造方法Triangle(int base, int height),分别给两个属性赋值。

以下是Triangle类的代码实现:

java">public class Triangle {
    int base;
    int height;

    public Triangle(int base, int height) {
        this.base = base;
        this.height = height;
    }//有参
    
    public Triangle() {
        
    }//无参
    
    public double getArea() {
        return base * height / 2.0;
    }

    public double getPer() {
        double c = Math.sqrt(base * base + height * height);
        return base + height + c;
    }

    public void showAll() {
        System.out.println("底边:" + base);
        System.out.println("高:" + height);
        System.out.println("面积:" + getArea());
        System.out.println("周长:" + getPer());
    }
}

在上述代码中,我们定义了一个Triangle类,包含了底边base和高height两个私有属性,并编写了一个构造方法Triangle(int base, int height)来初始化这两个属性。
同时还实现了三个方法:getArea()用于计算三角形的面积,getPer()用于计算三角形的周长,以及showAll()用于输出三角形的底边、高、面积和周长。
getPer()方法中,我们使用了Math库中的sqrt()方法来计算三角形的斜边长度。

下面是一个简单的测试代码,供您参考:

java">public class TestTriangle {
    public static void main(String[] args) {
        Triangle t = new Triangle(5, 8);
        t.showAll();
    }
}

在题中的用到了构造方法,那个不用我们写,直接右键→源码进行选择即可:
在这里插入图片描述


http://www.niftyadmin.cn/n/393776.html

相关文章

Delphi11的多线程ⓞ,附送图片处理代码

Delphi11的多线程ⓞ OLD Coder , 习惯使用Pascal 接下来准备启用多线程,毕竟硬件多核,Timer不太爽了(曾经的桌面,都是Timer——理解为“片”) 突然想写写,不知道还有多少D兄弟们在。 从源码开始 用D11之…

代码随想录算法训练营第四十六天|139.单词拆分、关于多重背包,你该了解这些!、背包问题总结篇!

文章目录 一、139.单词拆分二、关于多重背包&#xff0c;你该了解这些&#xff01;三、背包问题总结篇&#xff01;总结 一、139.单词拆分 public boolean wordBreak(String s, List<String> wordDict) {//完全背包问题&#xff0c;因为可以重复&#xff0c;背包正序排列…

图文并茂教你快速入门React系列04-状态管理

在React中&#xff0c;什么是状态&#xff1f; 响应式 使用 React&#xff0c;你不用直接从代码层面修改 UI。举个栗子哇&#xff0c;不用编写诸如“禁用按钮”、“启用按钮”、“显示成功消息”等命令。相反&#xff0c;你只需要描述组件在不同状态&#xff08;“初始状态”…

Elasticsearch 和 Kibana 的实时大数据分析系统

Elasticsearch 和 Kibana 的实时大数据分析系统 一、简介1. 定义及特点2. 基本功能3. 数据索引与查询 二、Kibana 简介1. 定义及特点2. 基本功能与架构3. Kibana 可视化交互性 三、Elasticsearch 和 Kibana 的集成1. 集成意义2. 集成方法2.1 安装 Elasticsearch2.2 安装 Kibana…

web前端 --- BOM编程、DOM编程

BOM编程&#xff08;browser object model -- 浏览器对象模型&#xff09; BOM给JavaScript提供用来操作浏览器的若干的"方法" 操作 在 js 看来&#xff0c;一个完整的浏览器包含如下组件&#xff1a; window窗口 // 整个浏览器的窗口 |-- history …

chatgpt赋能python:Python取出列表中的某个数

Python取出列表中的某个数 在Python中&#xff0c;列表是一种非常重要的数据类型&#xff0c;它可以用来存储一系列有序的元素。在实际的开发中&#xff0c;经常会需要从列表中取出某个特定的数值&#xff0c;本文将介绍如何在Python中完成这个操作。 1. 使用index方法 Py…

chatgpt赋能python:Python句柄是什么意思?

Python句柄是什么意思&#xff1f; 在进行Python编程时&#xff0c;可能会涉及到句柄(handle)的概念。那么&#xff0c;什么是Python句柄呢&#xff1f;在本文中&#xff0c;我们将深入探讨这个问题&#xff0c;并解释句柄的用途和重要性。 什么是Python句柄&#xff1f; …

chatgpt赋能python:Python实现CSV文件只取某两列的方法详解

Python实现CSV文件只取某两列的方法详解 介绍 CSV是一种常见的数据格式&#xff0c;通常使用逗号或分号分隔不同的字段。在处理CSV文件时&#xff0c;我们经常需要只提取其中的某些列&#xff0c;以便进行进一步的分析或处理。使用Python语言&#xff0c;可以很方便地实现…