一,什么时候使用静态?
从两方面下手:
因为静态修饰的内容有成员变量和成员函数。
什么时候定义静态变量(又叫类变量)?
当对象中出现共享数据时,该数据被静态所修饰,对象中的特有数据要定义成非静态存在于堆内存中。
分析:那么张三和李四都有姓名,那叫共享数据吗,不叫!那叫共享属性,是你们都有姓名的属性。
每个人都有姓名和年龄,这不叫共享数据,而是都有自己不同的姓名和年龄。
什么时候定义静态函数?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
----------------------------------------
二,抽象类的特点:
1,抽象方法一定在抽象类中
2,抽象方法和抽象类都必须被abstract关键字修饰
3,抽象类中的抽象方法要被使用,必须由子类复写其所有的抽象方法,建立子类对象调用。
如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
抽象类没有太大的不同。
该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂的东西。这些不确定的部分,也是该事物的功能,需要明确出来,但无法定义主体。
通过抽象方法来表示。
抽象类比一般类多了个抽象函数,就是在类中可以定义抽象方法。抽象类不可以实例化。
abstract只能修饰类和方法,不能修饰变量。
特殊点:抽象类中可以不定义抽象方法,这样做的目的只是不想让该类建立对象。
模板方法设计模式:
在定义功能时,功能的一部分是确定的,有一部分是不确定的,而确定的部分在使用不确定的部分,这时就将不确定的部分暴露出去。由该类的子类去完成。
public class Test {
public static void main(String args[])
{
SubTime st = new SubTime();
st.getTime();
}
}
abstract class GetTime{
public final void getTime(){//不希望子类复写此方法,用final修饰
long start = System.currentTimeMillis();
runcode();
long end = System.currentTimeMillis();
}
public abstract void runcode();//抽象方法
}
class SubTime extends GetTime{
@Override
public void runcode() {
for(int i=0;i<2000;i++){
System.out.print(i);
}
}
}
----------------------------------------------
三,接口,初期理解,可以认为是一个特殊的抽象类。当抽象类中的方法都是抽象的,那么该类可以通过接口的形式类表示。
class用于定义类,interface用于定义接口。
接口中,
常量用public static final修饰
方法用public static修饰
接口是不可以创建对象的,因为有抽象方法。
需要被子类实现,子类对接口中的抽象方法全都覆盖后,子类才可以实例化。否则子类是一个抽象类,用abstract修饰。
接口可以被类多实现,也是对多继承不支持的转换形式,java支持多实现。
为什么java不支持多继承,因为子类可能会覆盖父类的方法,而父类中可能有相同的方法,覆盖的时候不知道覆盖哪一个;而接口可以多实现,因为接口中的方法都是抽象的,没有方法体,子类无论怎么去具体实现都可以。
接口和接口之间可以多继承,因为接口里方法没有实现体。