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