【java】对象和类

news2024/12/23 11:16:08

java对象和类

  • 面向对象
  • 对象和类
  • 属性
  • 方法
  • 静态
  • 构建对象

面向对象

所谓的面向对象,其实就是分析问题时,以问题所涉及到的事或物为中心的分析方式。

比如在写小学作文里《美好的一天》,一种写法是记录几点起床,几点吃饭,几点睡觉,这种写法比较简单但拿不到高分;另一种写法是通过一件事或者一个人来阐述这一天发生了什么,比如今天放学妈妈给我送了雨伞这一件事,所以我认为是美好的一天。

对象和类

对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
:类是一个模板,它描述一类对象的行为和状态。
比如,男孩(boy)、女孩(girl)为类(class),而具体的每个人为该类的对象(object)。

在java中类的关键字是class,基本语法如下:

class 类名{
	特征(属性),
	功能(方法)
}

以做一道菜,红烧排骨为例:
那么类:菜,对象:红烧排骨

public class chapter01_Object {
	
	public static void main(String[] args) {
		
		Cooking c = new Cooking();
		c.name = "红烧排骨";
		c.food = "排骨";
		c.execute();
		
		Cooking c1 = new Cooking();
		c1.name = "红烧鱼";
		c1.food = "鲫鱼";
		c1.execute();
	}

}

class Cooking {
	String name;
	String type = "红烧";
	String food; // 食材
	String relish = "大料"; //佐料
	
	void execute(){
		System.out.println("准备食材:"+food);
		System.out.println("准备佐料:"+relish);
		System.out.println("开始烹饪");
		System.out.println("烹饪完成");
	}
}

再举一个动物的例子,如果以动物作为class,那么猫和狗则为object;如果以狗为对象,那么斗牛犬、牧羊犬这些则为对象。这里以动物为class,编写以下代码。

public class chapter02 {
	
	public static void main(String[] args) {
		Animal a1 = new Animal();
		a1.type = "猫";
		a1.name = "小黑";
		Animal a2 = new Animal();
		a2.type = "狗";
		a2.name = "大黄";
		a1.run();
		a2.run();
	}

}

class Animal{
	String type;
	String name;
	
	void run(){
		System.out.println(name + type + "跑开了");
	}
}

总的来说,对象是将内存地址赋值给了变量,所以变量其实引用了内存中的对象,故称为引用变量,而变量的类型称为引用数据类型。

在这里插入图片描述
特殊的对象:空对象(null),没有引用的对象称为空对象,所有引用类型变量的默认取值就是null。

User user = null;

属性

属性其实就是该类的所有对象的相同特征。

class User{
	String name;
}

如果和上面这样,不进行属性的初始化,那么属性会在构造对象的时候默认初始化,而默认初始化的值取决于属性的类型。

byte,short,int,long = 0
float,double = 0.0
boolean = false
char = 空字符
引用数据类型 = null

方法

声明和调用的语法:

返回类型 方法名() {
	逻辑代码
}

对象.方法名()
public class Java06_Object_Method {
    public static void main(String[] args) {

        User06 user = new User06();
        boolean registerResult = user.register();
        if ( registerResult ) {
            System.out.println("注册成功,请登录");
            boolean loginResult = user.login();
            if (loginResult) {
                System.out.println("登录成功");
            } else {
                System.out.println("登录失败");
            }
        } else {
            System.out.println("注册不成功,请重新注册");
        }
    }
}
class User06 {

    boolean register() {
        System.out.println("注册软件系统");
        // 成功 true
        return false;
        // 失败 false
    }
    boolean login() {
        System.out.println("登录软件系统");
        return true;
    }
}

当然,方法也可以进行传参。
传一个参数:

返回值类型[void] 方法名(参数类型 参数名)

如果参数有多个的话,那么在传值的时候需要注意:

  1. 个数不能缺失
  2. 类型必须匹配
  3. 顺序必须匹配

将方法后面的小括号中的所有参数称之为参数列表

public class Java07_Object_Method_Param {

    public static void main(String[] args) {
        User07 user = new User07();
        user.sayHello("zhangsan", 30);
    }
}
class User07 {
    void sayHello( String name, int age ) {
        System.out.println("Hello "+name);
    }
}

传多个可变参数:

public class Java07_Object_Method_Param {
    public static void main(String[] args) {

        // 如果参数的类型(含义)相同,但是个数不确定的场合,JVM提供了可变参数 : 参数的长度可变
        // 参数类型...参数名
        // 传值的个数也可以是变化的。
        User07 user = new User07();
        user.printUser(30);
        user.printUser(40, "zhangsan");
        user.printUser(50, "zhangsan", "lisi", "wangwu");

        // 如果参数列表中含有不同含义的多个参数,那么可变参数必须放置在最后,否则出现错误
    }
}
class User07 {

    void printUser( int age, String... name  ) {
        System.out.println(name);
    }
}

如果参数列表中含有不同含义的多个参数,那么可变参数必须放置在最后,否则出现错误。

以上就是方法传参的各种类型 !

下面再介绍一下,方法传参的底层原理。可以先看下面这个例子:

public class chapter03 {
	public static void main(String[] args) {
		int i = 10;
		test(i);
		System.out.println(i);
	}
	
	public static void test(int i){
		i = i+ 10;
	}
}

可以看到以上代码的运行结果是10,这与大部分的所想不一样(20),故下面就介绍传参的原理。
在这里插入图片描述
如果是引用数据类型呢?

public class chapter04 {
	public static void main(String[] args) {
		String s = "abc";
		test(s);
		System.out.println(s);
	}
	
	public static void test(String s){
		s = s + "10";
	}
}

在这里插入图片描述
可以看到结果,还是abc,下面就介绍字符串类型的传参过程:
在这里插入图片描述
需要注意的是,当执行s =s +10时,会重新开辟一个内存地址,将内存地址重新赋值给s,所以原来的s还是没有变化。

public class Java07_Object_Method_Param_1 {
    public static void main(String[] args) {
        User user = new User();
        user.name = "zhangsan";
        test(user);
        System.out.println(user.name);

    }

    public static void test(User user) {
        user.name = "lisi";
    }
}
class User {
    String name;
}

在这里插入图片描述

Java种方法参数的传递为值传递
基本数据类型:数值
引用数据类型:引用地址

静态

针对于具体对象的属性称之为对象属性,成员属性,实例属性
针对于具体对象的方法称之为对象方法,成员方法,实例方法
把和对象无关,只和类相关的称之为静态。和类相关的属性称之为静态属性,和类相关的方法称之为静态方法。故访问这些属性和方法。则使用类进行调用即可。

public class Java08_Object_Static {
    public static void main(String[] args) {
        Bird.fly();
        System.out.println(Bird.type);
    }
}
class Bird {
    static String type = "鸟";
    static void fly() {
        System.out.println("飞...");
    }
}

在这里插入图片描述

先有类,再有对象。成员方法可以访问静态属性和静态方法,但静态方法不可以访问成员属性和成员方法。

静态代码块

类的信息加载完成后,会自动调用静态代码块,可以完成静态属性的初始化功能

public class Java08_Object_Static_2 {
    public static void main(String[] args) {

        // 类的信息加载完成后,会自动调用静态代码块,可以完成静态属性的初始化功能
        // 对象准备创建时,也会自动调用代码块,但不是静态的
        //User08.test();
        new User08();
    }
}
class User08 {
    static {
        // 静态代码块
        System.out.println("静态代码块执行1");
    }
    static {
        // 静态代码块
        System.out.println("静态代码块执行2");
    }
    static void test() {
        System.out.println("test...");
    }
    {
        System.out.println("代码块执行1");
    }
    static {
        // 静态代码块
        System.out.println("静态代码块执行3");
    }
    {
        System.out.println("代码块执行2");
    }
}

在这里插入图片描述

package中容纳类
基本语法: package 包完整路径, 路径中的多个包使用点隔开
比如: java.lang.Object
主要功能用于分类管理

一个类可以没有包,但是package不可以在同一个源码文件中使用多次
包名为了区分类名,所以一般全部都是小写。

Java中存在不同包的相同名称的类,可以使用包进行区分
一般情况下,在使用类的情况下,我们都会使用类的全名(包名+ 类型)

但使用全名还进行new的话,会很麻烦,故我们可以使用import语法。

import 主要用于在使用类前准备好了,import语句只能使用在package后,class前。
import关键字可以多次使用,导入多个类
如果同一个包中需要导入大量的类,那么可以使用通配符星号来简化操作。

import java.util.*;

如果import不同包中相同名称的类,那么还是需要在使用时增加包名。

构建对象

如果一个类中没有任何的构造方法,那么JVM会自动添加一个公共的,无参的构造方法,方便对象的调用

基本语法: 类名(){}

  1. 构造方法也是方法,但是没有void关键字。
  2. 方法名和类名完全 相同
  3. 如果类中没有构造方法,那么JVM会提供默认的构造方法
  4. 如果类中有构造方法,那么JVM不会提供默认的构造方法
  5. 构造方法也是方法,所以也可以传递参数,但是一般传递参数的目的是用于对象属性的赋值
public class Java11_Object_Instance {
    public static void main(String[] args) {

        //System.out.println("before...");
        User11 user = new User11("zhangsan");
        //System.out.println("after...");
        user.test();
        System.out.println(user.username);
        // 代码块,是在构造对象之前执行的

    }
}
class User11 {
    String username;

    {
        System.out.println("代码块1");
    }

    User11(String name) {
        username = name;
        System.out.println("user...");
    }
    {
        System.out.println("代码块2");
    }
    void test() {
        System.out.println("test...");
    }
    {
        System.out.println("代码块3");
    }
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/826194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPTCache 悬赏令!寻找最佳捉虫猎手,豪华赏格等你来拿!

号外号外!GPTCache 全宇宙寻找最佳捉虫猎手!捉虫数量越多,奖品越丰厚! GPTCache 是为 AIGC 应用搭建的全新缓存,典型的应用场景是大模型,它采用语义缓存技术,能够存储 LLM 响应,从而…

将Visio和Excel导出成没有白边的PDF文件

1、VISIO如何无白边导出pdf格式 在使用Latex时,要导入矢量图eps格式。但是VISIO无法输出eps格式,这就需要将其导出为pdf。但是导出pdf时,往往会有大量的白边。VISIO无白边导出pdf格式的方法如下: 1.文件——开发工具——显示sha…

物联网||不一样的点灯实验(2)|通过使用CMSIS库函数实现点灯实验-学习笔记(12)

文章目录 通过使用CMSIS库函数实现点灯实验1 如何使用CMIS库2 如何利用CMSIS库操作IO 两种实现方法的比较课后作业:完整代码:LED.C:test.c:led.h: 通过使用CMSIS库函数实现点灯实验 1 如何使用CMIS库 #####如何使用此驱动#####[. .](#)启用GPIO AHB时钟使用以下函数…

使用条件访问自动执行访问决策

由于远程用户更容易受到网络攻击,因此需要实施严格的安全措施,例如多因素身份验证 (MFA) 以防止数据泄露。但是,应用严格的组织范围的访问策略(如 MFA)可能会对用户体验产生不利影响。ADSelfSer…

ICCV 2023 | Prior真的重要吗?IST-Net:更强更快的category-level物体位姿估计模型

​ 论文链接: https://arxiv.org/abs/2303.13479 代码链接: https://github.com/CVMI-Lab/IST-Net 01.背景介绍 Category-level 的物体姿态估计旨在让模型学习到类别独有的特征,从而能够在面对未见过的同类别物体时展现出良好的泛化性。为了…

私人网盘搭建(利用阿里云oss搭建)

1、个人网盘场景说明 个人网盘架构 使用ECS安装Cloudreve提供网盘服务,OSS提供存储服务。当用户使用个人网盘时,访问部署Cloudreve ECS的公网IP地址即可完成文件上传、下载、删除、分享等服务。 什么是Cloudreve Cloudreve可帮助您即刻构建出兼备自用…

下载vue-router的环境变量与创建路由包

目录 一、查看路由是否存在 二、vue路由介绍 三、操作步骤 (一)查看vue路由的版本号并记住 (二)vscode里面下载 一、查看路由是否存在 1.点击package.json文件查看里面是否有路由router的依赖,这里面没有发现&a…

Spring框架——AOP配置文件方式

目录 Spring框架的核心功能之AOP技术 AOP的概述 Spring的AOP的简单介绍 AOP概述 什么是AOP? Spring底层AOP实现 Spring的AOP的简介 AOP开发的相关术语 Spring框架的AOP的底层实现 JDK的动态代理(代码了解,理解原理) CGLIB的代理技…

Unity-数据持久化-PlayerPrefs

一、数据持久化概念 数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。 简单来说:就是将游戏数据存储到硬盘,将硬盘中数据读取到游戏中,也就是传统意义上的存盘。 是Unity提供的可以…

软考A计划-系统集成项目管理工程师-项目合同管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

软件测试报告的作用在哪?

软件测试报告是测试工作的重要成果之一,它是测试人员向项目团队和相关利益相关者传递测试结果和评估软件质量的文档。软件测试报告具有以下几个重要作用: 1、向项目团队和管理层提供测试结果软件测试报告会详细汇报测试的执行情况、测试用例覆盖的范围、…

【Linux】学习systemctl这一篇就够了--systemctl 命令完全指南

Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。 Systemd是一个系统管理守护进程、工具和库的集合,用于取代System V初始进程。Systemd的功能是用于集中管理和配置类UNIX系统。 在Linux生态系统中,Systemd被部署到了大多数…

数据结构——搜索二叉树

文章目录 一. 概念二. 二叉搜索树的操作1.查找2. 插入3. 删除(重点)4.遍历5.拷贝构造与析构 三.二叉搜索树的递归实现1.递归查找2.递归插入3.递归删除 四.二叉树搜索的应用五.源码 前言: 本章我们将认识一种新的二叉树——搜索二叉树。这棵树…

【2023】Redis实现消息队列的方式汇总以及代码实现

Redis实现消息队列的方式汇总以及代码实现 前言开始前准备1、添加依赖2、添加配置的Bean 具体实现一、从最简单的开始:List 队列代码实现 二、发布订阅模式:Pub/Sub1、使用RedisMessageListenerContainer实现订阅2、还可以使用redisTemplate实现订阅 三、…

win10 64位 vs2017 qt5.12.6 pcl1.9.1 vtk8.1.1配置安装步骤

由于我电脑中有 QT5.12.6 VS2017,就不介绍怎么安装了,只介绍cmake,pcl及vtk的配置步骤 为了便于后续QT的调用,以下所有安装路径中均不能出现中文及空格等 PCL自带VTK是不完整的,所以需要下载VTK源码进行重新编译使其…

激光切割机在镂空技术中的运用场景具体包括哪些部分

本文将为您呈现一些激光镂空工艺的实际应用情况。激光切割机应用在镂空工艺上的一些地方。 首先,纸艺激光镂空的应用: 纸是中国古代四大发明之一,激光则是20世纪以来人类的一项重大发明。当传统文化与现代科技相互碰撞时,使得纸雕…

分享低成本非隔离PWM控制AC-DC开关芯片 YB5011

简介: YB5011系列是一款高性能低成本PWM控制功率开关,适用于离线式小功率降 压型应用场合,外围电路简单、器件个数少。同时产品内置高耐压MOSFET可提高 系统浪涌耐受能力,集成有完备的带自恢复功能的保护功能:VDD欠压保护、逐周期…

使用傲梅 VMware 备份软件保障数据保护

VMware数据保护一直是热门话题,因为VMware是虚拟化的驱动力。96% 的用户至少经历过数据丢失的主要原因之一:人为错误、硬盘驱动器故障、断电、火灾和自然灾害。 有效的 VMware 备份解决方案可以保护您的虚拟环境,并能够在需要时快速保护和恢…

Kafka-Broker工作流程

kafka集群在启动时,会将每个broker节点注册到zookeeper中,每个broker节点都有一个controller,哪个controller先在zookeeper中注册,哪个controller就负责监听brokers节点变化,当有分区的leader挂掉时,contro…

在商业广告领域中,LDE透明屏有哪些应用表现?

LDE透明屏是一种新型的显示技术,它能够在显示内容的同时保持屏幕的透明度,使得用户可以透过屏幕看到背后的物体。LDE透明屏的出现,为我们的生活带来了许多新的可能性。 首先,LDE透明屏可以应用于商业广告领域。 传统的广告牌需要…