> 文章列表 > JavaSE——面向对象重点(暂时先不写)

JavaSE——面向对象重点(暂时先不写)

JavaSE——面向对象重点(暂时先不写)


该文章描述了面向对象的重点内容,里面存在了一些JVM的浅面知识,例如,虚拟机栈,堆,方法区,运行时常量池等,使用到了泛型做增强实现等,递归,八皇后解决。需要具有一定的Java基础,比如,看得懂泛型类,略微了解对象内存空间。也一样是面向基础人员来进行观看的。 


1. 类与对象

类(class)和对象(object)是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型。

它们的关系是,对象是类的实例,类是对象的模板。对象是通过new classname产生的,用来调用类的方法;类的构造方法

类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。

2. 对象内存分配图

2.1 Java运行时常量池

  • 在JDK1.6中,方法区是以永久代的方式实现(HotSpot),常量池是方法区的一部分
  • 在JDK1.7中,方法区合并到堆内存中,常量池可以说在堆内存中。
  • 在JDK8中,方法区又被剥离出来,只不过实现方式不是永久代,此时的方法区叫元数据区,常量池也就在元数据区

2.2 常量池的概念以及作用

  • 通常来讲,所有变量(成员变量和局部变量),包括基本类型和引用类型,他们都存在虚拟机栈中,包括变量类型、变量名称、和变量值对于基本类型来说,值就是具体的值;而对于引用类型来说,值是指对象实例在堆内存中对应的地址
  • 对于引用类型的数据,如果没有常量池,那么就会反复在堆内存中创建和销毁值相同的对象,这样有损系统性能。相比之下,基本类型的变量就不会有这样的弊端,所以一般不会放到常量池中,直接在栈中操作即可
  • 常量池的作用是避免频繁地创建和销毁值相同的对象,节省内存空间,节省运行时间。比如,需要已存在的字符串,直接从常量池中取即可,无需重新创建。
  • 常量池:六大基本类型对应的包装类的常量池、String字符串常量池。

3. 克隆对象

要求:

     编写一个方法,把传递进来的Person类重新复制一份完全一样的,但是内存地址不同。

  •  编写Person实体类
package oop.pojo;public class Person {private String name;private Integer age;public Person() {}public Person(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\\'' +", age=" + age +'}';}}
  • 编写方法测试
package oop;import oop.pojo.Person;public class ObjectContext {public static Person copyPerson(Person person) {return new Person(person.getName(), person.getAge());}public static void main(String[] args) {Person person1 = new Person("张三", 10);Person personCopy = copyPerson(person1);System.out.println(person1.hashCode() + "       ---     " + personCopy.hashCode()); // 460141958       ---     1163157884System.out.println(person1);    // Person{name='张三', age=10}System.out.println(personCopy);  // Person{name='张三', age=10}}}