读书人

java基础-gt;面向对象二

发布时间: 2012-08-03 00:12:14 作者: rapoo

java基础---->面向对象2
一、this关键字

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

1.1、访问属性

以上的操作程序中的name和age两个参数实际上与类中的属性没有任何的关系,而只是在构造方法中的参数间的互操作而已,那么如果此时非要明确的强调出要把构造方法中的name或age参数给类中的name和age属性的话,就需要通过this来表示出本类的属性。

public Person(String name,int  age){       this.name = name ;       this.age = age ;    }
1.2、调用方法

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

1.3、表示当前

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

二、对象的引用传递2.1、三道引用范例

范例:程序一

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) ;    }};

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

范例:第二道程序

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" ;    }};

java基础->面向对象二字符串的内容无法改变,改变的只是内存地址的指向。

范例:第三道程序

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("!!!") ;    }};

实际上,本程序和第一道程序是完全一样的,下面观察内存关系图。java基础->面向对象二

三、对象比较
public boolean compare(Person person){       if(this == person){  // 地址相等了           return true ;       }       if(this.name.equals(person.name) && this.age==person.age){           return true ;       } else {           return false ;       }    }
四、static关键字

static关键字在类中可以声明属性或方法。声明的属性将称为全局属性,声明的方法将成为类方法。

static的使用注意

1、 使用static声明的方法,不能访问非static的操作(属性或方法)

2、 非static声明的方法,可以访问static声明的属性或方法

原因:

1、 如果说现在一个类中的属性或方法都是非static类型的,肯定是要有实例化对象才可以调用。

2、 static声明的属性或方法可以通过类名称访问,可以在没有实例化对象的情况下调用。

当一个实例化对象产生之后,可以调用所有的非static的操作,那么肯定也就可以调用所有的static操作。

五、代码块

在程序中使用“{}”括起来的一段代码就称为代码块,根据代码块出现的位置或声明的关键字的不同,分为四种:

    普通代码块:在一个方法中定义的代码块,称为普通代码块构造块:在一个类中定义的代码块,构造块会优先于构造方法执行,而且每当一个新的实例化对象产生时,都会调用构造块,会调用多次。静态块:使用static关键字声明的代码块,在主类中定义的静态块将优先于主方法执行,而且可以发现静态块优先于构造块执行,而且只执行一次,可以使用静态块“替代”掉主方法。
      static {        System.out.println("HelloWorld!!!") ;        System.exit(1);    }

    同步代码块:如果在代码块前加上 synchronized关键字,则此代码块就成为同步代码块。

    class Outer { // 定义外部类 private String info = "Hello" ; class Inner { // 定义内部类 public void print(){ System.out.println(info) ; // 输出info属性 } }; public void fun(){ new Inner().print() ; }};public class InnerDemo01 { public static void main(String args[]){ new Outer().fun() ; }};

    从以上的代码中可以观察到内部类的特点:

    1、 缺点:破坏了一个程序的标准结构;

    2、 优点:可以方便的访问外部类中的私有成员。

    在一个类的外部来实例化内部类的对象:外部类.内部类。

    class Outer {   // 定义外部类    private String info = "Hello" ;    class Inner {   // 定义内部类        public void print(){            System.out.println(info) ;  // 输出info属性        }    };};public class InnerDemo03 {    public static void main(String args[]){        Outer.Inner in = null ;         //  声明内部类的对象        in = new Outer().new Inner() ;        in.print() ;    }};

    内部类如果要被外部所调用的话,则一定要先产生外部类的实例化对象,之后再产生内部类的实例化对象。

    6.2、使用static声明内部类

    在内部类的定义中,也可以使用static关键字完成操作,一旦使用static声明了一个内部类的话,则此类将成为外部类,且只能访问外部类中的static成员。

    class Outer {   // 定义外部类    private static String info = "Hello" ;    static class Inner {    //  定义内部类,是static变为外部类        public void print(){            System.out.println(info) ;  // 输出info属性        }    };};public class InnerDemo04 {    public static void main(String args[]){        // Outer.Inner in = new Outer().new Inner() ;        Outer.Inner in = new Outer.Inner() ;        in.print() ;    }};

    6.3、在方法中声明内部类

    理论上而言,一个内部类可以在任意的位置上声明,例如:一个循环语句中,或者在一个方法之中,从开发来看,在方法中声明内部类的操作出现的是最多的。

    class Outer {    private String info = "hello" ;    public void fun(){        class Inner {   // 方法中声明内部类            public void print(){                System.out.println(info) ;            }        };        new Inner().print() ;    }};public class InnerDemo05 {    public static void main(String args[]){        new Outer().fun() ;    }};

    此时,可以发现,一个在方法中定义的内部类,依然可以访问外部类中的属性,但是对于方法的参数,这个内部类是无法直接访问的,如果要访问,则在参数前面必须使用final关键字进行声明。

    class Outer {    private String info = "hello" ;    public void fun(final int x){        final int y = 100 ;        class Inner {   // 方法中声明内部类            public void print(){                System.out.println(info) ;                System.out.println("x = " + x) ;                System.out.println("y = " + y) ;            }        };        new Inner().print() ;    }};public class InnerDemo06 {    public static void main(String args[]){        new Outer().fun(30) ;    }};

读书人网 >编程

热点推荐