首页 > 编程语言 >【Java】Java面向对象与方法

【Java】Java面向对象与方法

时间:2024-10-19 22:19:27浏览次数:14  
标签:Java Person int void class 面向对象 static 方法 public

1.基本方法

1.1.基本定义

在Java中,方法即为函数,Java中的方法定义遵循下面的通用格式

 修饰符 返回值 方法名 (形参列表){
     方法体
 }
对于基本方法的定义,遵循下面的结构
 
 public static 返回类型 方法名(形参列表){
     方法体
 }

是否需要返回类型和形参列表需要看该函数的功能,具体思路可以参考C/C++中定义函数的方式


 public class Test_method {
     public static void main(String[] args) {
         int ans = add(10, 20);
         System.out.println("ans = " + ans);
     }
 ​
     // 示例方法
     public static int add(int a, int b){
         int sum = a + b;
         return sum;
     }
 }
 ​
 输出结果:
 ans = 30

1.2.数组类型作为参数

如果是数组类型作为方法参数和返回值时,需要注意,在Java中,传递和返回数组都只是传递地址值


 public class Test_method {
     public static void main(String[] args) {
         int arr[] = {10, 20};
         int arr1[] = calculate(arr);
         for (int i = 0; i < arr1.length; i++) {
             System.out.print(arr1[i]+" ");
         }
     }
 ​
     // 数组作为形参和返回值
     public static int[] calculate(int[] arr) {
         int sum = 0;
         int sub = 0;
         for (int i = 0; i < arr.length; i++) {
             sum += arr[i];
             sub -= arr[i];
         }
         int[] arr1 = {sum, sub};
         return arr1;
     }
 }
 ​
 输出结果:
 30 -30

可以类比下面的C语言代码

#include <stdio.h>
 #include <stdlib.h>
 ​
 // 定义calculate函数,返回值为指针类型,参数为指针+输出型参数size(表示数组大小)
 int *calculate(int *arr, int *size)
 {
     int sum = 0;
     int sub = 0;
     for (int i = 0; i < *size; i++)
     {
         sum += arr[i];
         sub -= arr[i];
     }
     // 因为C语言数组是在栈上开辟的,所以不能返回,需要返回时必须使用动态内存开辟
     int *arr1 = (int *)malloc(sizeof(int) * 2);
     arr1[0] = sum;
     arr1[1] = sub;
     // 改变输出型参数值作为返回数组的长度
     *size = sizeof(arr1) / sizeof(int);
     return arr1;
 }
 ​
 int main()
 {
     int arr[2] = {10, 20};
     int size = sizeof(arr) / sizeof(int);
     int *arr1 = calculate(arr, &size);
     for (int i = 0; i < size; i++)
     {
         printf("%d ", arr1[i]);
     }
     return 0;
 }
 ​
 输出结果:
 30 -30

1.3.方法重载

Java同C++一样,也支持方法重载,并且方式相同

重载前提:方法名相同

重载要求:

  1. 参数个数不同

  2. 参数类型不同

  3. 在参数个数相同,参数类型不同的情况下,参数顺序不同

满足上面任意一个条件即可构成函数重载

// 定义基础方法
 public static void test(){}
 // 下面函数与基础方法可以构成重载
 public static void test(int a){}// 可以
 public static void test(int a,int b){}// 可以
 public static void test(double a,int b){}// 可以
 public static void test(int a,double b){}// 可以
 // 下面情况不可以
 public static void test(int i,double d){}// 不可以
 public static void TEST(){}// 不满足重载前提
 public static void test(int i,int j){}// 不可以
 public static int test(int a, int b){}// 不可以

2.类和对象

2.1类

创建类:

在Java中,使用class关键字创建类,建议一个类作为一个单独的文件

一般称成员变量为属性,称成员函数为方法

例如,Person


 public class Person {
     // 属性
     String name;
     int age;
 ​
     // 方法,不使用static关键字
     public void speak(){
         System.out.println("说话");
     }
 }

2.2.成员变量(属性)和局部变量的区别

成员变量和局部变量有以下的区别:

  1. 定义位置不同

    1. 成员变量定义在方法外,类内,整个类中都可以被访问

    2. 局部变量定义在方法内,只能在当前最近的作用域中访问

  2. 初始化值不同

    1. 成员变量有默认值,默认值参考数组中的类型默认值

    2. 局部变量没有默认值

  1. 内存位置不同

    1. 成员变量预备在方法区,实际使用时在堆区

    2. 局部变量在栈区

  2. 生命周期不同

    1. 成员变量的生命周期随着变量的创建而创建,随着其销毁而销毁

    2. 局部变量的生命周期随着当前作用域的销毁而销毁

2.3.对象

创建对象:

在Java中,创建对象需要使用new关键字,使用new创建出来的对象都在堆区 例如,创建Person类对象

如果两个类在同一个包下,则再另一个类中使用当前类创建对象时不需要引包操作,否则需要使用import关键字引包

特殊地,Java中的lang包不需要单独引包

同一包下的Person类
package com.lze.java_class;
public class Person {
    // 属性
    String name;
    int age;
 
    // 方法
    public void print(){
        System.out.println("name = " + name + " " + "age = " + age);
    }
}
 
同一包下的测试类
package com.lze.java_class;
 
public class Java_class {
    public static void main(String[] args) {
        // 创建Person类对象
        Person p = new Person();
        // 访问Person中的成员
        p.age = 12;
        p.name = "张三";
        p.print();
    }
}
 
输出结果:
name = 张三 age = 12
两个不同对象的内存分析:

Person类的两个对象进行分析

public class Person {
    // 属性
    String name;
    int age;
 
    // 方法
    public void print(){
        System.out.println("name = " + name + " " + "age = " + age);
    }
}
 
public class Java_class {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.age = 10;
        p1.name = "张三";
        p1.print();
        Person p2 = new Person();
        p2.age = 20;
        p2.name = "李四";
        p2.print();
 
    }
}

首先,Person类中的属性和方法以及测试类的方法都会加载到方法区进行预备,此时每一个类都会有一个class 地址值

接着,main方法执行,加载到栈区,创建出对象p1和p2,因为是new为对象开辟的空间,所以该空间在堆上,p1和p2分别存储这两个堆上空间的地址,并且在两个对象空间中,都存在着class地址值,当类相同时,class地址值也是相同的,该地址值用于查询到类中的方法,执行print时加载print方法进入栈区

匿名对象:

在Java中,也可以创建匿名对象,前面创建对象的步骤为类名 对象名 = new 类名(),那么匿名对象即为去无赋值符左边部分new 类名()


public class Java_class {
    public static void main(String[] args) {
        // 创建Person类匿名对象调用函数
        new Person().print();
    }
}

一般在只需要调用函数时创建匿名对象,每一次匿名对象的创建都是重新开辟一块空间

2.4.类和对象练习与链式调用

//Birthday类
package lzastudy;

class Birthday {
    int year;
    int month;
    int day;
}

//Person类
class Person {
    // 属性
    String name;
    int age;
    Birthday birthday;

    // 方法
    public void print(){
        System.out.println("name = " + name + " " + "age = " + age + " " + "birthday: " + birthday.year + "/" + birthday.month + "/" + birthday.day);
    }
}

//测试类
public class Brithday {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "Peter";
        p.age = 20;
        // 因为Birthday是引用数据类型,所以默认是null,不可以直接调用year等成员,否则会出现空指针问题,需要先创建Birthday对象
        p.birthday = new Birthday();
        // 接着再为Birthday类对象赋值
        p.birthday.year = 2000;
        p.birthday.month = 10;
        p.birthday.day = 25;
        p.print();
    }
}

//输出结果:
//name = Peter age = 20 birthday: 2000/10/25

标签:Java,Person,int,void,class,面向对象,static,方法,public
From: https://blog.csdn.net/2301_79582015/article/details/143024436

相关文章

  • 6-2.Android 对话框之基础对话框问题清单(UI 线程问题、外部取消、冲突问题、dismiss
    对话框对话框(Dialog)是一种常用的UI组件,它主要用于显示信息、接收用户操作反馈对话框可以包含各种元素,但是主要还是以文本、按钮为主,其次是列表其中,基础对话框是Android中最简单的对话框,而后是进度对话框、自定义对话框等一、UI线程问题1、UI线程中创建对话......
  • Java21虚拟线程:我的锁去哪儿了?
    0前言最近的文章中,我们详细介绍了当我们迁移到Java21并将代际ZGC作为默认垃圾收集器时,我们的工作负载是如何受益的。虚拟线程是我们在这次迁移中兴奋采用的另一个特性。对虚拟线程新手,它们被描述为“轻量级线程,大大减少编写、维护和观察高吞吐量并发应用程序的工作量。”......
  • 【Java基础】物理内存&虚拟内存
    前言在Java程序运行过程中,操作系统为其分配了物理内存和虚拟内存。理解这两者的概念有助于明晰内存管理和性能优化。一、物理内存物理内存是指计算机的实际RAM(随机存取存储器)。Java进程在运行时需要向操作系统请求内存资源,操作系统通过分配物理内存来满足Java进程的内存......
  • java锁的问题速通
     1.syncronized底层原理——悲观锁synchronized有对象锁和类锁两种,多个线程中只有一个线程可以获取对象锁,其他线程都会处于阻塞状态synchronized是底层是基于monitor实现的。monitor是C++编写的jvm对象,主要分为owner(这个只会存一个线程的信息,记录当前锁被哪个线程获取了)、ent......
  • java反射机制
    什么是java反射呢,先来看Oracle官方的解释:“ReflectionenablesJavacodetodiscoverinformationaboutthefields,methodsandconstructorsofloadedclasses,andtousereflectedfields,methods,andconstructorstooperateontheirunderlyingcounterparts,......
  • [Java基础] 异常处理机制
    往期回顾[Java基础]基本数据类型[Java基础]运算符[Java基础]流程控制[Java基础]面向对象编程[Java基础]集合框架[Java基础]输入输出流[Java基础]异常处理机制[Java基础]Lambda表达式目录什么是异常处理?异常分类检查型异常非检查型异常(UncheckedExcepti......
  • DEDE文章{dede:pagebreak/}翻页错位的解决方法
    问题描述在使用DEDE的 {dede:pagebreak/} 标签进行文章分页时,点击下一页后,文章内容会错位,出现在层外面。解决方法检查文章中的HTML结构问题可能是因为文章内容中包含 div 层,而这些 div 层在分页时会导致布局错乱。解决方法:将文章中的 div 层替换为 p 标签。......
  • java计算机毕业设计springboot+vue小区物业管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着城市化进程的加速,住宅小区的规模不断扩大,小区内的管理事务日益繁杂。传统的物业管理方式依赖人工操作,效率低下且容易出错。在信息技术飞速发......
  • java计算机毕业设计广告系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着互联网的迅猛发展,广告行业发生了翻天覆地的变化。广告形式和载体日益多样化,从传统的报纸、杂志、电视到如今无处不在的互联网广告等1。海量......
  • 14.归一化——关键的数据预处理方法
    引言在人工智能(AI)和机器学习中,归一化(Normalization)是一个重要的预处理步骤。它的主要目的是将数据转换到某个特定的范围。归一化可以帮助模型更高效地学习和提高预测的准确性。归一化在数据预处理方法中占据核心地位,是确保数据质量和模型性能的关键步骤。通过阅读本篇博客,你......