Java语言学习(五):面向对象入门

原创
2018/07/12 17:37
阅读数 70

    接下来的博客,我将着重说下面向对象的编程思想,这个是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接口,该接口无任何方法,仅是个标识接口。具体的使用有机会再说了。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部