04.类(Class)与 对象(Object)

版权声明:原创文章,转载请声明原处 https://blog.csdn.net/qq_41723615/article/details/86218118

类属于抽象的概念集合;

如汽车、轮船、书描述的都是某一类事物的公共特征。

对象:表示一个个具体的事物
例如:张三同学、李四账户、王五的汽车,这些都是可以使用的事物, 就可以理解为对象, 所以对象表示的是一个个独立的个体。
 

类与对象的基本定义

Class 类名称 {
     //声明成员变量
     数据类型  属性(变量);
     
     ......
   
     //定义方法的内容
     public 返回值的数据类型  方法名称(参数1,参数2,...){
            
           程序语句;
           
           [return 表达式]; 
    }
}

类中的属性在开发中不一定只是变量,也有可能是其他内容,所以一般也会有人将其
称为成员(Field),在Java中使用的就是“ Field” 单词来描述的。

范例:定义类

class Book{
    String title;
    double price;
    public void getInfo(){//此方法将由对象调用
        System.out.println("图书名称:"+title+price);
    }
}
public class TestOo {
    public static void main(String args[]){
          Book bk=null;//声明对象
          bk.title="Java开发";//操作属性内容
          bk.price=89.9;
          bk.getInfo(); //调用类中的getInfo()方法
    }
}

此时根据给定的语法已经定义了一个Book 类, 在这个类中定义了两个属性: 图书名称( title 、
String类型) 、价格( price、double类型), 以及一个取得图书完整信息的getlnfo()方法。

为什么Book类定义的getlnfo()方法没有加上static?

在主类中定义, 并且由主方法直接调用的
方法必须加上static”, 但是现在的情况有些改变, 因为Book类的getlnfo()方法将会由对
象调用, 与之前的调用形式不同, 所以暂时没有加上。

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

格式:声明并实例化对象。

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

格式:分步完成。

声明对象: 类名称 对象名称=null;
实例化对象: 对象名称=new 类名称();

当一个对象实例化后就可以按照如下方式利用对象来操作类的结构。
     对象属性:表示要操作类中的属性内容;
     对象方法:表示要调用类中的方法。

范例:使用类一一在主类中使用Book类。

class Book  { //定义一个新的类
    private String title;
    private double price;
    public void setTitle(String t){
        title=t;

    }
    public void setPrice(double p){
        if (p>0.0){
            price=p;
        }
    }
    public String getTitle(){
        return title;
    }
    public double getPrice(){
       return price;
    }
    public void getInfo(){
          System.out.println("图书名称:"+title+price);
    }
    public class TestOo{
        public static void main(String args[]){
            Book bk=null;//声明对象
            bk.title="Java开发";//操作属性内容
            bk.price=89.9;
            bk.getInfo(); //调用类中的getInfo()方法
    }
}
}
//检查错误代码应该在setter之中增加,getter只是简单的返回数据

类本身属于引用数据类型, 而对于引用数据类型的
执行分析就必须结合内存操作来看

堆内存( heap)保存每一个对象的属性内容, 堆内存需要用关键字new才可以开辟, 如果一个
对象没有对应的内存指向, 将无法使用;

栈内存( stack )保存的是一块堆内存的地址数值, 可以把它想象成一个int型变量(每一个int
型变量只能存放-个数值), 所以每一块
内存只能够保留一块堆内存地址。

• 堆内存:保存对象的真正数据, 都是每一个对象的属性内容;
• 栈内存:保存的是一块堆内存的空间地址, 但是为了方便理解, 可以简单地
将植内存中保存的数据理解为对象的名称(Book bk), 就假设保存的是 “ bk” 对象
名称。

对象使用前都需要进行实例化操作, 如果只是声明了对象, 但是并没有为其实例化,

会出现“ NullPointerException” (空指向异常)。

引用数据的初步分析

引用传递是整个Java中的精髓所在, 而引用传递的核心概念也只有一点: 一块
堆内存空间(保存对象的属性信息)可以同时被多个枝内存共同指向,则每一个战
内存都可以修改同一块堆内存空间的属性值。

在所有的引用分析里面,最关键的还是关键字“new”。一定要注意的是,每一次使用关键字new
都一定会开辟新的堆内存空间,所以如果在代码里面声明两个对象,并且使用了关键字new为两个对象
分别进行对象的实例化操作,那么一定是各自占有各自的堆内存空间,并且不会互相影响。

范例 :对象引用传递。

public class TestOo2{
    public static void mian(String args[]){
          Book bookA=new Book();
              Book bookB=null;
              bookA.title="java";
              bookA.price=80;
              bookB=bookA;//引用传递
              bookB.price=40;//利用第二个对象设置属性内容
              bookA.getInfo();
    }
}

范例:深入观察引用传递。

public class TestOo2{
    public static void mian(String args[]){
          Book bookA=new Book();
              Book bookB=new Book();
              bookA.title="java";
              bookA.price=10;
              bookB.title="jsp";
              bookB.price=20;
              bookB=bookA;//引用传递
              bookB.price=30;//利用第二个对象设置属性内容
    }
}

本程序首先分别实例化了bookA 与bookB 两个不同的对象,由于其保存在不同的内存空间,
所以设置属性时不会互相影响。然后发生了引用传递( bookB = bookA ),由于bookB 对象原本存
在有指向的堆内存空间,并且一块栈内存只能够保存一块堆内存空间的地址,所以bookB 要先断开
已有的堆内存空间,再去指向book A 对应的堆内存空间, 这个时候对于原本的bookB 内存没有任
何指向, bookB 将成为垃圾空间。最后由于bookB 对象修改了price 属性的内容。程序的内存关系

通过内存分析可以发现,在引用数据类型关系时, 一块没有任何栈内存指向的堆内存空间将成
为垃圾,所有的垃圾会不定期地被垃圾收集器( Garbage Collector )问收, 回收后会被释放掉其所
占用的空间。
虽然Java 支持自动的垃圾收集处理. 但是在代码的开发过程中应该尽量减少垃圾空间的产生。

 

猜你喜欢

转载自blog.csdn.net/qq_41723615/article/details/86218118