1.对象与类
对象代表现实世界中可以明确标识的一个实体。万事万物都可以是对象。例如:一个学生、一张桌子、一个客户、甚至各种抽象的事物比如一笔贷款,都可以看做是对象。每个对象都有自己独特的标识、状态和行为。
●一个对象的状态(也称为特征或属性)是由当前值得数据域来表示的。例如:圆对象具有一个数据域radius,它是标识圆的属性。一个矩形对象具有数据域width和height,它们都是描述矩形的属性。
●一个对象的行为(也称动作)是由方法定义的。调用对象的一个方法就是要求对象完成一个动作。例如:可以为圆对象定义一个名为 getArea() 和 getPerimeter() 的方 法。圆对象可以调用getArea()返回圆的面积,调用getPerimeter() 返回它的周长。还可以定义 setRadius(radius) 方法。 圆对象可以调用这个方法来修改它的半径。
●类是一个模板,蓝本或者说是合约,用来定义对象的数据域是什么以及方法是做什么的。一个对象是类的一个实例。可以从一个类中创建多个实例。创建实例的过程称为实例化。对象和实例经常可以互换。
2.如何定义一个类
一般而言主要描述两个方面:属性:可以用一些参数描述类的信息,行为:可以用一系列的动作描述类 的信息。
举例:点类 属性: x和y坐标 行为:求两点之间的距离
class Point{
//属性
int x;
int y;
//行为
public double getDistance(Point p){//求两点之间的距离
return Math.sqrt(Math.pow(x - p.x,2) + Math.pow(y - p.y, 2));
}
}
举例:圆类 属性:半径和圆点 行为:1.计算圆的面积 2.计算圆的周长3.计算圆与其他圆的距离
class Circle{
double radius;//半径
double pi = Math.PI;
Point p; //圆心
/**
* 计算圆的面积
* @return area
*/
public double gerArea(){
double area = pi * radius * radius ;
return area;
}
/**
* 计算圆的周长
* @return perimeter
*/
public double getPerimeter(){
double perimeter = 2 * pi * radius ;
return perimeter;
}
/**
* 计算当前圆到其他圆的距离
* @param c 另外一个圆的对象
* @return distance 两个圆的距离
*/
public double getDistance(Circle c){
return p.getDistance(c.p);
}
}
3.创建对象
当类创建好之后,我们就可以使用new来创建对象,并且可以用"."来访问其中的属性和方法。
public static void main(String[] args) {
Circle c1 = new Circle(); //创建一个圆的对象
c1.radius = 10; //访问对象的半径属性
Point p1 = new Point(); // 创建一个点的对象
p1.x = 0;
p1.y = 0;
c1.p = p1;
Circle c2 = new Circle();
c2.radius = 10;
Point p2 = new Point();
p2.x = 10;
p2.y = 10;
c2.p = p2;
System.out.println(c1.getDistance(c2));
}
创建一个Cirlce对象
1 在堆内存中开辟一个空间并分配地址(空间大小?透明的)
2 对成员变量进行 【默认初始化】
3 然后对成员变量进行【显示初始化】
4 目前而言 对象创建完毕 将对象的地址赋予函数中的变量
这里的对象都使用的是默认构造方法来创建的对象。
4.构造方法
构造方法在使用new操作符创建对象的时候被调用。
构造方法是一种特殊的方法。有三个特殊性:1.构造方法必须和类的名字相同。2.构造方法没有返回值类型,连void也没有。3.构造方法是在创建一个对象使用new操作符时调用的。
class Person{
private int age;
private String name;
Person(){
this(0,null);//this(...) 调用当前类的其他构造函数 必须在第一句
}
Person(int age){
this(age,null);
System.out.println("1age参的");
}
Person(String name){
this(0,name);
System.out.println("1name参的");
}
Person(int age,String name){ //前面三个都是构造函数
System.out.println("2参的");
this.age=age;
this.name=name;
}
public void show(){
//如果局部变量没有重名 则默认用成员变量
System.out.println(this.name+":"+this.age);
}
public void setAge(int age){
//局部变量age 成员变量age
if(age<0){
this.age=0;
}else{
this.age=age;
}
}
public int getAge(){
return this.age;
}
}
如果一个类有多个构造方法, 最好尽可能使用 this( 参数列表 ) 实现它们。 通常,无参数或参数少的构造方法可以用 this( 参数列表 ) 调用参数多的构造方法。 这样做通常可以简化代码, 使类易于阅读和维护。还应该注意,构造函数之间不能互相调用。
5.可见性修饰符
可以在类、 方法和数据域前使用 public 修饰符, 表示它们可以被任何其他的类访问。如果没有使用可见性修饰符, 那么则默认类、 方法和数据域是可以被同一个包中的任何一个类访问的。 这称作包私有或包内访问。
有时,我们不想用户直接访问一个对象的数据,为防止数据被篡改以及使类更易于维护, 最好将数据域声明为私有的,就可以使用private修饰符对属性和方法进行修饰,private 修饰符限定方法和数据域只能在它自己的类中被访问。接着,我们可以设置修改器和访问器来帮助用户修改和访问被私有的属性。
还是用圆类来举例
上面的示例中,如果用户在改变半径的值时将其修改为负数,就会得到错误的答案,也与逻辑不符,因为半径只能大于等于0.
class Circle{
private double radius;//这里设置半径为私有属性,不能被直接访问
double pi = Math.PI;
private Point p; //圆心
public double gerArea(){
double area = pi * radius * radius ;
return area;
}
public double getPerimeter(){
double perimeter = 2 * pi * radius ;
return perimeter;
}
public double getDistance(Circle c){
return p.getDistance(c.p);
}
public void setRadius(radius){ //通过设置修改器,我们可以限定修改值的范围,防止出错
if(radius >= 0)
this.radius = radius;
else
this.radius = 0;
}
public double getRadius(){ //通过设置访问器,让用户可以访问
return this.radius;
}
}