java基础---->面向对象基础

一、面向对象三个重要特征

·封装性:类内部的定义对外部不可见。

·继承性:扩充已有类的功能。

·多态性:方法重载、覆写,对象的多态性

二、类与对象

类是对象的模板,对象是类的实例

每一个对象中实际上保存的只是属性,并没有保存方法,因为所有的方法都是每个对象所共同拥有的,保存在全局代码区之中。栈内存保存的是对堆内存的引用地址,而堆内存中保存的是每一个对象所拥有的属性,而全局代码区之中保存的是所有类中的方法,表示公共调用。

对象的引用传递:一块堆内存可以同时被多个对象所同时指向。

三、instanceof关键字

通过instanceof关键字可以判断某一个对象是否是某一个类的实例。

class A {};

class B extends A {};

public class InstanceDemo {

 public static void main(String  args[]){
                   A a = new A() ;
                   A a1=new B();
                   System.out.println(a  instanceof A) ;// true
                   System.out.println(a  instanceof B) ;// false
                   System.out.println(a1 instanceof A) ;// true
                   System.out.println(a1  instanceof B) ;// true
         }
};

所以,以后在进行向下转型操作之前,一定要先使用instanceof关键字进行验证,验证通过了,才可以放心安全的执行向下转型的操作

四、构造方法

构造方法的定义:在一个类中定义的方法名称与类名称相同,且无返回值声明的方法,称为构造方法。在一个类中如果没有明确的定义一个构造方法的话,则会自动生成一个无参的,什么都不做的构造方法,又名无参构造器。当一个类中已经明确的定义了一个构造方法的时候,则无参构造方法将不再自动生成,也就是说一个类永远都会  保证至少有一个构造方法。构造方法允许重载

五、this关键字

访问属性、调用方法(包含了构造)、表示当前对象

5.1、访问属性

明确的强调出要把构造方法中的name或age参数给类中的name和age属性的话,就需要通过this来表示出本类的属性。

public Person(String name,int  age){
 
       this.name = name ;
 
       this.age = age ;
 
    }

5.2、调用方法

例如在构造方法中使用构造方法,以避免写重复的代码。

如果使用this调用其他构造方法的话,有一点需要注意,即:如果使用this调用本类中其他构造方法的话,则此语句必须放在构造方法的首行。而且,在使用this调用构造方法的时候一定要注意:“一个类中如果有多个构造方法的话,则肯定保留有一个是不用this调用其他构造的情况,以作为出口”。而且当一个类中如果存在多个构造方法的时候,一定要按照以下的顺序进行:将参数少的构造方法放在最前面,参数多的构造方法放在最后面。

5.3、表示当前

只能在方法内部使用,表示对调用方法的那个对象的引用

this的最大用法实际上就只有一个:“表示当前对象”,包括以上的访问属性或者是调用构造等等,实际上都是此概念的体现。当前调用类中方法的对象称为当前对象。   

六、匿名对象

new  Person("张三",30).tell() ;

由于匿名对象没有对应的栈内存所指向,所以使用一次之后就等待被垃圾回收了。

每一个字符串都是一个匿名的String对象。

七、对象的引用传递

范例:程序一

class Demo {
 private int count = 10;
 public void setCount(int count) {
  this.count = count;
 }

 public int getCount() {
  return this.count;
 }

};

public class RefDemo01 {

 public static void main(String args[]) {
  Demo d1 = new Demo();
  d1.setCount(100);
  fun(d1);
  System.out.println(d1.getCount());
 }

 public static void fun(Demo d2) {
  d2.setCount(30);
 }
};
/* Output:
 30
 */

范例:第二道程序

public class RefDemo02 {
 public static void main(String args[]) {
  String str = "hello";
  fun(str);
  System.out.println(str);
 }

 public static void fun(String temp) {
  temp = "world";
 }

};
/*
 * Output: hello
 */

字符串的内容无法改变,改变的只是内存地址的指向。

范例:第三道程序

class Demo {

 private String str = "hello";

 public void setStr(String str) {
  this.str = str;
 }

 public String getStr() {
  return this.str;
 }

};

public class RefDemo03 {

 public static void main(String args[]) {
  Demo d1 = new Demo();
  d1.setStr("world");
  fun(d1);
  System.out.println(d1.getStr());
 }

 public static void fun(Demo d2) {
  d2.setStr("!!!");
 }

};
/*Output: 
 !!!
*/

实际上,本程序和第一道程序是完全一样的,下面观察内存关系图。

八、对象比较

public boolean equals(Object obj) {
  if (this == obj) {
   return true;
  }

  if (!(obj instanceof Person)) {
   return false;
  }

  Person per = (Person) obj;
  if (this.name.equals(per.name) && this.age == per.age) {
   return true;
  } else {
   return false;
  }

 }


 

 

 

posted on 2012-07-25 16:15  小-强-斋-太  阅读(129)  评论(0编辑  收藏  举报

导航