Java是完全面向对象的高级语言,其基本的操作基本都是针对相应的对象和类。面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。对应面向对象的语言,还有一种面向过程的语言,如C语言。面向对象的语言是在面向过程语言的基础上发展而来的。面向对象(OOP,全称为Object-Oriented-Programer,下文简称为OOP)相对于面向过程的语言而言,其优势在于很多问题的解决方法被封装在对象里,有时只需要创建这样的对象就可以解决我们的问题,而不必关心其具体实现细节,这很明显给开发带来了极大的方便。
在面向过程的语言中,著名的匈牙利数学家计算机学家冯诺依曼有一个经典的观点:算法+数据结构=程序。在这种编程语言下,程序员必须首先确定如何操作数据,也即把解决问题的具体过程实现即算法,之后再考虑如何组织数据。而OOP却调换了这个次序,把数据放在了第一位,然后再考虑算法。
下面就是Java语言中重要的几个概念:类class、对象object、方法method
1.类class
1.1什么是类
类(class),就是构造对象的模板和蓝图。通俗的讲,类是人类大脑对应现实生活中很多个体表现出来的共性的特点抽象出来在意识领域代表该个体的一个概念。举例来说,人不是自然界存在的概念,“人”只是我们对于我们人类的抽象描述,它代表一个个体,也可以表示我们整个人类群。当我们把说到人类时,不是说某个具体的人,而是泛指。
1.2如何声明一个类
在Java中声明定义一个自定义类的格式很简单:class classname{}。
这里出现了一个单词class,这是Java的关键字,定义类时必须写上,classname就是一个名称。它是一个合法的Java标识符。再就是一对“{}”,定界符,表示类的主体。当然,这里省略了可以修饰类的修饰符如,权限修饰符public等。
1.3类有什么好处
我觉得“类”的引入,在编程语言中是很大的进步。因为,类就像一个可以快速生产对象的工厂。由类构造对象的过程我们称为创建类的实例。类有三大特点:封装、继承、多态。这三大特性构成了使用类的好处。后面对具体举例说明。
2.对象object
2.1什么是对象
对象,是现实中具体的事物。如,美国总统奥巴马。在OOP中对象才是真正解决问题的。而在面向过程语言中,我们的问题全抛给了程序员,往往是程序员编好具体对应的程序来解决该类问题。OOP中问题的解决方法都封装在对象里,都写在了类主体里面。程序员有时并不需要去编写很多代码来解决手边的问题,只有有解决这样问题的类存在,程序只需要在程序中创建类对象,直接调用对象来处理。
2.2如何创建一个对象实体
在Java中,创建对象也很简单。只要一个操作符new即可。如,创建一个日历类对象:new GregorianCalendar();
2.3对象的三大特征
2.3.1对象的行为——可以对对象施加那些操作?可以对对象施加那些方法?
2.3.2对象的状态——当施加那些方法后,对象如何响应?
2.3.3对象的标识——如何辨识具有相同行为而状态不同的对象?
3.方法method
3.1什么是方法
方法,顾名思义就是解决问题的方式。在C语言中,方法一般叫函数。必须明确的是,函数也即方法,是解决具体问题的代码级的东西。这里就是程序员的工作内容。所有的计算机语言,在这里都是一样的,都是程序员按照计算机思维遵循语言本身的语法编写的一行行代码。
3.2方法的写法
有过学习C语言的人,知道方法或函数的定义很简单。在Java中具体定义格式: 返回值类型 函数名称(参数表列){语句;…}
同样,这里也省略了一些可以修饰方法的修饰符,像修饰访问权限的关键字public。
4.Java语法-对象和类
4.1对象和对象变量(类类型变量)
我们知道要想使用对象,则事先必须构造好对象,并指定其初始状态,然后再对对象应用方法。在Java语言中,使用构造器(constructor)来构造新实例。构造器是一个特殊的方法,专门用来在创建新对象时对对象进行的个性化初始化。可以这样说,构造器也称构造方法是面向对象使用的。现在可以进行创建一个对象了。具体操作如下:
//现在我们开始使用new操作符和构造器来创建对象 Date time = new Date();
new 操作符用于创建类的实例也就是对象,但不是所有的类都需要使用到new,比如,如果创建String字符串类型的对象,直接赋值即可完成创建。如果使用了new 操作符,往往后面还会有一个类似函数的带圆括号的部分,这是类的构造器部分,可以对新创建的类的对象实现一些必要的初始化工作。
匿名对象:如果一个对象只需要使用一次,可以不必为其命名。使用new Date();即可创建一个匿名的Date类对象。
对象变量:time 就是一个Date类的对象变量,也称类类型变量。可以对比下,基本数据类型变量的定义。
//现在我们看看基本数据类型的变量的声明 int age = 18;
在这里,我们可以把int看成和Date相同的功能,即表明age的类型,很明显数字18是一个独立对象,只不过没有使用new操作符罢了。
4.2数据封装及公共访问器方法
建议绝大部分实例域的访问权限最好定义为private。因为如果定义为public则任何类都可以随意访问并修改实例域,这不仅是非常危险的,而且违背了Java语言的封装性。如果我们把数据进行封装,那么问题又来了,外部类不可避免地要访问数据,又不希望外部类随意访问修改域,那么该怎么做?
这时,我们就应该给要封装的数据域提供一个公共的对外的接口:访问器方法和更改器方法。通常,我们习惯在访问器方法名前面加上前缀get,在更改器方法名前面加上前缀set。
- 示例代码
import java.util.GregorianCalendar; import java.util.Calendar; import java.util.Date; class Employee { //instance fields,实例域,成员变量 private String name; private double salary; private Date hireDay; //constructors,构造器 public Employee(String name,double salary,int year,int month,int day) { this.name = name; this.salary = salary; GregorianCalendar gc = new GregorianCalendar(year,month-1,day); this.hireDay = gc.getTime(); } //instance methods,成员方法 //以下全是访问器方法 public String getName() { return this.name; } public double getSalary() { return this.salary; } public Date getHireDay() { return this.hireDay; } } public class EmployeeDemo { public static void main(String[] args) { Employee[] staff = new Employee[3]; staff[0] = new Employee("丁敏",2000.0,2015,7,10); staff[1] = new Employee("贺鹏飞",3000.0,2015,8,2); staff[2] = new Employee("姚文鑫",3120.0,2016,6,16); for(Employee e:staff) { System.out.println("Name:"+e.getName()+" Salary:"+e.getSalary()+" HireDay:"+e.getHireDay()); } } }
-
代码执行结果
4.4用户自定义类
4.4.1实例域
前面已经创建过实例域,就是成员变量。该域往往是类的实例的具备的属性、状态。它们绝大部分为基本数据类型。
4.4.2构造器
构造器,就是创建类对象的工厂。构造器一般有以下特点:
1)和类名同名;
2)没有返回值;
3)支持无参,多参的参数表列;
4)总是伴随new操作符一起调用;
5)每个类可以有一个以上的构造器方法。
4.4.3隐式参数
在这里,隐式参数指的是this关键字。this的作用有二个:
1)用于区分形参局部变量和实例域(成员变量),如下方法中如果没有this就难以区分name是传入的name局部变量还是对象的实例域
//你能分清哪个name是局部变量name?哪个是实例域name? public void method(String name){ name = name; } //如果把上面的函数改成如下格式,很容易分清name所属 public void method(String name){ this.name = name; } //当然,很多程序员习惯在局部变量名前加上前缀a public void method(String aName){ name = aName; }
2)this第二个用法就是在多个构造器之间相互调用充当构造器本身
//假设这里二个构造器 public Employee(String name,int age){ this.name = name; this.age = age; } //这是另一个构造器,如果不使用this关键字 public Employee(String name,int age ,String sex){ this.name = name; this.age = age; this.sex = sex; } //很显然,这样就出现代码重复,显得冗余,如果使用this关键字则 public Employee(String name,int age ,String sex){ this(name,age);//这里调用另一个构造器 this.sex = sex; }
4.5静态修饰符static
静态修饰符,static可以修饰实例域,可以修饰成员方法。必须明确的一点是,static声明的东西是面向类存在的。就是类的生存周期就是static修饰的东西的生存周期。static修饰的东西不是依赖于对象存在,而是优先于对象存在。
- 示例代码
import java.util.Random; class StaticBlock { //inistance field,实例域,成员变量 private String name; private int id; private static int nextId; //constructors,构造器 StaticBlock(){} StaticBlock(String aName) { name = aName; System.out.println("我是构造器,我是在执行完初始化块之后再执行"); } //initialization block,初始化块,构造代码块 { name = "丁敏"; id = nextId; nextId++; System.out.println("我是初始化块也叫构造代码块,面向对象,没有静态初始化块则我是最先执行"); } //static initialization block,静态初始化块,静态构造代码块 static{ Random generator = new Random(); nextId = generator.nextInt(10000); System.out.println("我是静态初始化块,面向类,我比初始化块更早执行且无论new多次我只执行1次"); } //instance method,成员方法 public String getName() { return name+"#"+id; } } class StaticBlockDemo { public static void main(String[] args) { System.out.println(new StaticBlock().getName().toString()); System.out.println(new StaticBlock("王祥").getName().toString()); } }
-
程序执行结果
总结:通过Java语法的学习,掌握好Java的语法基础,才能写出高质量的代码。要记得这些语法一点不犯错,这几乎是不可能的,只有在遇到问题时,不断解决问题,这样才能真正掌握Java的语言。最有效的一点时,编译器会告诉我们那里有问题,该怎么解决。有时,还得自己先猜想这样可不可以,再通过编写相应的测试用例来验证猜想,这也是快速提高的方法之一。当然,好记性不如烂笔头,要多记更要多敲代码。