static关键字用来声明静态变量和静态方法。如:
静态变量和静态方法为类中所有对象所共有,可以不创建对象,直接引用,故也称为类变量和类方法。
引用方式:类名.静态变量/静态方法,如:MyClass.i;和MyClass.increase();
如果在声明时不用static关键字修饰,则为实例变量和实例方法。不同对象的实例变量被分配不同的内存空间,但类变量是共享内存的变量,某个对象对其值进行改变会影响到其他对象的使用。
静态变量可以通过类名直接访问,也可以通过对象来调用。
类方法不能访问实例变量,只能访问类变量。类方法可以由类名直接调用,也可以由实例对象进行调用。类方法中不能使用this或super关键字。
例:关于实例成员和类成员的例子
运行结果:
this关键字可以出现在类的实例方法中,代表使用该方法的当前对象。
例:“三角形”的构造方法中的this就代表当前对象
实例方法可以操作类的成员变量,实际上,当成员变量在实例方法中出现时,默认的格式是:this.成员变量。如:
同样,类的实例方法可以调用类的其它方法,调用格式:this.方法。
this不能出现在类方法中。
例:创建一个有两个方法的类,其中第一个方法使用this,第二个方法不使用this。
例:分析下面程序的运行情况,理解super和this的作用
运行结果:
作用:导入其他类中定义的类方法和类变量。
格式:import static xxx.ClassName.*;
导入 xxx.ClassName这个类里的所有静态方法和静态域。也可以导入某个具体的静态方法,只需把.*换成具体要导入的方法名即可。
如果导入的静态方法和本地方法同名,则本地方法优先被调用。
例:导入静态方法,计算直角三角形的斜边
运行结果:给定RT的两边边长为:3.0和4.0,其斜边边长为:5.0
final可以修饰类、类的成员变量和成员方法,但其作用各不相同。
1、修饰成员变量,则成员变量成为常量。
如:final double pi=3.14159;
2、修饰成员方法,则该方法不能被子类重写。
3、修饰类,则该类不能被继承。
一、抽象类(略)
二、接口
接口interface是Java语言提供的一种重要功能,它的结构与抽象类非常类似,接口本身也具有数据成员与抽象方法,但它与抽象类有下列不同:
接口的数据成员必须初始化。
接口中的方法必须全部都声明为abstract的。也就是说,接口不能像抽象类一样拥有一般的方法,而必须全部是抽象方法。
1、接口的定义
格式:[public] interface interfaceName [extends listOfSuperInterface] {...}
一个接口可有多个父接口,用逗号分隔。Java使用接口的目的是为了克服单继承的限制,因一个类只能有一个父类,而一个类可以实现多个接口。
接口体包括数据成员的定义和方法定义。数据成员的定义格式:type name=vulue;
定义在接口中的变量全部隐含具有public、final、static的属性,它们被实现该接口的多个类共享,它们不能被实现接口方法的类改变,它们必须要被初始化。
方法的定义格式:returnType methodName([paramlist]);
定义在接口中的方法隐含具有public和abstract属性。
如果接口声明为public,则接口中的方法和变量全部为public。
接口中没有非初始化的变量定义和方法的具体实现。
接口的作用:(1)通过接口实现不相关类的相同行为,而无须考虑这些类之间的关系;(2)通过接口指明多个类需要实现的方法;(3)通过接口了解对象的交互界面,而无须了解对象所对应的类。
例:声明接口Student_info.java
2、接口的实现
接口的实现类:[<修饰符>] class <类名> [extends <超类名>] [implements] <接口名1>,<接口名2>,...]
如果一个类实现一个接口,则必须实现接口中的所有方法,且方法必须声明为public,如果暂时不能实现某方法,也必须写出一个空方法。如果一个类实现多个接口,则用逗号分隔。
例:实现接口的类。
运行结果:李明 22岁
3、接口的应用
例:定义一个接口,设计两个接口的实现类,两个类中的接口方法的实现各不相同
运行结果:
例:设计一个关于收费行为的接口,设计该接口的几个实现类,测试各个实现类的收费功能
4、接口回调
接口回调是指可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中。那么该接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法。这一过程称为对象功能的接口回调。
例:定义一个接口People,设计该接口的两个实现类Student和Teacher,测试接口回调
运行结果: