默认情况下,类将从Object派生而来,后者是Java类层次结构中所有类的超类。
关键字extends用于指定超类,如下面的Ticker的子类所示:
class SportsTicker extends Ticker{
//body of the class
}
未用extends指定超类时,超类默认为Object。
class MarsRobot extends ScienceRobot{
String status;
int speed;
float temperature;
int power;
}
在类中,使用关键字static来声明类变量,
static final int MAX_OBJECTS = 10;
static int SUM;
根据约定,很多Java程序员都将整个类变量名大写,以便将这种变量与其他变量区分开来。
public class RangeLister {
public static void main(String[] args) {
int[] range;
RangeLister lister = new RangeLister();
range = lister.makeRange(4, 13);
System.out.print("The array: [ ");
for (int i = 0; i < range.length; i++) {
System.out.print(range[i] + " ");
}
System.out.println("]");
}
int[] makeRange(int lower, int upper) {
int[] range = new int[(upper - lower) + 1];
for (int i = 0; i < range.length; i++) {
range[i] = lower++;
}
return range;
}
}
输出:
The array: [ 4 5 6 7 8 9 10 11 12 13 ]
有时候您可能想在方法体中引用当前对象,即其方法被调用的对象,以便将当前对象的实例变量或当前对象作为参数传递给其他方法。
t=this.x; // x是这个对象的实例变量
z.resetData(this); // 用z类中的resetData方法,
// 把当前对象传递给它
return this; //返回当前对象
public class Passer {
void toUpperCase(String[] text){
for(int i=0;i<text.length;i++){
text[i]=text[i].toUpperCase();
}
}
public static void main(String[] args){
Passer passer= new Passer();
passer.toUpperCase(args);
for(int i=0;i<args.length;i++){
System.out.print(args[i]+" ");
}
System.out.println();
}
}
定义类方法时,需要在方法定义前加上关键字static,就像需要在类变量前加上static一样。
static void exit(int argument){
// body of method
}
如果方法名前面没有关键字static,则该方法将是实例方法。实例方法只能在对象中运行,而不能在类中运行。
public static void main(String[] arguments){
// body of method
}
其中各项含义如下:
只要是Java中能找到的类,程序在运行时就可以使用。然而,只有入口类需要main()方法。该方法被调用后,接下来将执行程序中使用的各种类和对象中的方法。虽然助手类可以包含main()方法,但程序运行时,它们将被忽略。
使用JDK中的java解释器时,要将参数传递给Java程序。其中Java是解释器的名称,Echo是Java应用程序的名称,其他的内容是传递给程序的参数。
java Echo Wilhelm Hough "Tim Wakefield" 49
用引号将Tim Wakefield括起后,它将被视为一个参数。
public static void main(String[] arguments){
// body of method
}
其中,arguments是用于存储参数列表的字符串数组,可以按您的喜好给这个数组命名。
当您调用不同对象的方法时,Java将对方法名和参数进行匹配,以确定执行哪个方法定义。
要创建重载方法,可在同一个类中创建多个不同的方法定义,它们的名称相同,但参数列表不同。不同之处可以是参数数目、参数类型,也可以都不同。
package com.java21days.day5;
import java.awt.Point;
public class Box {
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;
public static void main(String[] args) {
Box rect = new Box();
System.out.println("Calling buildBox with " + "coordinates(25,25) and (50,50):");
rect.buildBox(25, 25, 50, 50);
rect.printBox();
System.out.println("\nCalling buildBox with " + "points(10,10) and (20,20):");
rect.buildBox(new Point(10, 10), new Point(20, 20));
rect.printBox();
System.out.println("\nCalling buildBox with " + "point(10,10),width 50 and height 50:");
rect.buildBox(new Point(10, 10), 50, 50);
rect.printBox();
}
Box buildBox(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
return this;
}
Box buildBox(Point topLeft, Point bottomRight) {
x1 = topLeft.x;
y1 = topLeft.y;
x2 = bottomRight.x;
y2 = bottomRight.y;
return this;
}
Box buildBox(Point topLeft, int w, int h) {
x1 = topLeft.x;
y1 = topLeft.y;
x2 = (x1 + w);
y2 = (y1 + h);
return this;
}
void printBox() {
System.out.print("Box: <" + x1 + ", " + y1);
System.out.println(", " + x2 + ", " + y2 + ">");
}
}
这里对new的调用是一个表达式,其值为新创建的对象。
构造函数是对象被创建时调用的方法。与其他方法不同,构造函数不能被直接调用。使用new来创建类的实例时,Java完成下述三项操作
如果类没有构造函数,Java将隐式地提供一个不接受任何参数的构造函数,并调用这个构造函数来创建对象。
构造函数与常规方法相似,但有3个基本区别:
class MarsRobot{
String status;
int speed;
int power;
MarsRobot(String in1,int in2,int in3){
status = in1;
speed=in2;
power=in3;
}
}
可以使用下面的语句来创建这个类的对象:
MarsRobot curiosity = new MarsRobot("exploring", 5, 200);
如果构造函数的部分行为与已有构造函数相同,可在该构造函数中调用已有构造函数。
class Circle{
int x,y,radius;
Circle(int xPoint,int yPoint,int radiusLength){
this.x=xPoint;
this.y=yPoint;
this.radius=radiusLength;
}
Circle(int xPoint,int yPoint){
this(xPoint,yPoint,1);
}
}
Circle的第二个构造函数只接受圆心的x和y作为参数。由于没有定义半径,因此将使用默认值1——调用第一个构造函数,并将参数xPoint、yPoint和整数字面量1作为参数传递给它。
package com.java21days.day5;
import java.awt.Point;
public class Box2 {
int x1=0;
int y1=0;
int x2=0;
int y2=0;
Box2(int x1,int y1,int x2,int y2){
this.x1=x1;
this.y1=y1;
this.x2=x2;
this.y2=y2;
}
Box2(Point topLeft,Point bottomRight){
this(topLeft.x,topLeft.y,bottomRight.x,bottomRight.y);
}
Box2(Point topLeft,int w,int h){
this(topLeft.x,topLeft.y,topLeft.x+w,topLeft.y+h);
}
void printBox(){
System.out.print("Box:<"+x1+","+y1);
System.out.println(" ,"+x2+" ,"+y2+">");
}
public static void main(String[] args){
Box2 rect;
System.out.println("Calling Box2 with coordinates "+"(25,25) and (50,50):");
rect= new Box2(25,25,50,50);
rect.printBox();
System.out.println("\nCalling Box2 with points "+ "(10,10) and (20,20):");
rect=new Box2(new Point(10,10),new Point(20,20));
rect.printBox();
System.out.println("\nCalling Box2 with 1 point "+"(10,10), width 50 and 50:");
rect = new Box2(new Point(10,10),50,50);
rect.printBox();
}
}
在子类中定义一个特征标与超类相同的方法。这样,当该方法被调用时,将找到并执行子类的方法,而不是超类的方法。这被称为覆盖方法。
要覆盖方法,只需在子类中创建一个特征标(名称、返回值和参数列表)与超类相同的方法即可。
package com.java21days.day5;
public class Printer {
int x=0;
int y=1;
void printMe(){
System.out.println("x is "+x+", y is "+y);
System.out.println("I am an instance of the class "+ this.getClass().getName());
}
}
class SubPrinter extends Printer{
int z=3;
void printMe(){
System.out.println("x is "+x+", y is "+y+", z is "+z);
System.out.println("I am an instance of the class "+ this.getClass().getName());
}
public static void main(String[] args){
SubPrinter obj =new SubPrinter();
obj.printMe();
}
}
为类定义构造函数时,您可能想修改对象的初始化方式,但不初始化类中新增的变量,而且要修改继承而来的变量的内容。为此,可以显示地调用超类的构造函数,并修改需要修改的变量。
对于super()的用法,:它必须是构造函数定义中的第一条语句。如果构造函数没有在第一条语句中显示的调用super(),java将自动调用不带参数的super()
package com.java21days.day5;
import java.awt.Point;
public class NamedPoint extends Point {
String name;
NamedPoint(int x,int y, String name){
super(x,y);
this.name =name;
}
public static void main(String[] arguments){
NamedPoint np=new NamedPoint(5,5,"SmallPoint");
System.out.println("x is "+ np.x);
System.out.println("y is "+np.y);
System.out.println("Name is "+np.name);
}
}