类属于抽象的概念集合;
如汽车、轮船、书描述的都是某一类事物的公共特征。
对象:表示一个个具体的事物
例如:张三同学、李四账户、王五的汽车,这些都是可以使用的事物, 就可以理解为对象, 所以对象表示的是一个个独立的个体。
类与对象的基本定义
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 支持自动的垃圾收集处理. 但是在代码的开发过程中应该尽量减少垃圾空间的产生。