1、多态
a、定义:是指允许不同类的对象对同一个消息作出不同的响应。
即同一个消息可以根据发送对象的不同,采取多种不同的行为方式。
(发送消息即方法的调用)
b、多态实现:属于动态绑定的一种。比如:一个父类去实例化子类的对象,子类又通过父类定义好的方法,进行了覆写,
此时用父类实例化的子类对象去调用父类的方法,调用将是子类覆写的方法。
c、多态的作用:消除类型之间的耦合关系。
d、举例:不同的领域,使用相同的工具,做不同的事情。
总结:1、this.print(obj),2、super.print(obj),
其中,1、2步骤轮训执行,每一次轮训结束,都将obj向上转型一次,
然后再次轮训,直到找到对应匹配项为止。如果找到了对应匹配项,
再找寻该方法是否有子类进行覆写,如果有,执行子类覆写的方法。
晓博思路:1、直接在当前类型中找匹配参数项,如果当前类型没有对应的参数匹配。
则当前传入的参数进行向上转型1次,继续寻找,往复执行,直到找到为止。
找到后,查询该方法是否有子类的实现。
2、instanceof关键字
a、定义:用于判断一个引用类型变量所指向的对象是否为某个类的实例。
b、级别:和二元运算符属于同一个级别,比如:== < > ;
c、实际用途:向下强转时,需要判断强转的对象是否属于对应需要强转的类型。
如果不是,强转会出现错误。ClassCastException。
3、内部类
a、成员内部类:
a.1、成员内部类与外部类在编译时,会生成两个class文件,其中内部类
的文件名为:外部类名$内部类名.class
a.2、成员内部类可以使用所有的修饰权限。
b、静态内部类:
b.1、静态内部类中可以定义静态或者非静态成员。
b.2、静态的含义就是该内部类可以像其他静态成员一样,在该外部类没有
实例化的对象时,通过类名.的方式实例化内部类。
c、方法内部类
c.1、方法内部类只能定义在该方法内部,且只能在方法内部实例化,在方法外部实例化则不可以。
c.2、方法内部类对象不能使用该内部类所在方法的非final修饰的局部变量。
d、匿名内部类
d.1、只用到一个实例。
d.2、类定义后马上就要用到。
d.3、类非常非常的小(官方建议,匿名内部类的代码不超过4行)
d.4、给类命名并不会导致你的代码更容易理解。
拓展:
d.5、接口式:通过new+space+接口的方式创建匿名内部类,相当于创建了一个类实现了这个接口,而且,能且仅能实现1个接口。
d.6、参数式:通过匿名的方式直接实例化一个类,并且当作参数传递给某个方法,
这个方法的局部变量就可以直接引用刚才创建好的匿名内部类的对象。
4、设计模式
a、单例模式:即整个应用程序有且仅有1个该类型的对象被创建,所有通过单例模式创建的对象返回的均是同一个对象的内存地址引用.
(除非之前创建的实例被回收,则再次创建一个新的单例)
package main;
public class Bus extends Car{
//1、现在需要设置单例模式的类中,定义一个自己类型的变量
private static Bus bus;
public static Bus getInstance(){
//2、单例:就是整个应用程序中,只存在该类型的唯一对象
//3、如果当前类型没有对象,则创建对象,如有当前类型对象已经被创建过,则返回创建过的那个对象的内存地址的引用
if(bus == null){
bus = new Bus();
}
return bus;
}
}
5、设计原则
a、开闭原则:即针对可拓展性,为开放原则。针对某个类的修改为封闭原则。
6、接口回调
a、if you call me, I will call back;
b、回调就是一种双向模式,一者调用另一者的方法,另一者再反调回来。
package Tast03;
public interface CallBack {
public abstract void paly();
}
package Tast03;
public class Person {
CallBack callBack;
public void doSamething(){
callBack.paly();
}
public CallBack getCallBack() {
return callBack;
}
public void setCallBack(CallBack callBack) {
this.callBack = callBack;
}
}
package Tast03;
public class RunTime implements CallBack{
public void doArraything(){
Person person = new Person();
person.setCallBack(this);
person.doSamething();
}
public void paly() {
// TODO Auto-generated method stub
}
}
7、内部类的应用场景
a、内部类,仍然是一个独立的类,在编译之后,是$符号,连接左边的外部类与右边的内部类。
b、内部类不能用普通的方式访问,内部类是外部类的一个成员,因此内部类可以自由的访问外部类的成员变量,无论是不是private修饰的。
c、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员。