JAVA基础语法学习DAY2

梦回学习C++面对对象编程

相当于重学因为我忘了

class可以包含多个成员变量,例如,我们给Person类就定义了两个成员变量(field)
class Person {
    public String name;
    public int age;
}

但是,直接把fieldpublic暴露给外部可能会破坏封装性。比如,代码可以这样写:

Person ming = new Person();
ming.name = "Xiao Ming";
ming.age = -99; // age设置为负数 

显然,直接操作field,容易造成逻辑混乱。为了避免外部代码直接去访问field,我们可以用private修饰field,拒绝外部访问:

class Person {
    private String name;
    private int age;
}

fieldpublic改成private,外部代码不能访问这些field,那我们定义这些field有什么用?怎么才能给它赋值?怎么才能读取它的值?

所以我们构造一个内部的函数来让外部代码可以间接修改field

getmethod()

public class Main {
    public static void main(String[] args) {
        Person ming = new Person();
        ming.setName("Xiao Ming"); // 设置name
        ming.setAge(12); // 设置age
        System.out.println(ming.getName() + ", " + ming.getAge());
    }
}

class Person {
    private String name;
    private int age;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        if (age < 0 || age > 100) {
            throw new IllegalArgumentException("invalid age value");
        }
        this.age = age;
    }
}

JAVA this的用法 在局部和全局变量冲突时用this

class Person {
    private String name;

    public String getName() {
        return name; // 相当于this.name
    }
}
class Person {
    private String name;

    public void setName(String name) {
        this.name = name; // 前面的this不可少,少了就变成局部变量name了
    }

 传参必须符合我们定义的数据类型

可变参数

class Group {
    private String[] names;

    public void setNames(String... names) {
        this.names = names;
    }
}

上面的setNames()就定义了一个可变参数。调用时,可以这么写: 

可以传多个参数至少我理解的是这样

Group g = new Group();
g.setNames("Xiao Ming", "Xiao Hong", "Xiao Jun"); // 传入3个String
g.setNames("Xiao Ming", "Xiao Hong"); // 传入2个String
g.setNames("Xiao Ming"); // 传入1个String
g.setNames(); // 传入0个String

参数固定 猜一下下面的代码最后的输出多少 

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        int n = 15; // n的值为15
        p.setAge(n); // 传入n的值
        System.out.println(p.getAge()); // 15
        n = 20; // n的值改为20
        System.out.println(p.getAge()); // 15还是20?
    }
}

class Person {
    private int age;

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 由此得知 当age冲突时 第一次设置 会影响全局 但是第二次变化时 局部变量却不会引起变化,

为什么setAge 第一次能影响p里面age的值 第二次却不会呢

  • 在第一次调用 p.setAge(n); 时,n 的值(15)被复制并传递给 p 对象的 age 属性。此时,page 属性值被设置为 15。
  • 当你修改 n 的值为 20 时,这只是改变了 n 这个局部变量的值,并不会影响到已经传递给 p 对象的 age 属性的值。
  • 因此,第二次打印 p.getAge() 的结果仍然是 15。

引用类型这样做 输出却会发生变化 

在Java中,数据类型可以分为基本类型(也称为原始类型)和引用类型。了解这两者之间的区别对于理解Java的内存管理和参数传递机制非常重要。

基本类型(Primitive Types)

基本类型是Java语言直接支持的最基本的数据类型。它们是:

  • 整数类型:

    • byte: 8位
    • short: 16位
    • int: 32位
    • long: 64位
  • 浮点类型:

    • float: 32位
    • double: 64位
  • 字符类型:

    • char: 16位
  • 布尔类型:

    • boolean: 只能取truefalse

基本类型的数据是存储在栈内存中的,并且直接包含实际的值。当你将基本类型传递给一个方法时,传递的是这个值的一个副本,方法对这个副本的修改不会影响到原始值。

示例

 

java

复制代码

int a = 10; int b = a; // b得到a的值,副本 b = 20; // 修改b不会影响a System.out.println(a); // 输出10

引用类型(Reference Types)

引用类型包括所有的类、接口、数组等。它们存储在堆内存中,而栈内存中存储的是对象的引用(内存地址)。当你将引用类型传递给一个方法时,传递的是对象的引用,所以方法对对象的修改会影响到原始对象。

示例

 

java

复制代码

class Person { String name; } Person p1 = new Person(); p1.name = "Homer"; Person p2 = p1; // p2和p1引用同一个Person对象 p2.name = "Bart"; // 修改p2也会影响p1 System.out.println(p1.name); // 输出 "Bart"

在上面的示例中,p1p2引用的是同一个Person对象,因此通过其中任何一个引用对Person对象的修改,都会反映在其他引用上。

总结

  1. 基本类型:

    • 包括:byte, short, int, long, float, double, char, boolean
    • 通过值传递
    • 存储在栈内存中
    • 修改副本不影响原值
  2. 引用类型:

    • 包括:所有的类(如StringPerson)、接口、数组等
    • 通过引用传递
    • 引用存储在栈内存中,对象存储在堆内存中
    • 修改引用的对象会影响所有引用该对象的变量

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值