【Java】instanceof、abstract、final、interface、内部类、Object类

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() 在多线程一节的线程通信讲解
原文地址:https://www.cnblogs.com/jwnming/p/13633969.html