> 文章列表 > java day 5

java day 5

java day 5

第五章 创建类和方法

  • 5.1 定义类
  • 5.2 创建实例变量和类变量
    • 5.2.1 定义实例变量
    • 5.2.2 类变量
  • 5.3 创建方法
    • 5.3.1 定义方法
    • 5.3.2 关键字 this
    • 5.3.3 变量作用域和方法定义
    • 5.3.4 将参数传递给方法
    • 5.3.5 类方法
  • 5.4 创造Java应用程序
    • 助手类
  • 5.5 java应用程序和参数
    • 5.5.1 将参数传递给Java应用程序
    • 5.5.2 在Java程序中处理参数
  • 5.6 创建同名方法
  • 5.7 构造函数
    • 5.7.1 基本的构造函数
    • 5.7.2 调用另一个构造函数
    • 5.7.3 重载构造函数
  • 5.8 覆盖方法
    • 5.8.1 创建覆盖现有方法的方法
    • 5.8.2 覆盖构造函数

5.1 定义类

默认情况下,类将从Object派生而来,后者是Java类层次结构中所有类的超类。
关键字extends用于指定超类,如下面的Ticker的子类所示:

class SportsTicker extends Ticker{//body of the class
}

未用extends指定超类时,超类默认为Object。

5.2 创建实例变量和类变量

5.2.1 定义实例变量

class MarsRobot extends ScienceRobot{String status;int speed;float temperature;int power;
}

5.2.2 类变量

在类中,使用关键字static来声明类变量,

static final int MAX_OBJECTS = 10;
static int SUM;

根据约定,很多Java程序员都将整个类变量名大写,以便将这种变量与其他变量区分开来。

5.3 创建方法

5.3.1 定义方法

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 ]

5.3.2 关键字 this

有时候您可能想在方法体中引用当前对象,即其方法被调用的对象,以便将当前对象的实例变量或当前对象作为参数传递给其他方法。

t=this.x;          // x是这个对象的实例变量
z.resetData(this); // 用z类中的resetData方法,// 把当前对象传递给它
return this;       //返回当前对象

5.3.3 变量作用域和方法定义

  • 为了避免局部变量test隐藏实例变量test,可以使用this.test来引用实例变量,使用test来引用局部变量。
  • 了解超类中定义的所有变量,并避免重新定义超类中已有的变量。

5.3.4 将参数传递给方法

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();}
}

5.3.5 类方法

定义类方法时,需要在方法定义前加上关键字static,就像需要在类变量前加上static一样。

static void exit(int argument){// body of method
}

如果方法名前面没有关键字static,则该方法将是实例方法。实例方法只能在对象中运行,而不能在类中运行。

5.4 创造Java应用程序

  • 要让Java应用程序能够运行,只需一个用作程序入口的类即可。要成为应用程序的入口类,只需包含main()方法即可。应用程序运行时,Java虚拟机(JVM)将调用该方法。
  • 方法main()的特征标如下:
public static void main(String[] arguments){// body of method
}

其中各项含义如下:

  • public意味着该方法对其他类和对象也是可用的。方法main()必须被声明为public。
  • static意味着方法main()是一个类方法
  • void意味着方法main()不返回任何值
  • main()接受一个参数,一个字符串数组。该参数用于存储命令行元素

助手类

只要是Java中能找到的类,程序在运行时就可以使用。然而,只有入口类需要main()方法。该方法被调用后,接下来将执行程序中使用的各种类和对象中的方法。虽然助手类可以包含main()方法,但程序运行时,它们将被忽略。

5.5 java应用程序和参数

5.5.1 将参数传递给Java应用程序

使用JDK中的java解释器时,要将参数传递给Java程序。其中Java是解释器的名称,Echo是Java应用程序的名称,其他的内容是传递给程序的参数。

java Echo Wilhelm Hough "Tim Wakefield" 49

用引号将Tim Wakefield括起后,它将被视为一个参数。

5.5.2 在Java程序中处理参数

public static void main(String[] arguments){// body of method
}

其中,arguments是用于存储参数列表的字符串数组,可以按您的喜好给这个数组命名。

5.6 创建同名方法

当您调用不同对象的方法时,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的调用是一个表达式,其值为新创建的对象。

5.7 构造函数

构造函数是对象被创建时调用的方法。与其他方法不同,构造函数不能被直接调用。使用new来创建类的实例时,Java完成下述三项操作

  • 为对象分配内存
  • 初始化对象的实例变量:赋予初值或设置为默认值(数字0、对象为null、布尔值为false、字符值为’\\0’)。
  • 调用类的构造函数。

如果类没有构造函数,Java将隐式地提供一个不接受任何参数的构造函数,并调用这个构造函数来创建对象。

5.7.1 基本的构造函数

构造函数与常规方法相似,但有3个基本区别:

  • 名称总是与类相同;
  • 没有返回类型;
  • 不能使用return语句来返回一个值。
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);

5.7.2 调用另一个构造函数

如果构造函数的部分行为与已有构造函数相同,可在该构造函数中调用已有构造函数。

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作为参数传递给它。

5.7.3 重载构造函数

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();}
}

5.8 覆盖方法

在子类中定义一个特征标与超类相同的方法。这样,当该方法被调用时,将找到并执行子类的方法,而不是超类的方法。这被称为覆盖方法。

5.8.1 创建覆盖现有方法的方法

要覆盖方法,只需在子类中创建一个特征标(名称、返回值和参数列表)与超类相同的方法即可。

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();}
}

5.8.2 覆盖构造函数

为类定义构造函数时,您可能想修改对象的初始化方式,但不初始化类中新增的变量,而且要修改继承而来的变量的内容。为此,可以显示地调用超类的构造函数,并修改需要修改的变量。

  • 要调用超类中的常规方法,可以使用super.methodname(arguments)。

对于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);}
}