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

范例:第二道程序
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" ; }};
字符串的内容无法改变,改变的只是内存地址的指向。
范例:第三道程序
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("!!!") ; }};实际上,本程序和第一道程序是完全一样的,下面观察内存关系图。
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) ; }};