码迷,mamicode.com
首页 > 编程语言 > 详细

黑马程序员--java基础学习笔记8

时间:2015-08-12 01:27:41      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:java   java基础编程   黑马程序员   



黑马程序员--java基础学习笔记8

    一、笔记内容概述:

            面向对象(数组工具对象建立-文档注释-单例设计模式&内存图解)、继承、单继承和多重继承。

       二、常用内容介绍:

            1.继承的好处:提高了代码的复用性;让类与类之间产生了关系;开发最终的核心内容:不断地创建对象,使用对象,并维护着对象之间的关系。

             2.什么时候使用继承?

                 当类与类之间存在着所属关系的时候,就定义继承;java不直接支持多继承,因为多个父类中如果有相同成员时,就会出现调用的不确定性;java中通过多实现implements的方式来间接体现多继承;

             3.如何学习一个继承体系?

                  查看该体系中的最顶层类,了解该体系的基本功能;创建体系中的最子类对象,完成功能的使用。

             4.成员变量的特点:

                  对于变量的值,子类有就不找父类,局部要是有值,就不会找成员变量的值;

                  细节a:当本类中的成员和局部成员同名时,用this区分,当子父类中的成员变量同名时,用super,区分父类 ;细节b:子类不能直接访问父类中的私有的内容,但是可以调用父类对外提供的公共方法调用父类中的私有内容。

             5.重载和重写的区别:

                 重载发生在同一个类中,重写发生在子父类中;子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限;静态方法只能覆盖父类的静态方法,或者被其下一个子类的静态方法覆盖。

 

        三、经典示例及讲解:

            1.使用工具类求数组的最大值。

工具类Tools.java

package com.date8;
/**
 *从节省内存空间角度
 *可以将工具类中的方法定义成静态的,
 *这样就直接可以通过类名调用,不需要创建对象。
 *
 *建立一个用于操作数组的工具类,其中包含着常见的对数组操作的函数如:最值,排序等
 *@author zengwei
 *@version 1.0.1
 */
public class Tools {
	/*不允许本类创建对象*/
	private Tools(){
		
	}
	/**
	 *获取整型数组的最大值 
	 */
	public static int getMax(int[] arr){
		int index = 0;
		for(int i=1;i<arr.length;i++){
			if(arr[i]>arr[index]) index = i;
		}
		return arr[index]; 
	}
	/**
	 * 冒泡排序
	 * @param arr
	 */
	public static void maoPaoSort(int[] arr){
		for(int i=arr.length-1;i>1;i--){
			for(int j=1;j<i;j++){
				if(arr[j]>arr[j+1]){
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
	}
	/**
	 *选择排序 
	 */
	public static void selectSort(int[] arr){
		for(int i=0;i<arr.length-1;i++){
			for(int j=i+1;j<arr.length;j++){
				if(arr[i]>arr[j]){
					int temp = 0;
					temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
	}
	/**
	 * 插入排序
	 * @param arr
	 */
	public static void insertion(int[] arr){
		for(int i=1;i<arr.length;i++){
			//insertIndex无序元素要插入的位置
			int insertIndex = i;
			int current = arr[i];
			for(int j=i-1;j>=0;j--){
				if(current<arr[j]){
					//比较数后移
					arr[j+1] = arr[j];
					//插入位置前移
					--insertIndex;
				}else{
					break;
				}
			}
			//直接将数据插入
			arr[insertIndex] = current;
		}
	}
	
	/**
	 *快速查找法 
	 */
	public static int getIndex(int[] arr,int key){
		for(int i=0;i<arr.length;i++){
			if(arr[i]==key) return i;
		}
		return -1;
	}
}

测试代码

package com.date8;
//使用工具类方式求数组的最大值(使用面向对象的思想)
public class Test1 {
	public static void main(String[] args){
		int[] arr = {1,4,7,2,5,8,3,6,9};
		int max = Tools.getMax(arr);
		Tools.insertion(arr);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]+" ");
		}
		System.out.println("max="+max);
		System.out.println(Tools.getIndex(arr, 9));
	}
}

            2.单例设计模式介绍

package com.date8;
/**
 *单例设计模式 
 */
class Single{
	private static Single s = new Single();//s属于引用成员变量 private 私有化,用于可控
	private Single(){}//私有化构造函数
	public static Single getInstance(){
		return s;
	}
}
public class Test2 {
	public static void main(String[] args){
//		Single s1 = Single.getInstance();
//		Single s2 = Single.getInstance();
//		System.out.println(s1==s2);
		Exam t1 = Exam.getInstance();
		Exam t2 = Exam.getInstance();
		t1.setNum(10);
		t2.setNum(20);
		System.out.println(t1.getNum());
		System.out.println(t2.getNum());
	}
}
class Exam{
	private int num;
	private static Exam e = new Exam();//私有化对象 
	private Exam(){}//私有化构造函数
	public static Exam getInstance(){//获取实例对象
		return e;
	}
	public void setNum(int num){
		this.num = num;
	}
	public int getNum(){
		return num;
	}
}

            3.单例设计模式的两种情况(饿汉式和懒汉式)

package com.date8;

public class Test3 {
	public static void main(String[] args) {
		
	}
}
/**
 *饿汉式 
 */
class easy{
	private static easy s = new easy();
	/**
	 *私有化构造函数,防止其他类创建本类对象
	 */
	private easy(){}
	/**
	 *获取实例对象
	 */
	public static easy getInstance(){
		return s;
	}
}
/**
 *懒汉式 (存在线程安全隐患)需要加线程锁
 */
class lazy{
	private static lazy l = null;
	private lazy(){}
	public static synchronized lazy getInstance(){
		if(l==null){
			l = new lazy();
		}
		return l;
	}
}

            4.继承的示例(结合上面理论)

package com.date8;
/**
 *继承的好处:
 */
class Person{//父类
	String name;
	int age;
}
class Student extends Person{
	void study(){
		System.out.println(name+"...student study..."+age);
	}
}
class Worker extends Person{
	void work(){
		System.out.println(name+"...Worker work..."+age);
	}
}
public class Test4 {
	public static void main(String[] args) {
		Student p = new Student();
		p.name = "张三";
		p.age = 18;
		p.study();
		
		Worker w = new Worker();
		w.name = "王五";
		w.age = 30;
		w.work();
	}
}

            5.子父类中,成员变量的特点:(结合上面理论)

package com.date8;
/***
 * 在子父类中,成员的特点体现:
 */
class Fu{
	private int money = 100;//子类不能直接访问
	int num = 4;
	public int getMoney(){
		return money;
	}
}
class Zi extends Fu{
	int num = 5;
	void show(){
		System.out.println(num+"....."+super.num+"......"+super.getMoney());
	}
}
public class Test5 {
	public static void main(String[] args) {
		Zi z = new Zi();
		z.show();
	}
}

            6.子父类中成员函数的特点:

package com.date8;
/**
 *二、子父类中成员函数特点 
 * 1.当子父类中有同名成员函数时,子类会覆盖父类
 * 2.下面的eat方法不能成为覆盖,因为子类无法直接访问父类的私有成员和方法,
 * 	   所以不存在覆写这一说法
 * 3.当对一个类进行子类的扩展时(软件升级),子类需要保留父类的功能
 * 	  但是又要定义子类中该功能的特有内容时,就使用覆盖操作完成。
 * 
 */
class father{
	public String s = "看书";
	public void show(){
		System.out.println("fu..."+s);
	}
	void eat(){
		System.out.println("fu......吃西瓜");
	}
}
class son extends father{
	public String s = "玩游戏";
	public void show(){//直接覆盖父类的方法
		System.out.println("son..."+s);
	}
	
	public void eat(){
		System.out.println("son......喝可乐");
	}
}
public class Test6{
	public static void main(String[] args) {
		new son().show();
		new son().eat();
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

黑马程序员--java基础学习笔记8

标签:java   java基础编程   黑马程序员   

原文地址:http://blog.csdn.net/u014344668/article/details/47429329

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!