美文网首页
Java-类和对象(一)

Java-类和对象(一)

作者: 一只洁_ | 来源:发表于2019-08-28 10:49 被阅读0次

一.类和对象的基本概念

类与对象时整个面向对象中最基础的组成单元。

:是一个模板,它描述一类对象的行为和状态。;
对象:对象是类的一个实例,有状态和行为。

可以一句话来总结出类和对象的区别:类是对象的模板,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。

二.类与对象的定义和使用

Java中定义,使用关键词class,如下

class 类名称{
    属性(变量);
    行为(方法);
}

举例:

class Person {
    String name;
    int age;
    public void tell(){
        System.out.println("姓名"+name+"年龄"+age);
    }
}

类定义完成之后,肯定无法直接使用。如果要使用,必须依靠对象,那么由于类属于引用数据类型,所以对象的产生格式(两种格式)如下:

(1)格式一:声明并实例化对象

类名称 对象名称 = new 类名称 () ;

(2)格式二:先声明对象,然后实例化对象:

类名称 对象名称 = null ;
对象名称 = new 类名称 () ;

引用数据类型与基本数据类型最大的不同在于:引用数据类型需要内存的分配和使用。所以,关键字new的主要功能就是分配内存空间,也就是说,只要使用引用数据类型,就要使用关键字new来分配内存空间。

当一个实例化对象产生之后,可以按照如下的方式进行类的操作:
对象.属性:表示调用类之中的属性。
对象.方法():表示调用类之中的方法。

下面举实例:

public class Test {
    public static void main(String[] args){
        Person person = new Person();
        person.age = 20;
        person.name = "小王";
        person.tell();
    }
}

class Person {
    String name;
    int age;
    public void tell(){
        System.out.println("姓名:"+name+" 年龄:"+age);
    }
}

运行结果:

姓名:小王 年龄:20

我们换另一种操作来试一下:

public class Test {
    public static void main(String[] args){
        Person person = null;
        person = new Person();
        person.age = 20;
        person.name = "小王";
        person.tell();
    }
}
class Person {
    String name;
    int age;
    public void tell(){
        System.out.println("姓名:"+name+" 年龄:"+age);
    }
}

运行结果与第一种相同
问题来了,以上两种不同的实例化方式有什么区别呢?
我们从内存的角度分析。首先,给出两种内存空间的概念:
(1)堆内存:保存对象的属性内容。堆内存需要用new关键字来分配空间;
(2)栈内存:保存的是堆内存的地址(在这里为了分析方便,可以简单理解为栈内存保存的是对象的名字)。

08284.png

任何情况下,只要看见关键字new,都表示要分配新的堆内存空间,一旦堆内存空间分配了,里面就会有类中定义的属性,并且属性内容都是对应数据类型的默认值。

于是,上面两种对象实例化对象方式内存表示如下:

08281.png
08282.png
08283.png

两种方式的区别在于①②,第一种声明并实例化的方式实际就是①②组合在一起,而第二种先声明然后实例化是把①和②分步骤来。

另外,如果使用了没有实例化的对象,结果如何?

public class Test {
    public static void main(String[] args){
        Person person = null;
        person.age = 20;
        person.name = "小王";
        person.tell();
    }
}
class Person {
    String name;
    int age;
    public void tell(){
        System.out.println("姓名:"+name+" 年龄:"+age);
    }  
}

程序在编写的时候不会报错,但是一运行:

Exception in thread "main" java.lang.NullPointerException
    at Day0828.Test.main(Test.java:7)

此时,程序只声明了Person对象,但并没有实例化Person对象(只有了栈内存,并没有对应的堆内存空间),则程序在编译的时候不会出现任何错误,但是在执行的时候出现了上面的错误信息。这个错误信息表示的是”NullPointerException(空指向异常)“,这种异常只要是应用数据类型都有可能出现。

三.对象引用传递初步分析

引用传递的精髓:同一块堆内存空间,可以同时被多个栈内存所指向,不同的栈可以修改同一块堆内存的内容。

下面通过若干个程序,以及程序的内存分配图,来进行代码的讲解。

先看一个范例:

public class Test {
    public static void main(String[] args){
        Person person1 = new Person();
        person1.age = 20;
        person1.name = "小王";
        person1.tell();

        Person person2 = person1;
        person2.age = 23;
        person2.name = "小张";
        person2.tell();
        person1.tell();
    }
}
class Person {
    String name;
    int age;
    public void tell(){
        System.out.println("姓名:"+name+" 年龄:"+age);
    }
}

运行结果:

姓名:小王 年龄:20
姓名:小张 年龄:23
姓名:小张 年龄:23

对应的内存分配图如下:


08285.png
08286.png
08287.png

再看一个例子:

public class Test {
    public static void main(String[] args){
        Person person1 = new Person();
        Person person2 = new Person();

        person1.age = 20;
        person1.name = "小王";

        person2.age = 23;
        person2.name = "小张";

        person2 = person1;//引用传递
        person2.age = 30;
        person2.tell();
    }
}
class Person {
    String name;
    int age;
    public void tell(){
        System.out.println("姓名:"+name+" 年龄:"+age);
    }
}

运行结果:

姓名:小王 年龄:30

内存分配图:


08288.png
08289.png
082810.png
082812.png

垃圾:指的是程序开发之中没有任何对象所指向的一块堆内存空间,这块空间就成为垃圾,所有的垃圾将等待GC(垃圾收集器)不定期的进行回收与空间的释放。

文章借鉴:https://blog.csdn.net/wei_zhi/article/details/52745268

相关文章

  • Hello Java

    目录 Java-基础(1/6) Java-对象(2/6) Java-核心库类 上(3/6) Java-核心库类下(...

  • Java- 对象和类

    Java- 对象和类 类是对象的模板。它定义对象的属性,并提供创建对象的构造方法以及对对象进行操作的方法。 类也...

  • Java-类和对象(一)

    一.类和对象的基本概念 类与对象时整个面向对象中最基础的组成单元。 类:是一个模板,它描述一类对象的行为和状态。;...

  • Java-浅析Object类

    Java-浅析Object类 ++2016.7.19++byside @Java-浅析Object类 ======...

  • Java- 关于对象的思考

    Java- 关于对象的思考 不可变对象一旦创建,就不能改变。为防止用户修改对象,可以定义不可变类。定义不可变类需...

  • Java-类与对象

    练习

  • Java-线程同步(2)

    Java-线程同步(1)说到Lock对象,但是和synchronized相比似乎只是多了一个tryLock和loc...

  • Java- 继承和多态

    Java- 继承和多态 可以从现有的类派生出新类。这称为类的继承。新类称为次类、子类或派生类。现有的类称为超类、父...

  • Java-对象和对象的引用

    参考:http://www.cnblogs.com/focusChen/articles/2497768.html...

  • 类和对象(一)

    定义:类:就是拥有相同和功能的对象的集合(类是抽象的)对象:类的实例(对象是具体的) 一、编程思想 1.面向对象编...

网友评论

      本文标题:Java-类和对象(一)

      本文链接:https://www.haomeiwen.com/subject/ntiuectx.html