类与对象
首先需要明白对象的概念。
现实生活中的对象,及比如学生对于老师而言是教学对象,电脑对于人来说是操作对象,万事万物皆对象。而实体的对象无法保存在内存中,那么应该如何利用java这一编程语言来实现这一目的呢?
可以将实体的对象抽象出可用的信息保存在计算机中的“虚拟”对象。
例如将很多学生对象录入计算机。可将他们每人的的入学年份,月考成绩,期末成绩,学习状况等与学生这一群体相关的信息构建一定数量的集合,写入计算机。
其次是类。
类,顾名思义,是指“一类”事物。
就像学生,苹果,车床。这三个名词指代了三类事物,分别是人,水果,机械。这三个就是类。
java中的类与现实生活中的类相差不远,
定义:Java语言把一组对象中相同属性和方法抽象到一个Java源文件就形成了类。
类的结构:
public class 类名 { //属性 属性1类型 属性1; 属性2类型 属性2; ... 属性n类型 属性n; //方法 方法1; 方法2; ... … 方法m; }
类名的规范与标识符一致,但多单词时每个单词开头字母都要大写,例如:Student,OpenResource
属性一般是变量的集合,这些直接定义在类中的变量被称为成员变量,下面的方法称为成员方法。
创建一个对象:类名 对象名 = new 类构造方法;
Student student = new Student();
当一个对象创建好后就可以通过对象名来调用:
student.id = "wl2014001"; student.name = "李四"; student.grade = "三年级"; student.readBook();//调用学生读书方法 student.doHomework();//调用学生写作业的方法
创建一个对象就是对类的实例化。可以把类看做一个模板,创建一个对象就是通过这个模板造出了一个模型,之后的一系列操作就是对于这个模型的操作。
面向过程与面向对象
面向对象的编程语言,例如java,让对象成为类与类之间的“通信”的桥梁,通过对象使类之间形成有机的整体。
总的来说:面向对象编程语言以对象为中心,以消息为驱动,即程序=对象+消息。
面向过程的编程语言,例如c,则以过程为中心,以算法为驱动,即程序=算法+数据。
按我个人的理解,面向对象是一个大规范,面向过程嵌套其中。
方法与重载
方法与函数差不多,区别是面向对象一般管函数叫方法。方法对于类来说就是这个类可以执行的各种操作。
定义:
访问控制符 [修饰符] 返回值类型 方法名( [参数] ) { //方法体 }
例:
public static void sayHello(){ System.out.println("Hello"); }
public称为访问控制符,除此之外还有private,protected和友好的。
被public修饰的变量和方法在本类和其他类中可以调用。
被private修饰的变量和方法只能在本类中使用。
protected大体与public相同,但会控制继承,这之后再说。
static称为修饰符,其他修饰符暂且不谈。
被static修饰的方法可使用类名直接调用,例如Student.sayHello();
若未被static修饰,则只能将类实例化后,通过实例化的对象调用,例如student.sayHello();
void 称为返回值,与函数相同,方法也需要一个返回值,这个返回值类型可以为void,即没有返回值。
返回值类型精度只能高于或等于你想要返回的数据,例如返回一个int值可以用double,但不能用int返回double。
此外返回值类型可以为引用数据类型,且返回值类型必须与该类型相同,或为该类型的父类。例如Object是String的父类,那么就可以使用Object返回String,不能使用String返回Object。
方法名与类名的定义方式大致一样,只有一点,方法名第一个单词的首字母是小写。例如sayHello
方法的参数定义方式与函数一致,多参数时,在括号内用逗号隔开,例如sayHello(int id,String name)。这些参数仅在方法内有效。
动态参数是一种特殊的参数,它本质上是数组,例如sayHello(String...names)的参数可以通过names[0],names[1]等调用。
一个方法只能有一个动态参数,且这个动态参数必须放在所有参数的最后。
方法的递归与函数相同,是在方法内调用该方法。
有时,一个方法需要满足多种情况下的参数输入,那就产生了方法的重载。
方法重载是多个同名方法,但参数列表不一致,通过参数列表输入的不同,调用不同的同名方法。
例如:
public int add(int a,int b) { return a+b; } public float add(int a,int b,float c) { return a+b+c; }
参数为两个int和参数为两个int一个float时会调用不同的方法,即使它们的方法名一致。
代码块
代码块的定义方式:
public class Test { static{ System.out.println("静态代码块"); } public static void main(String[] args) { } }
代码块有静态与非静态之分。
静态代码块在最前方加上static,在类加载时调用一次。
非静态代码块不加static,每次创建对象的时候都调用一次。
全局变量与局部变量
成员变量直接在类中声名。
public class Creature { public int id;//成员变量 public String name;//成员变量 }
成员变量会有一个初始值,初始值依据该变量的数据类型而定,例如int初始值为0,boolean初始值为false,float初始值为0.0。
成员变量定义以后,可以在整个类中使用,也就是它的作用域是整个类,可在类下的任意位置定义。
方法中的参数、方法中定义的变量和代码块中定义的变量统称为局部变量。它的作用域是从定义位置到当前语句块结尾。
若是有一个局部变量与成员变量同名,那么成员变量会被局部变量覆盖。即通过该变量名调用的变量是局部变量,若要调用成员变量,需要通过this关键字调用例如this.name。
局部变量与成员变量大相径庭,它没有默认值,使用时需要赋予默认值。它在定义时数据类型前除了final,不允许有任何类似public之类的关键字。
构造方法
在之前实例化类时给对象中的变量赋初值时往往需要写很多行。
student.id = "wl2014001"; student.name = "李四"; student.grade = "三年级";
那么为了简化代码,可以使用构造方法来简化。
Student student = new Student();
这个通过new调用的Student()就是构造方法。
构造方法直接在类中定义,方法名需与类名相同,且不可加static和final等关键字修饰。
例:
public Student(String id,String name,String grade){ this.id = id; this.name = name; this.grade = grade; }
于是实例化一个对象就可以这样写:
Student student = new Student("w12014001","李四","三年级");
大大简化了创建对象的步骤。
若没有自己定义一个构造方法,会有一个默认的无参构造方法,这也是为什么在没有定义构造方法的情况下可以调用构造方法的原因。
定义了一个构造方法后无论是否有参数,或是方法体,都会将原有的默认无参构造方法覆盖,新的构造方法称为显示构造方法。而一般会需要通过多种方式创建对象,这可以通过重载构造方法来实现。
在一个类中可能会出现需要调用自身构造方法的情况出现,可以通过this关键字调用。
Student std = this("w12014001","李四","三年级");
特别的,若是要在构造方法的方法体中调用构造方法,则只能调用一次,且必须位于方法体所有语句的第一句。
this关键字
关于this,最重要的一点:this代表对当前对象的一个引用。
this可以调用本类中的成员变量,成员方法以及构造方法。
之前提过,局部变量会覆盖掉同名的成员变量,那么就可以通过this关键字来调用成员变量:this.name;
this不能在被static修饰的方法中使用。
对象初始化过程
按现在已知的信息:从调用构造方法开始-->类已被创建-->非静态代码块-->构造方法的方法体