一、序言
java中,有关类的知识比较多,这里只对基础的知识,做一个简短的说明。
二、类的定义与创建对象
父类——超类
指定了父类的子类——派生类
创造对象时,需要定义相应的构造方法
三、构造方法
构造方法没有返回值类型
(如果给出了返回值的类型,java会把这个所谓的构造方法当成一般方法来处理)
练习1——长方形类
package try_a_package;
public class Rectangle {
private double a;
private double b;
private String name="矩形";
public Rectangle()
{
a=1;
b=2;
name="矩形";
}
public Rectangle(double x,double y)
{
a=x;
b=y;
adjustName();
}
public Rectangle(double x)
{
a=x;
b=x;
adjustName();
}
public void Rectangle(double x,double y,String n)
{
a=x;
b=y;
name=n;
}
public boolean isRectangle()
{
if(a>0 && b>0)
{
return true;
}
return false;
}
public void adjustName()
{
if(isRectangle())
{
if(a==b)
{
name="正方形";
}
else
{
name="长方形";
}
}
else
{
name="非长方形";
}
}
public double getPerimeter()
{
return (a+b)*2;
}
public double getArea()
{
return a*b;
}
@Override
public String toString()
{
String msg=name+":边长a="+a+",边长b="+b;
if(isRectangle())
{
msg=msg+",周长"+getPerimeter()+",面积"+getArea();
}
return msg;
}
public static void main(String[] args)
{
Rectangle r[]=new Rectangle[5];
r[0]=new Rectangle();
r[1]=new Rectangle(3);
r[2]=new Rectangle(-2);
r[3]=new Rectangle(5,4);
r[4]=new Rectangle(-1,2);
int i;
for(i=0;i<r.length;++i)
{
System.out.println(r[i]);
}
Rectangle r1=new Rectangle();
r1.Rectangle(10,20,"长方形");
System.out.println(r1);
}
}
运行结果
四、this关键字
Java关键字this只能用于方法体内。
当创建了一个对象后,java虚拟机(JVM)给该对象分配了一个引用自己的指针——this
类中,非静态方法中可以使用this,而静态方法和静态的代码块中绝对不能使用this。
这是因为,this只能与特定的对象关联,而不会与类关联,同一个类的不同对象,有不同的this。
应用情形
- 通过this调用另一个构造方法——this(参数列表),这个仅仅在类的构造方法中使用,在别的地方不能这样使用。
- 方法参数或者方法中的局部变量与成员变量同名时,成员变量就会被屏蔽,此时可以通过this来访问成员变量。
- 在方法中,需要引用该方法所属类的当前对象时,就可以直接用this。
this练习——三角形类
package try_a_package;
public class Triangle1 {
private double a,b,c;
String name="三角形";
public Triangle1()
{
this(10);
}
public Triangle1(double x)
{
this(x,x,x);
}
public Triangle1(double x,double y)
{
this(x,x,y);
}
public Triangle1(double a,double b,double c)
{
this.a=a;
this.b=b;
this.c=c;
adjustName();
}
public void adjustName()
{
if(this.isTriangle())
{
double t;
if(a>b)
{
t=a;
a=b;
b=t;
}
if(a>c)
{
t=a;
a=c;
c=t;
}
if(b>c)
{
t=b;
b=c;
c=t;
}
name="三角形";
if(c*c==a*a+b*b)
{
name="直角"+name;
}
else if(a==b&&b==c)
{
name="等边"+name;
}
else if(a==b||b==c)
{
name="等腰"+name;
}
}
else
{
name="非三角形";
}
}
public boolean isTriangle()
{
if(a+b>c && a+c>b && b+c>a)
{
return true;
}
return false;
}
public double getPerimeter()
{
return a+b+c;
}
public double getArea()
{
double p,s;
p=(a+b+c)/2;
s=Math.sqrt(p*(p-a)*(p-b)*(p-c));
return s;
}
@Override
public String toString()
{
String msg=name+"\t"+a+"\t"+b+"\t"+c;
if(isTriangle())
{
msg=msg+"\t"+this.getPerimeter()+"\t"+this.getArea();
}
return msg;
}
public static void printHeader()
{
System.out.println("图形名称\t\t边长a\t边长b\t边长c\t周长\t面积");
}
public static void main(String[] args)
{
Triangle1 t1,t2,t3,t4,t5;
t1=new Triangle1();
Triangle1.printHeader();
System.out.println(t1);
t2=new Triangle1(6);
t3=new Triangle1(3,4);
t4=new Triangle1(3,4,5);
t5=new Triangle1(3,4,7);
System.out.println(t2);
System.out.println(t3);
System.out.println(t4);
System.out.println(t5);
}
}
运行结果
五、对象成员属性的初始化
在对对象进行初始化时,可以使用非静态初始化块对对象进行初始化。
初始化块的花括号{}不能省略。
static 修饰符
static修饰的成员变量——静态变量、静态属性、类成员变量。
类成员方法不能访问非类成员变量。
对类成员变量,使用静态初始化块进行初始化。
注意:在静态初始化块中,不能对非类成员变量进行初始化。
但在非静态初始化块中,可以使用类成员变量和类成员方法。
初始化练习——Triangle2
package try_a_package;
public class Triangle2 {
// 第一步,初始化
private static int id=1;
double a=1,b=1,c=1;
String name="三角形";
// 第二步,静态初始化块,仅执行一次
static
{
System.out.println("静态初始化(只执行一次:id——"+id);
id=100;
f1();
}
// 第三步,执行动态初始化块
{
System.out.println("动态初始化:id——"+id);
System.out.println("a="+a+",b="+b+",c="+c);
id=id+1;
a=10;
b=10;
c=10;
f2();
}
public Triangle2()
{
System.out.println("构造方法:id——"+id);
System.out.println("a="+a+",b="+b+",c="+c);
a=100;
b=100;
c=100;
}
public static void f1()
{
System.out.println("我是类成员方法f1()!");
}
public static void f2()
{
System.out.println("我是类成员方法f2()!");
}
@Override
public String toString()
{
return "Triangle{a="+a+",b="+b+",c="+c+",name="+name+"}";
}
public static void main(String[] args)
{
Triangle2 t1=new Triangle2();
System.out.println(t1+"\n");
Triangle2 t2=new Triangle2();
System.out.println(t2);
}
}
运行结果
变量的作用域
变量的作用域比较简单,与C++基本类似。
注意:异常处理参数变量的作用域,是catch后面的所有异常处理块。