一、面向对象三个重要特征
·封装性:类内部的定义对外部不可见。
·继承性:扩充已有类的功能。
·多态性:方法重载、覆写,对象的多态性
二、类与对象
类是对象的模板,对象是类的实例
每一个对象中实际上保存的只是属性,并没有保存方法,因为所有的方法都是每个对象所共同拥有的,保存在全局代码区之中。栈内存保存的是对堆内存的引用地址,而堆内存中保存的是每一个对象所拥有的属性,而全局代码区之中保存的是所有类中的方法,表示公共调用。
对象的引用传递:一块堆内存可以同时被多个对象所同时指向。
三、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;
}
}