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基本数据类型的使用。

原创粉丝点击