3.7 JAVA的类
类是java的核心和本质。它是java语言的基础,因为类定义了对象的本性。既然类是面向对象程序设计java语言的基础,因此,你想要在java程序中实现的每一个概念都必须封装在类以内。在一个类中,程序的作用体现在方法中。方法是JAVA创建一个有名字的子程序的方法。
类的通用格式
当你定义一个类时,你要声明它准确的格式和属性。你可以通过指定它包含的数据和操作数据的代码来定义类。尽管非常简单的类可能只包含代码或者只包含数据,但绝大多数实际的类都包含上述两者。你将看到,类的代码定义了该类数据的接口。
使用关键字class来创建类。在这一点上,类实际上被限制在它的完全格式中。类可以(并且常常)是一个组合体。类定义的通用格式如下所示:
class classname extends superclassname{
type instance-variable1;
type instance-variable2;
........
type instance-variableN;
type methodname1(parameter-list){
// body of method; }
type methodname2(parameter-list){
// body of method%26#125; }
// ...........
type methodnamen(parameter-list){
// body of method;
}
}
对于上面的一般定义作如下解释:
type instance-variable1;
type instance-variable2;
........
type instance-variableN;
type methodname1(parameter-list){
// body of method; }
type methodname2(parameter-list){
// body of method%26#125; }
// ...........
type methodnamen(parameter-list){
// body of method;
}
}
classname:表示用户定义的类的名称
superclassname:表示用户派生的父类
extends:这是一个关键字,表明派生关系。
在一个class中定义的数据或叫变量叫做实例变量(instance variables)。代码包含在方法(methods)中。总体来说,类中定义的方法和实例变量被叫做该类的成员(members)。在大部分类中,实例变量由该类所定义的方法调用和访问。因此,这就决定了类中的数据如何被使用。所有的方法都在类中声明,并且通常都具有如下形式:
type methodname(parameter-list) {
//body of method
}
在这里,type指定了由方法返回的数据类型。它可以是任意有效的类型,包括你创建的类类型。如果方法没有返回值,则其返回类型必须是void。方法的名字由name指定。这个名字可以是除了那些在当前作用域中已经使用的标识符之外的任意合法标识符。parameter-list是类型、标识符对组成的序列,每对之间用逗号分开。参数实际上是方法被调用时接收传递过来的参数值的变量。如果方法没有参数,则参数表就是空的。除了返回void方法外,那些具有返回类型的方法使用下面的返回语句形式对调用他们的程序返回一个值。
//body of method
}
return value;
value是返回值。下面是一个简单的类的例子:
class Sameple {
int a,b;
int sum() {
return a+b;
}
}
类中可以定义若干个变量,以及若干个方法,他们可以有不同的访问方式。访问方式可以通过在其前面添加修饰符来实现,主要有public(公共的), private(私有的), protected(保护的)等限定关系类。见下表关系:
int a,b;
int sum() {
return a+b;
}
}
限定关系表
private | 无修饰符 | protected | public | |
同一类 | Y | Y | Y | Y |
同一个包中子类 | N | Y | Y | Y |
同一包中非子类 | N | Y | N | Y |
不同包中的子类 | N | N | N | Y |
不同包中非子类 | N | N | N | Y |
例子:
public class PointTest {
public static void main(String[] args) {
MyPoint mp = new MyPoint(4,3);
Point p = new Point(11);
Point q = mp;
mp.x = 5;
mp.y = 12;
System.out.println("Data Member Access Test:");
System.out.println("mp = ("+mp.x+","+mp.y+")");
System.out.println("p = ("+p.x+","+p.y+")");
System.out.println("q = ("+q.x+","+q.y+")");
System.out.println("/n Casting Test:");
System.out.println("(Point) mp =("+((Point)mp).x+","+((Point)mp).y+")");
System.out.println("(MyPoint) q =("+((MyPoint)q).x+","+((MyPoint)q).y+")");
System.out.println("/n Method Member Access Test:");
System.out.println("mp.length()="+mp.length());
System.out.println("p.length()="+p.length());
System.out.println("q.length()="+q.length());
System.out.println("mp.distance()="+mp.distance());
System.out.println("/n Casting Test:");
System.out.println("((Point) mp).length() ="+((Point)mp).length());
System.out.println("((Point)q).length() ="+((Point)q).length());
System.out.println("((MyPoint)q).distance()="+((MyPoint)q).distance());
}
}
public static void main(String[] args) {
MyPoint mp = new MyPoint(4,3);
Point p = new Point(11);
Point q = mp;
mp.x = 5;
mp.y = 12;
System.out.println("Data Member Access Test:");
System.out.println("mp = ("+mp.x+","+mp.y+")");
System.out.println("p = ("+p.x+","+p.y+")");
System.out.println("q = ("+q.x+","+q.y+")");
System.out.println("/n Casting Test:");
System.out.println("(Point) mp =("+((Point)mp).x+","+((Point)mp).y+")");
System.out.println("(MyPoint) q =("+((MyPoint)q).x+","+((MyPoint)q).y+")");
System.out.println("/n Method Member Access Test:");
System.out.println("mp.length()="+mp.length());
System.out.println("p.length()="+p.length());
System.out.println("q.length()="+q.length());
System.out.println("mp.distance()="+mp.distance());
System.out.println("/n Casting Test:");
System.out.println("((Point) mp).length() ="+((Point)mp).length());
System.out.println("((Point)q).length() ="+((Point)q).length());
System.out.println("((MyPoint)q).distance()="+((MyPoint)q).distance());
}
}
public class MyPoint extends Point{
public int x;
public int y;
public MyPoint(int x,int y) {
this.x=super.x=x;
this.y=super.y=y;
}
double length(){
return Math.sqrt(x*x+y*y);
}
double distance(){
return Math.abs(length()-super.length());
}
}
public int x;
public int y;
public MyPoint(int x,int y) {
this.x=super.x=x;
this.y=super.y=y;
}
double length(){
return Math.sqrt(x*x+y*y);
}
double distance(){
return Math.abs(length()-super.length());
}
}
public class Point {
int x;
int y;
public Point(int x, int y) {
this.x=x;
this.y=y;
}
Point(int x) {
this(x,0);
}
Point(){
this(0,0);
}
double length(){
return Math.sqrt(x*x+y*y);
}
}
int x;
int y;
public Point(int x, int y) {
this.x=x;
this.y=y;
}
Point(int x) {
this(x,0);
}
Point(){
this(0,0);
}
double length(){
return Math.sqrt(x*x+y*y);
}
}
运行PointTest类结果:
Data Member Access Test:
mp = (5,12)
p = (11,0)
q = (4,3)
Casting Test:
(Point) mp =(4,3)
(MyPoint) q =(5,12)
Method Member Access Test:
mp.length()=13.0
p.length()=11.0
q.length()=13.0
mp.distance()=8.0
Casting Test:
((Point) mp).length() =13.0
((Point)q).length() =13.0
((MyPoint)q).distance()=8.0
类中的方法提供了两种缺省的指代:this和super
mp = (5,12)
p = (11,0)
q = (4,3)
Casting Test:
(Point) mp =(4,3)
(MyPoint) q =(5,12)
Method Member Access Test:
mp.length()=13.0
p.length()=11.0
q.length()=13.0
mp.distance()=8.0
Casting Test:
((Point) mp).length() =13.0
((Point)q).length() =13.0
((MyPoint)q).distance()=8.0
一、基础知识
1、super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)
2、this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
3、super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时)
如:super.变量名
super.成员函数据名(实参)
4、this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
例子:
public class Point {
int x;
int y;
public Point(int x, int y) {
this.x=x; //this它代表当前对象名
this.y=y;
}
Point(int x) {
this(x,0); //this(参数)调用本类中另一种形成的构造函数
}
Point(){
this(0,0);
}
double length(){
return Math.sqrt(x*x+y*y);
}
}
int x;
int y;
public Point(int x, int y) {
this.x=x; //this它代表当前对象名
this.y=y;
}
Point(int x) {
this(x,0); //this(参数)调用本类中另一种形成的构造函数
}
Point(){
this(0,0);
}
double length(){
return Math.sqrt(x*x+y*y);
}
}
class Person{
public static void prt(String s){
System.out.println(s);
}
Person(){
prt("A Person.");
}
Person(String name){
prt("A person name is:"+name);
}
}
public class Chinese extends Person{
Chinese(){
super(); //调用父类构造函数(1)
prt("A chinese.");
}
Chinese(String name){
super(name); //调用父类具有相同形参的构造函数(2)
prt("his name is:"+name);
}
Chinese(String name,int age){
this(name); //调用当前具有相同形参的构造函数(3)
prt("his age is:"+age);
}
public static void main(String[] args){
Chinese cn=new Chinese();
cn=new Chinese("kevin");
cn=new Chinese("kevin",22);
}
}
public static void prt(String s){
System.out.println(s);
}
Person(){
prt("A Person.");
}
Person(String name){
prt("A person name is:"+name);
}
}
public class Chinese extends Person{
Chinese(){
super(); //调用父类构造函数(1)
prt("A chinese.");
}
Chinese(String name){
super(name); //调用父类具有相同形参的构造函数(2)
prt("his name is:"+name);
}
Chinese(String name,int age){
this(name); //调用当前具有相同形参的构造函数(3)
prt("his age is:"+age);
}
public static void main(String[] args){
Chinese cn=new Chinese();
cn=new Chinese("kevin");
cn=new Chinese("kevin",22);
}
}