目录
类和对象的概述
1.面向对象的基本概念
类
我们将类定义为一组具有共同属性和行为的对象的模版。例如我们定义类Student,而描述Student的属性有姓名、性别、年龄这些属性,而Student的行为包括说话、写字、考试。Student就相当于是学生这个群体的模板了。
对象
类只是定义属性和行为的模板,但是仅仅有类还不够,还必须要创建属于类的对象。对象是类的实例,对象与类的关系就像变量和数据类型的关系一样,简单来说,对象是类的“取值”,能够保存类的一个实例。
例如上面的Student的例子中,我们创建一个叫做张三的Student对象,而张三就有了Student中定义的所有属性了。
2.类的声明
Java是一种纯面向对象的语言,所以每个程序至少包含有一个类。所有的数据和操作都封装在类中。类要先声明,后使用。类的声明形式如下:
[修饰符] class 类名 [extends 父类名] [implements 接口] { //有些类没有父类或接口时可以忽略不写
成员变量声明;
成员方法声明;
}
将上面的Student举例来说:
public class Student { //类首
String name; //类的成员变量
String sex;
int age;
void say(){}; //类的成员方法
void write(){};
void test(){};
}
3.对象的创建的使用
对象的创建
类在Java中就像int,char等数据类型一样,是对事物的抽象。在程序中必须创建类的实例,即对象。对象的创建包括声明和实例化两项工作,可以通过一条语句来实现,创建格式是:
类名 对象名 = new 类名(参数表);
例如将上述的Student的对象zhangsan实现:
Student zhangsan = new Student();
对象的使用
当创建一个对象后,对象就有了这个类的所有的成员变量和方法,就可以引用这些变量,调用这些方法了。调用的方式和C语言一样,采用的是圆点标识符.
,例如对zhangsan进行操作:
zhangsan.name = "张三";
zhangsan.sex = "男";
zhangsan.age = 18;
zhangsan.say(); //调用say()这个方法
zhangsan.write();
zhangsan.test();
4.构造方法和对象的初始化
在类中有一种特殊的成员方法,其方法名与类名相同,称为构造方法。构造方法也称为构造器,当使用new实例化一个对象时,系统将自动调用构造方法初始化该对象。构造方法有如下几个特点:
(1)构造方法没有返回值,前面不能有返回值类型,也不能有void。
(2)程序中不能直接调用构造方法。只有在创建新的对象时系统自动调用。
(3)如果自己没有声明构造方法,则系统会自动为该类生成一个无参数类型的默认构造方法。例如在Student的类中,系统就自动声明了构造方法Student(){};
public class Point{
int x;
int y;
Point(int xx,int yy){
x = xx; //让成员变量x=xx
y = yy; //成员变量y=yy
}
public static void main(String args[]){
Point myPoint = new Point(2,3); //调用构造函数
}
}
在Java中,还可以允许一个类中拥有多个构造函数,当我们在创建对象时,系统会根据创建时的参数来自动选择调用哪一个构造函数。
public class Point{
int x;
int y;
Point(int xx,int yy){ //构造函数1
x = xx; //让成员变量x=xx
y = yy; //成员变量y=yy
}
Point(){ }; //构造函数2
public static void main(String args[]){
Point myPoint1 = new Point(2,3); //调用构造函数1
Point myPoint1 = new Point(2,3); //调用构造函数2
}
}
5.对象销毁
通过new运算符实例化对象时,系统为对象自动分配所需要的存储空间,但是由于内存有限,无法存放无限多个对象,因此Java提供了资源回收机制。在Java中会自动销毁无用的对象,所以一般用户不需要专门设计释放对象的方法。但是如果需要在某些情况下手动释放对象,则可以在类中声明void finalize();
方法,然后使用对象来进行销毁。
类的封装
封装性是面向对象的核心特征之一,它提供了一种信息隐藏技术。类的封装包含两层含义:将数据和对数据的操作组合起来构成类,让类成为一个不可分割的独立单位;类中既要提供与外部联系的接口,同时又要尽可能隐藏类的实现细节。封装性为软件提供了一种模块化的设计机制。
1.访问权限
按照类的封装性原则,类的设计者既要提供类与外部的联系方式,又要尽可能的隐藏类的实现细节。具体的方法就是为类及其成员变量和成员方法分别设置合理的访问权限。在Java中,类有2种访问权限,类中的成员和方法有4种访问权限。
成员访问权限
(1)public
被public修饰的成员变量和方法可以在所有的类中访问。即所有的类都可以调用被public修饰的成员变量的方法。
(2)protected
被protected修饰的成员变量和方法可以在声明它们的类中访问,在该类中的子类中访问,也可以与该类位于同一个包中的类访问,但不能在位于其他的包中的类访问。
(3)缺省
缺省指的是不使用权限修饰符,被缺省修饰的类的成员变量和方法可以在声明它们的类中访问,也可以与该类位于同一个包中的类访问,但不能在位于其他的包中的类访问,也不能被自己的子类访问。
(4)private
被private修饰成员变量和方法只能在自己的类中访问,其他的任何类都不能访问。
类访问权限
声明一个类可以使用public和缺省两种。需要注意的是虽然一个Java源程序文件中可以包含多个类,但是只能有一个类使用public修饰符,并且该类的名字与源程序文件的名字相同。
2.类成员
Java中的类中可以包含两种成员:实例成员和类成员。
实例成员是属于对象的,实例成员包括实例成员变量和实例成员方法。只有创建了对象之后,才能通过对象访问实例成员变量、调用实例成员方法。前面所创建的都是实例成员。
类成员是属于类的,类成员是需要用static修饰的,类成员也称为静态成员。类成员包括类成员变量和方法。通过类名可以直接访问类成员变量、调用类成员方法。即使没有创建对象,也可以引用类成员。
类成员变量
类成员变量和实例变量的区别如下:
(1)在类中声明成员变量时,没有使用static修饰的变量为实例成员变量,使用static修饰的为类成员变量。
public class Student {
String name; //实例成员变量
String sex; //实例成员变量
int age; //实例成员变量
static int count = 0; //类成员变量
void say(){};
void write(){};
void test(){};
}
(2)系统只为类成员变量分配一个存储单元,所有的对象共享一个类成员变量。当某个对象修改了类成员变量的值后,所有对象都将使用的是修改后的值。
(3)实例成员变量属于对象,只能通过对象引用;类成员变量属于类,既可以通过类名访问,也可以通过对象名访问。
public class Student {
String name;
String sex;
int age;
static int count = 0;
void say(){};
void write(){};
void test(){}
public static void main(String args[]){
Student student1 = new Student();
System.out.println(student1.count); //输出为0
System.out.println(Student.count); //输出为0
}
}
类成员方法
类成员方法与实例成员方法的区别如下:
(1)在类中声明成员方法时,没有使用static修饰的变量为实例成员变量,使用static修饰的为类成员方法。
public class Student {
String name;
String sex;
int age;
static int count = 0;
void say(){};
void write(){};
void test(){};
static void play(){};
}
(2)类成员方法中除了使用本方法中声明的局部变量外,只可以访问类成员变量,不能访问实例成员变量。
(3)类成员方法只能调用类成员方法,不能够调用实例成员方法。但是实例成员方法既可以调用类成员方法,也可以调用实例成员方法。
double perimeter(double x,double y){
return 2*(x+y);
}
static double area(double x,double y){
return x*y;
}
void print1(){
System.out.println(perimeter(2.2,4.6)); //可以通过编译
System.out.println(area(1.1,5.2));
}
static void print2(){
System.out.println(perimeter(2.2,4.6)); //无法通过编译
System.out.println(area(1.1,5.2));
}
(4)类成员方法既可以通过实例对象访问,也可以通过类访问。
public class Student {
String name;
String sex;
int age;
static int count = 0;
void say(){};
void write(){};
void test(){};
static void play(){};
public static void main(String args[]){
Student student1 = new Student();
student1.play();
Student.play();
}
}
数学函数类方法
Java类库中的Math类提供了很多常用的数学运算的方法,这些方法都是static方法,通过类名Math()来调用。Math()类的常用方法包括:
sin(double x);
cos(double x);
log(double x);
exp(double x); //返回e^x
abs(double x); //返回x的绝对值
max(double x,double y); //返回x与y中的较大值
sqrt(double x);
pow(double x,double y); //返回y^x
public class MaxNumber{
public static void main(String args[]){
int x = 25;
int y = 36;
System.out.println("较大值是:"+Math.max(x,y)); //输出的是36
}
}