JAVA 面向对象初级(韩顺平)

本文探讨Java中类与对象的内存分配机制,包括栈、堆和方法区,并通过实例讲解成员方法、传参机制,如交换变量值、对象传址和克隆操作。重点剖析跨类和跨对象的方法调用,以及传值与传址的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

判断下列代码的输出结果,答案在七.1

public class objec {
    public static void main(String[] args) {
 
        int a = 4 , b = 5;
        AA z = new AA();
        z.swap(a,b);
        System.out.println("2:" + a + " " + b);

    }
}

class AA{
    public void swap(int a,int b){
        int t = a;
        a = b;
        b = t;
        System.out.println("1:" + a + " " + b);
    }
}

目录

一.引言

二.类和对象的关系

三.类和对象的内存分配机制

四.成员方法

五.成员方法的定义

六.跨类和跨对象的方法调用

七.方法成员的传参机制


一.引言

为什么引入类和对象(oop):根本原因是现有的技术不能完美的解决新的需求

例如:存储两个猫的信息

       // 单独变量解决(不利于数据管理)
        String cat1name = "小白";
        String  cat2name = "小花";

        int cat1age = 3;
        int cat2age = 100;

        String cat1color = "白色";
        String cat2color = "花色";

        // 数组解决(1)(体现不出来数据类型)(2)(难以定位数据)(3)不能体现猫的行为
        String[] cat1 = {"小白","3","白色"};
        String[] cat2 = {"小花","100","花色"};

利用类和对象处理该问题

public class objec {
    public static void main(String[] args) {
//使用oop解决
        //实例化一只猫[创建一只猫对象]
        //1.new.Cat()创建一只猫
        //2.Cat cat1 = new Cat();把创建的猫赋给cat1
        Cat cat1 = new Cat();
       cat1.name = "小白";
        cat1.age = 10;
        cat1.color = "白色";
        //创建第二只猫
        Cat cat2 = new Cat();
        cat2.name = "小花";
        cat2.age = 100;
        cat2.color = "花色";
    }
}
//定义一个猫类
class Cat{
    //属性
    String name;
    int age;
    String color;
}

二.类和对象的关系

1.类是抽象的,代表一类事务,如人类,猫类

2.对象是具体的,代表一个具体的事务

3.类是对象的模板,对象是类的一个个个体

三.类和对象的内存分配机制

 1.栈:一般存放数据类型(局部变量)

 2.堆:存放对象(Cat cat,数组等)

 3.方法区:常量池(非基本数据类型的常量,如字符串),类加载信息

下列代码在内存中的分配机制

Person p1 = new Person();
p1.age = 10;
p1.name = "小名";
Person p2 = p1;

代码举例
Person a = new Person();
a.age = 10;
a.name = "小明";
person b ;
b = a;
System.out.println(b.age);//小明
b.age = 200;
b = null;//b的指向为空
System.out.println(a.age);//200
System.out.println(b.age);//异常

四.成员方法

在某些情况下,我们需定义成员方法,比如人类:除了有一些属性外,还有一些行为,比如:说话,跑步。这时就要用成员方法才能完成

1.做一到n的累加

public class object{
    public static void main(String[] args){
        Person a = new Person();
        Scanner myscanner = new Scanner(System.in);
        int n = myscanner.Intnext();
        a.cal02(n);       
    }
}
//1.public表示方法公开
//2。void 没有返回值
//3.speak(): speak是方法名,()是形参列表
//4.{}方法体: 可以执行代码
class Person{
    public void cal02(int n) {
        int res = 0;
        for (int i = 1; i <= n; i++) {
            res += i;
        }
        System.out.println(res);
    }
}

2.做两数和

Person p1 = new Person();
int m = p1.getsum(2,3);
System.out.println(m);


class Person{
String name;
int age ;
 public int getsum(int num1,int num2){
     int res = num1 + num2;
     return res;
        }

}

方法调用机制

 成员方法的优点

1.提高代码的复用性

2.可以将实现的细节封装起来,然后供其他用户来调用

五.成员方法的定义

访问修饰符  返回数据类型  方法名(形参列表){//方法体

语句

return 返回值;

}

1.形参列表:表示成员方法输入cal(int a),getsum(int a,int b)

2.返回数据类型:表示成员方法输出,void没有返回值

3.方法主体:表示为了实现某一功能的代码块

4.return语句不是必须的

5.return返回类型需与返回数据类型对应,不能忽略数据类型的自动转换

如返回数据类型是double,return的返回数据类型是int也是可以的

5.方法的定义不能嵌套

6.一个问题可以有多个返回值(可用数组进行返回)

六.跨类和跨对象的方法调用

A a =new A();
a.sayOK();
a.m1();



class A{
    public void print(int n){
        System.out.println("print方法调用"+n);
    }

    public void sayOK(){
        print(10);//print的直接调用
        System.out.println("继续执行sayOK");
    }

    public void m1(){
        System.out.println("m1()被调用");
        B b = new B();
        b.hi();
    }
}

class B{
    public void hi(){
        System.out.println("B类中的hi被执行");
    }
}

七.方法成员的传参机制

1.对两个数进行交换

int a = 4 , b = 5;
AA z = new AA();
z.swap(a,b);
System.out.println("2:" + a + " " + b);//4 5


class AA{
    public void swap(int a,int b){
        int t = a;
        a = b;
        b = t;
        System.out.println("1:" + a + " " + b);//5 4
    }
}

传值:形参是对实参的临时拷贝,形参的改变不会对实参造成影响

2.怎么通过方法对实参的变量进行修改,这时候就需要用传址操作,即传送参数地址,或者传送对象

例一

int[] arr = {1,2,3};
B a = new B();
a.test(arr);
for (int i = 0; i <= 2; i++) {
    System.out.println(arr[i]);
}

class B{
    public void test(int[] arr){
        arr[0] = 100;//修改元素
    }
}

例二

Person p = new Person();
B b = new B();
p.age = 10;
b.test200(p);//指向堆中的p.age的地址
System.out.println(p.age);


class Person{
    String name;
    int age;
}

class B{
    public void test200(Person p){
        p.age = 1000;
    }
}

例三

Person p = new Person();
B b = new B();
p.age = 10;
b.test200(p);//指向堆中的p.age的地址
System.out.println(p.age);//输出结果为10

class Person{
    String name;
    int age;
}

class B{
    public void test200(Person p){
        p = null;
    }
}

p = null只是B类中的p指向空,而main中的p没有发生改变

3.克隆对象

 Person p = new Person();
 p.age = 100;
 p.name = "milan";
 MyTools tools = new MyTools();
 Person p2 = tools.copyPerson(p);
 System.out.println(p == p2);//false说明 p与p2处在不同空间


class Person{
    String name;
    int age;
}

class MyTools{
    public Person copyPerson(Person p){
        Person p2 = new Person();
        p2.name = p.name;
        p2.age = p.age;
        return p2;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值