接下来的博客,我将着重说下面向对象的编程思想,这个是Java编程开发的重点内容,对以后的开发有着深远的影响,必须重视起来。在使用Java语言开发时,时刻要以面向对象的思想考虑问题,面向对象的基础就是类。
首先,说下类的定义,下面是类的一般定义模式:
(1)任务:定义类
(2)准备工作:类中存在的元素有成员变量和方法
(3)编程:
定义类,提供成员变量和方法:
public class Book {
private String bookName;//定义书名
private String author;//定义作者
private double price;//定义价格
//构造方法初始化
public Book(String bookName,String author,double price){
this.bookName = bookName;
this.author = author;
this.price = price;
}
public String getBookName(){
return bookName;
}
public String getAuthor(){
return author;
}
public double getPrice(){
return price;
}
}
测试类,创建对象:
public class TestBook {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建对象
Book book = new Book("Java语言学习","Yoki",66.66);
//通过对象调用类的方法
System.out.println("书名:"+book.getBookName());
System.out.println("作者:"+book.getAuthor());
System.out.println("价格:"+book.getPrice());
}
}
(4)运行:输出实例化类对象的信息
注意:在Java中,使用class关键字来定义类。一个类通常包括域和方法两部分,域表示对象的状态,方法表示对象的行为。使用new关键字创建类的对象。一般来说,变量在使用前需要对其进行初始化,Java中虚拟机会自动为其初始化,像基本数据类型,比如 byte、int、long、float、char等,而像引用类型的变量,如String类型,在使用前需要进行初始化,否则会抛出null异常。除了成员变量,还有局部变量,使用前也需初始化。
上面是一般的类的定义,还有种方式:单例模式
(1)任务:单例模式
(2)准备工作:单例模式的特点在于仅能获得一个对象,需将构造方法私有化,并提供一个静态方法返回类的对象
(3)编程:
/*
* 单例模式
*/
public class Emperor {
//声明一个类的引用
private static Emperor emperor = null;
//将构造方法私有
private Emperor(){}
//实例化引用
public static Emperor getInstance(){
if(emperor == null)
emperor = new Emperor();
return emperor;
}
public void getName(){
System.out.println("单例模式!!!");
}
}
测试类:
public class TestEmperor {
public static void main(String[] args){
Emperor e1 = Emperor.getInstance();
e1.getName();
Emperor e2 = Emperor.getInstance();
e2.getName();
}
}
(4)运行:输出信息
接着,我们再通过汉诺塔的案例来进一步熟悉下:
(1)任务:汉诺塔
(2)准备工作:汉诺塔的思想:将N个盘子从A移到C,需要先将第N个盘子上面的N-1个盘子移到B上,这样才能将第N个盘子移到C上,同理,为了将第N-1个盘子从B移到C上,需要将N-2个盘子移到A上,这样才能将第N-1个盘子移到C上。通过递归实现汉诺塔的求解。
(3)编程:
import java.util.Scanner;
public class HanoiTower {
public static void moveDish(int level,char from,char inter,char to){
if(level == 1)
System.out.println("从"+from+"移动盘子1到"+to);
else{
moveDish(level-1,from,to,inter);
System.out.println("从"+from+"移动盘子"+level+"到"+to);
moveDish(level-1,inter,from,to);
}
}
public static void main(String[] args){
System.out.println("请输入汉诺塔的阶数:");
Scanner scan = new Scanner(System.in);
try{
int nDisks = scan.nextInt();
moveDish(nDisks,'A','B','C');
}catch(Exception e){
System.out.println("输入不合法!");
}
}
}
(4)运行:在控制台输入阶数,输出移动的操作步骤
在方法的构造中,重载是对方法名过多的一种处理,当对象在调用方法时,可以根据方法参数的不同确定执行那个方法。方法参数的不同包括参数类型不同、参数个数不同、参数顺序不同,即这些不同能构造出相同名称的方法。构造方法是一种特殊类型的方法,声明时,遵守一些规定:
构造方法的名称与类名相同;
构造方法无返回值;
构造方法总是与new操作符一起使用;
此外,在构造方法中,可使用this来调用其他构造方法,使用super调用超类构造方法。
对于类中的成员变量,大多通过公有public或者私有private的方式修饰。加入static修饰成员变量,则该变量时所用对象共享的,任何一个对象的修改会影响其他对象。如下
public class Book{
//定义一个计数器
private static int counter = 0;
public Book(String bookName){
System.out.println("书名:"+bookName);
counter++;
}
public static int getCounter(){
return counter;
}
}
在测试类中,利用书名数组创建对象:
public static void main(String[] args){
String[] bookNames = {"Java语言学习","PHP语言学习","C语言学习"};
for(int i=0;i<bookNames.length;i++){
new Book(bookNames[i]);
}
System.out.println("计数器为:"+Book.getCounter());
}
运行程序打印出计数器为3,说明创建3次对象,计数器变量共享,才能叠加而不是重新从初始值0开始。
Java中的类都是Object类的直接或间接子类。如在Object类中定义了equals()方法,toString()方法等,我们也可以重写(加上@Override注解)该方法,使其符合我们的使用要求,如下:
public class Book{
private String bookName;
private String author;
@Override
public String toString(){
return "书名:"+bookName+",作者:"+author;
}
}
Java将内存空间分为两块,即堆和栈,在栈中保存基本类型和引用变量,在堆中保存对象。对于基本类型可以使用 “=” 来进行克隆,此时两个变量没有关联关系;对于引用变量使用 “=” 进行克隆,将修改引用,此时两个引用变量将指向同一个对象,则一个变量对其进行修改会改变另一个变量。克隆又分为浅克隆和深克隆,这里不做介绍了。
最后还有个序列化的问题,进行序列化的类需要实现Serializable接口,该接口无任何方法,仅是个标识接口。具体的使用有机会再说了。