Java入门基础之【对象和类】3
来源:互联网 发布:开源房产cms 编辑:程序博客网 时间:2024/06/05 05:14
Java 对象和类
一、类和对象的基本概念
对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
类:类是一个模板,它描述一类对象的行为和状态。
类和对象的区别:类是对象的模板,对象是类的实例。
二、类与对象的定义和使用
- 一个源文件中只能有一个public类
- 一个源文件可以有多个非public类
类可以看成是创建Java对象的模板。
通过下面一个简单的类来理解下Java中类的定义:
public class Dog { //类名首字母大写
String name; //属性(变量)
int age;
//行为(方法)
void barking() {
}
}
类定义完成之后,肯定无法直接使用。如果要使用,必须实例化对象,如下:
(1)声明并实例化对象
类名称 自定义名称 = new 类名称();
Dog dog = new Dog();
(2)先声明对象,然后实例化对象
类名称 自定义名称 = null;
自定义名称 = new 类名称();
Dog dog = null;
dog = new Dog();
当一个实例化对象产生之后,可以按照如下的方式进行类的操作:
对象.属性:表示调用类之中的属性;对象.方法():表示调用类之中的方法。
例1:使用对象操作类(声明并实例化对象)
class Dog {
String name;//属性(变量)
int age;
//行为(方法)
void barking() {
System.out.println("姓名:"+name+"\n年龄:"+age);
}
}
public class TestDemo {
public static void main(String[] args) {
Dog dog = new Dog(); //声明并实例化对象
dog.name="小王"; //调用Dog类里的name属性
dog.age=2; //调用Dog类里的age属性
dog.barking(); //调用barking()方法
}
}
运行结果:
姓名:小王
年龄:2
例2:使用对象操作类(先声明对象,然后实例化对象)
class Person{
String name;//属性(变量)
int age;
//行为(方法)
void barking() {
System.out.println("姓名:"+name+"\n年龄:"+age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person per =null; //声明对象
per = new Person();//实例化对象
per.name="小王"; //调用Person类里的name属性
per.age=2; //调用Person类里的age属性
per.barking(); //调用barking()方法
}
}
运行结果:
姓名:小王
年龄:2
那么,问题来了,以上两种不同的实例化方式有什么区别呢?
我们从内存的角度分析。首先,给出两种内存空间的概念:
(1)堆内存:保存对象的属性内容。堆内存需要用new关键字来分配空间;
(2)栈内存:保存的是堆内存的地址(在这里为了分析方便,可以简单理解为栈内存保存的是对象的名字)。
任何情况下,只要看见关键字new,都表示要分配新的堆内存空间,一旦堆内存空间分配了,里面就会有类中定义的属性,并且属性内容都
是其对应数据类型的默认值。
两种方式的区别在于①②,第一种声明并实例化的方式实际就是①②组合在一起,而第二种先声明然后实例化是把①和②分步骤来。
另外,如果使用了没有实例化的对象,结果如何?
如下:
classPerson{
String name;//属性(变量)
int age;
//行为(方法)
void barking() {
System.out.println("姓名:"+name+"\n年龄:"+age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person per =null; //声明对象
//per = new Person();//实例化对象
per.name="小王"; //调用Person类里的name属性
per.age=2; //调用Person类里的age属性
per.barking(); //调用barking()方法
}
}
运行会报错:Exception in thread "main" java.lang.NullPointerException
at com.test.TestDemo.main(TestDemo.java:18)
因为只声明了Person对象,但并没有实例化Person对象(只有了栈内存,并没有对应的堆内存空间),则程序在编译的时候不会出现任何的错误,但是在执行的时候出现了上面的错误信息。这个错误信息表示的是“NullPointerException(空指向异常)”
三、对象引用传递分析
引用传递的精髓:同一块堆内存空间,可以同时被多个栈内存所指向,不同的栈可以修改同一块堆内存的内容。
下面通过若干个程序,以及程序的内存分配图,来进行代码的讲解。
class Person {
String name;
int age;
void barking() {
System.out.println("姓名:"+name+"\n年龄:"+age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person per1 = new Person(); //声明并实例化对象
per1.name="小王";
per1.age=2;
Person per2 =per1; //引用传递
per2.name="小王王";
per1.barking();
}
}
运行结果:
姓名:小王王
年龄:2
对应的内存分配图如下:
再来看另外一个:
class Person{
String name;
int age;
void barking() {
System.out.println("姓名:"+name+"\n年龄:"+age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person per1 = new Person(); //声明并实例化对象
Person per2 = new Person();
per1.name="小王";
per1.age=2;
per2.name="小王王";
per2.age=3;
per2 =per1; //引用传递
per2.name="小王二";
per1.barking();
}
}
运行结果:
姓名:小王二
年龄:2
对应的内存分配图如下:
垃圾:指的是在程序开发之中没有任何对象所指向的一块堆内存空间,这块空间就成为垃圾,所有的垃圾将等待GC(垃圾收集器)不定期的进行回收与空间的释放。
本章节介绍了Java的对象和类,下一章节中我们将介绍Java基本数据类型的使用。
- Java入门基础之【对象和类】3
- java基础入门之对象导论
- Java初级入门之 Four 类和对象
- Java入门基础之【StringBuffer和StringBuilder类】12
- java基础复习之二——类和对象
- [Java基础] 类和对象
- Java基础---类和对象
- Java类和对象基础
- Java基础:类和对象
- Java基础:类和对象
- java 基础 - 类和对象
- java基础入门之五(面向对象+this)
- java基础--面向对象入门
- java基础入门-----System对象
- java基础入门-----Runtime对象
- java基础入门----Date对象
- java基础入门---- Calendar对象
- java基础 第一章 对象入门
- MINA2.0 原理
- UItextField占位符在中间
- 到底什么才是闭包
- 六角幻方
- 个人笔记 org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.
- Java入门基础之【对象和类】3
- Hibernate——配置文件中数据类型date与timestamp区别
- HDU 1242 Rescue
- 用R语言的MICE包对缺失数据进行多重插补(一)-- 缺失数据分析
- C++对象模型
- gym 101170 NWERC 2016 I Iron and Coal
- linux系统安装git,nodejs,mysql
- SAS篇-如何判断一个字段值是否为空?
- 重新解析 REST Service(REST Service 的最佳实践,第 1 部分)