java细则(更新中....)

1.静态和动态

        静态:在类中使用static关键字定义的成员(方法或变量)被称为静态成员。静态成员属于类本身,而不是类的实例对象。可以通过类名直接访问静态成员,而不需要创建类的实例。

        动态:指的是非静态成员,即在类中没有使用static关键字定义的方法或变量。这些成员属于类的实例对象,每个实例对象都有自己的动态成员。

        主要区别:

  • 静态成员属于类本身,只有一份副本,可以通过类名直接访问。而动态成员属于类的实例对象,每个对象都有自己的一份副本,需要通过实例对象访问。
  • 静态成员在类加载时就被分配内存,因此可以在没有创建类的实例对象的情况下访问。而动态成员需要在类的实例对象创建后才能访问。
  • 静态成员可以用于共享数据和方法,例如计数器、工具方法等。而动态成员用于描述对象的特性和行为,例如对象的属性和方法。

2.上转型下转型 

        上转型允许将一个子类对象引用赋值给一个父类引用变量。通过上转型,你可以使用父类的引用来指向子类的对象,实现了多态性(Polymorphism)的特性。        

        上转型定义的对象可以通过父类引用变量调用父类中的方法,但不能直接调用子类特有的方法。当对象被上转型为父类类型后,它只能访问父类中定义的方法和属性,以及被子类覆盖的方法,不能访问子类特有的方法和属性。如要访问则需要下转型。

        上转型原理:定义对象时将类型改为父类类名。即使用子类构造函数初始化,将对象引用赋值给父类。通过上转型,对象的类型变成了父类,这样你就可以通过父类的引用来操作这个子类的对象。这种操作提高了代码的灵活性,使得你可以通过一个通用的引用变量来引用不同子类的对象。

        下转型是从父类类型转换为子类类型的操作。在面向对象编程中,当一个对象被上转型(从子类转型为父类)后,它丧失了对其原始子类特有的成员(字段和方法)的直接访问权限。如果再次访问这些子类特有的成员,就需要将父类引用重新转换为子类引用,这个操作被称为下转型。

子类名 新对象 = (子类名) 上转型对象;  //新对象可以直接调用子类特有方法

或
 
((子类名) 上转型对象) . 子类方法名(); //仅能调用这一次,再使用需要重复格式

3..栈内存

        在Java中,内存分为两种主要类型:栈内存(Stack Memory)和堆内存(Heap Memory)。这两种内存区域在Java程序中有不同的用途和生命周期。

1. 存储方式: 栈内存用于存储方法调用的局部变量(比如方法的参数和方法内部定义的变量)以及方法调用的执行环境。
  
2. 生命周期: 局部变量的生命周期仅限于方法的执行期间。当一个方法被调用时,它的局部变量会被分配到栈内存中,当方法执行结束时,这些局部变量所占用的栈内存空间会被立即释放。

3. 线程特有:每个线程都有自己的栈内存,用于存储线程的方法调用和局部变量。

4. 速度快:栈内存的操作速度比堆内存快,因为它的分配和释放都是通过移动栈指针来实现的,非常高效。

5. 大小限制:栈内存的大小通常是固定的,较小。如果栈内存空间不足以存储方法调用和局部变量,将会抛出栈溢出错误(StackOverflowError)。

在Java中,基本数据类型的变量和对象的引用变量(不是对象本身)通常存储在栈内存中。对象本身(即对象的实例)通常存储在堆内存中。当你创建一个新的对象时,对象的引用被存储在栈内存中,而对象本身被存储在堆内存中。

总结来说,栈内存用于存储方法调用的信息,包括方法的局部变量和方法调用的执行环境,具有较小的固定大小,是每个线程独享的。

4.堆内存

在Java中,堆内存(Heap Memory)是用于存储对象实例的内存区域。所有通过关键字 `new` 创建的对象(无论是类的实例、数组对象还是其他类型的对象),都会在堆内存中被分配内存空间。

以下是关于Java堆内存的一些重要信息:

1. 存储对象: 堆内存用于存储所有的类的对象和数组。对象的实例数据存储在堆内存中。

2. 生命周期:堆内存中的对象的生命周期不受限于任何特定的方法,它们的生命周期取决于程序中的引用。只要对象被引用(被某个变量引用或存储在数据结构中),它就会在堆内存中存在。当对象不再被引用时,它就会成为垃圾,Java的垃圾回收器会自动回收这些不再使用的对象,释放它们占用的内存空间。

3. 大小动态分配: 堆内存的大小是动态分配的,它可以根据应用程序的需求进行扩展。当程序需要更多的堆内存时,Java虚拟机(JVM)会自动分配更多的空间。

4. 共享性: 所有线程共享堆内存。在多线程应用程序中,每个线程的栈内存是独立的,但堆内存是共享的。因此,多个线程可以同时访问和修改堆内存中的对象。

5. 自动内存管理: Java的垃圾回收器负责自动管理堆内存。它会定期检查哪些对象不再被引用,然后释放这些对象占用的内存空间,以便其他对象可以使用。

总之,堆内存是用于存储Java程序中所有对象实例的地方,它的大小是动态分配的,对象的生命周期由程序中的引用控制,而且它是多线程共享的。

5.String赋值返回地址

        在Java中,String类的对象是不可变的,这意味着一旦创建了一个String对象,它的值就不能被改变。当你使用String类的方法来修改字符串的内容时,实际上是创建了一个新的String对象,而不是在原有的对象上进行修改。这种不可变性保证了字符串对象的安全性和一致性。

        当你调用String类的方法时,它们并不直接修改原始字符串对象,而是创建一个新的字符串对象,然后返回对新对象的引用。这就是为什么String方法返回的是地址(或者说是引用)。这个引用指向新创建的字符串对象,而不是原始的字符串对象。

        注:键盘录入string变量时,java源码中使用new方法储存录入信息,即Scanner类会将读取的字符串信息存储在堆内存中的字符串对象中。

 6.串池

Java 中的字符串池(String Pool)是一个保存字符串对象的特殊区域,它位于堆内存中。字符串池的主要目的是提高内存利用率和性能,避免创建大量重复的字符串对象,特别是在处理字符串拼接等操作时。

当你创建一个字符串常量(例如`String str = "Hello";`),Java 虚拟机会首先检查字符串池中是否已经存在相同内容的字符串对象。如果存在,它会返回池中的引用,而不是创建新的对象。这就是字符串池的工作机制。

由于字符串常量在Java中非常常见,这种优化可以节省大量的内存。比如,如果你创建了两个字符串常量 `"Hello"`,它们将共享同一个字符串池中的对象,而不是创建两个相同内容的字符串对象。这样可以减少内存的消耗。

需要注意的是,字符串池仅适用于字符串常量,而不适用于通过`new`关键字创建的字符串对象。例如:

java
String str1 = "Hello"; // 会放入字符串池
String str2 = "Hello"; // 字符串池中已存在相同内容的字符串,直接引用
String str3 = new String("Hello"); // 会创建一个新的字符串对象,不在字符串池中

在上述例子中,`str1` 和 `str2` 共享同一个字符串对象,而 `str3` 是通过 `new` 创建的,它会在堆内存中创建

注意new开辟的新内存不会创建新的串池

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光的璃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值