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;
    }

    @Override
    public 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       ---     1163157884

        System.out.println(person1);    // Person{name='张三', age=10}
        System.out.println(personCopy);  // Person{name='张三', age=10}

    }

}

你可能感兴趣的:(Java,jvm,java,开发语言)