instanceof 关键字
对象引用名 instanceof 类名 ,来判读引用的对象和类名是否兼容(是否继承该类,或爷爷辈的类)
例子:
Team team = new Team();
team.addMember(new Magicer("jwnming",6));
team.addMember(new Soldier("dogee",4));
team.addMember(new Magicer("wanggl",7));
System.out.print("
" + "团队成员:");
for(int i = 0;i < team.allRole.length;i++){
if (team.allRole[i] instanceof Role ) {
System.out.print(team.allRole[i].getName() + " ");
}
}
System.out.println("
" + "
" +"这个团队的总伤害值:" + team.attackSum());
abstract修饰符、及其他修饰符的修饰对象
public 可以修饰属性、方法、构造方法、类
protected 可以修饰属性、方法、构造方法
default 可以修饰属性、方法、构造方法、类
private 可以修饰属性、方法、构造方法(如果修饰构造方法全为私有,则该类不支持被继承)
abstract 可以修饰方法、类
final 可以修饰属性、方法、类
1. abstract修饰类时,这个类只能声明引用、不能创建对象,可供子类继承(多态)
2. abstract修饰方法,抽象方法没有实现({}),只有声明(abstract void method();),供子类去覆盖实现
3. 总结:
a) 如果一个类具有抽象方法,那么这个类就必须是抽象类,但抽象类不一定有抽象方法
b) 如果一个类继承抽象类,但若这个类不希望成为抽象类,这个类就必须实现父亲类中所有的抽象方法
c) 抽象类也拥有构造方法,供子类用super()调用
d) 抽象方法可以使方法的声明和实现部分分离,声明提取到父类,实现留在子类,则更好的体现子类的共性放在父类的设计思想
17 -static修饰符、类加载
1. 修饰属性:静态的属性不属于任何对象,全类及其对象共用,可以用类名直接调用
2. 修饰方法:静态的方法可以直接用类名调用,和对象无关。静态方法只能访问静态成员和静态方法,非静态方法可以调用静态方法
3. 静态方法只能被子类的的静态方法覆盖,而且没有多态(因为对引用调用静态方法,等价于对引用的类型调用静态方法),静态修饰符和抽象修饰符不能在一起使用
4. 静态初始代码块在类加载的时候执行一次
a) 类加载:当JVM第一次使用一个类的时候,需要提取这个类的字节码文件,获取类的信息并保存起来
b) 类加载过程(顺序): ①如果需要先加载父类的静态代码块,再加载子类的静态代码块;
②再加载父类的初始化代码块进行初始化和调用构造方法;
③最后加载子类的初始化代码块进行初始化和调用构造方法
(总结:创建类时、先递归的从基类到派生类加载静态代码块,再依次初始化属性和调用构造方法)
c) 加载类的时机:①当第一次创建对象时;②第一次访问类的静态成员时
final修饰符
1. final修饰方法:用final修饰的方法不能被子类覆盖,但可以被继承
2. final修饰类:用final修饰的类不能被继承
3. final修饰变量:
a) 修饰局部变量:一旦赋值就不能更改(常量)
b) 修饰成员变量:用final修饰的类的成员变量,没有默认值,可以通过初始化赋值一次。如果只声明而没有初始化赋值,就必须在所有构造方法里赋值或用static修饰的代码块
接口interface
接口:接口是一个特殊的抽象类
注意:
)接口中所有的方法都是公开抽象方法(public abstract 方法名,可以省略不写)
(在jdk8后接口中可以有default、static方法. jdk9后几口中可以有private方法) 变态不?
)接口中的属性都是公开静态常量(public static final 常量名 ,可以省略不写)
)接口中没有构造方法,而抽象类中有构造方法
)一个类实现一个接口,如果这个类不希望成为一个抽象类,则就必须实现接口中的所有方法
接口的特性:
)接口之间可以定义多继承关系(接口之间的继承仍然是用extends,用“,”分隔)
)一个类在继承另外一个类的同时,还能实现多个接口此时多个接口之间用“,”隔开
接口的作用:
)实现多继承(注意不全是多继承,例如一个类不可能有两个方法名相同、参数表相同、放回值类型相同
的两个方法,所有就要求继承多个父类时,父类如果有相同方法时,就会出错)
)接口是一个标准(提高编程的弱耦合性)
定义接口就是定义一个标准,就把标准的实现者和标准的使用者分离,从而形成弱耦合关系
内部类
例如:
class A { //外部类
class B { } //内部类
}
上面的类编译之后会生成两个独立的类:A.class A$B.class
内部类可以访问外部类的私有成员
集中内部类:
1、 成员内部类:在一个类里面有一个类,例如上面的例子
创建内部类对象:先创建外部类对象,再创建内部类对象(A a = new A(); A.B b = a.new B();)
2、 静态内部类:内部类的修饰符为static
特点:①只能访问外部类的静态成员②可以直接创建内部类对象
创建内部类对象:A.B b = new A.B();
3、 局部内部类:在外部类的成员方法里面定义一个类
作用范围:从定义开始,到所在代码块结束
特点:①把创建对象语句写在方法里,当外部类调用方法时创建局部内部类②局部内部类不仅可以访问外部类的成员,还能访问外部类的局部变量,但必须加上final(常量),(1.8以上可以不写,虚拟机会根据代码默认加上)
main:A a = new A();
a.method(); //注意,应将局部类的创建在方法内
class A {
public void method() {
class B { }
}
}
4、 匿名内部类:是一种特殊的内部类
条件:①实现一个接口或是继承一个类时②只会创建这个类的一个对象时
例如:在main函数内实现一个接口IA:
IA a = new IA(){ //直接实现该几口,没有要实现该接口的类名
@Override
public void method() { }//实现该接口的方法
}
Object类
Object 是java中所有类的父类,Object o = 任何对象。Object 类中的方法是所有类对象都具有的方法
Object 类的方法:
1. getClass():获得对象的实际类型,例如getClass(animal)和getClass(dog) 的类型不同(dog extends animal)
2. finalize():在对象被垃圾回收的时候,由垃圾收集器自动调用。当内存资源即将耗尽,不得不回应时,才会启动垃圾回收(垃圾回收不应该在finalize()里执行)
3. toString():返回对象的字符串形式,打印一个对象就是打印对象的toString()方法的返回值
4. equals():判断两个对象(引用,例如String类型)内容是否相同
“==” 是判断两个引用是不是指向同一对象。
基本属性(如int,long)可以用“==”比较值是否相等;对象类型用equals比较引用的地址内的内容是否相同
equals方法覆盖:
public boolean equals(Object o) {
if(this == o) return true; //自反
if(o == null) return false; //空对象
if(this.getClass() != o.getClass()) return false; //判断实际类型不同
T t = (T) o; //T代表当前对象类型
逐一比较属性,若全部相等和相同,返回true; 在逐一属性比较时注意字符串要判断是否为空,如下:
return false ; //根据以上筛选返回true或false;
}
5. hashCode():哈希码(public int hashCode())
public int hashCode() { //简单覆盖
将字符串属性的hashCode与其他数值类型属性的值相加,返回
}
6. wait(),notify(),线程的等待(进入阻塞,释放锁标记和CPU)与通信(将其他线程从阻塞状态进入可执行状态,当执行完当前线程后,将锁标记归还给其他使用wait的线程),在线程加锁的代码块内使用
还有wait(),notify() 在多线程一节的线程通信讲解