<补档>
自学java时的那些想法(二)
今天是18年4月6日
-
多态
个人对于多态的理解是:我们可以根据需要,对不同的子类进行不同的方法重写,这样在调用的时候,同样的方法名可能对应不同的功能,也就对应了不同状态。事实上,接口的实现也引用了这种多态的思想。
总结多态发生的条件有以下三点
- 既然存在子父类关系,那么一定是发生在继承的情况下
- 子类重写了父类的方法
- 父类引用指向子类(父类 引用名=new 子类();)。
多态的特点在于我们不需要去管父类的方法里写了什么,而是当我们需要使用时,去找到对应的子类。
多态中会用到引用的类型装换,写法与常用变量相似。
由子类转向父类时是有风险的,反之由父类转向子类是无风险的。
通常会使用instanceof来进行一次判断
A instanceof B:如果A是B的一个实例,返回true,反之如果不是或者A为NULL,则返回False。
虽然抽象父类无法实例化,但是可以利用
Father F=NULL;
Son S=new Son();
F=S;
的方法使得抽象父类指向子类,从而达到实现多态的目的。
-
抽象类
关键词abstract
用abstract修饰的类或者方法属于抽象类或者抽象方法
抽象类无法生存实例对象,也就是说使用抽象类的时候,我们只能借助继承关系的子类。
于是那个笑话就来了:有人说没有对象可以new一个,而我,怎么new都new不到对象,后来我发现是因为我长的太抽象了,是不能new对象的。(抽象类不能实例化)
抽象方法只需要声明,实现部分在子类中完成,需要注意的是抽象方法没有方法体,所以直接已分号结尾。
-
接口
关键词 implements
当两个事物有共同点但又不足以构成父子类关系时,我们可以定义共同点的接口(tel中的PlayGames接口)
一个类可以实现多个接口,接口中只允许定义常量不允许定义变量
接口的实现:
1.在使用到接口的类中实现接口的方法,然后在主方法Main()中,我们直接调用接口的方法。
public class Cire implements CalInterface
{
public float getArea(float r)
{
float area=PI*r*r;//计算圆面积并赋值给变量area
return area;//返回计算后的圆面积
}
public float getCircumference(float r)
{
float circumference=2*PI*r; //计算圆周长并赋值给变量circumference
return circumference; //返回计算后的圆周长
}
public static void main(String[] args)
{
Cire c = new Cire();
float f = c.getArea(2.0f);
System.out.println(Float.toString(f));
}
}
2.直接使用(类名实例=new 类名){接口方法};)再由实例直接调用方法名。(匿名类实现接口)
interface IA{
void test();
}
public class TestInnerClass {
public void method(IA ia){
ia.test();
}
public static void main(String[] args) {
TestInnerClass obj = new TestInnerClass();
obj.method(new IA() {
public void test() {
System.out.println("运行匿名内部类的test方法");
}
});
}
}
3.new 接口名(接口方法).接口方法()
new IPlayGame() {
@Override
public void playGame() {
System.out.println("使用直接new一个接口的方式,通过匿名内部类实现接口");
}
}.playGame();
网友评论