黑马程序员--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();
	}
}

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

时间: 2024-12-22 11:33:23

黑马程序员--java基础学习笔记8的相关文章

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

黑马程序员--java基础学习笔记6 一.笔记内容概述: 数组-第二种定义格式.数组-常见操作-遍历-最值-选择排序-冒泡排序-排序位置置换代码提取.数组-排序的性能问题.数组-常见功能-查找-折半查找.进制转换-查表法-整合. 二.常用内容介绍: 1.数组初始化的三种方式: int[] arr = new int[3]; int[] arr = new int[]{1,2,3}; int[] arr = {1,2,3}; 2.查表法: 如果数据中出现了对应关系,而且对应关系的一方是有序的数字编

黑马程序员--Java基础学习笔记【单例设计模式、网络编程、反射】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 设计模式分类: 创建模式:是对类的实例化过程的抽象化,又分为类创建模式和对象创建模式 类创建模式:工厂方法模式 对象-:简单工厂(静态工厂方法)模式.抽象工厂模式.单例模式.建造模式- 结构模式:描述如何将类或者对象结合在一起形成更大的结构 适配器模式.缺省模式.合成模式.装饰模式(包装模式).门面模式- 行为模式:对不同的对象之间划分责任和算法的抽象化 不变模式.策略模式.迭代子模式.命令模

黑马程序员--Java基础学习笔记【序列化、多线程】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 序列化流与反序列化流 ObjectOutputStream 对象输出流 writeObject(Object obj) 可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中 ObjectInputStream对象输入流 readObject(Objectobj) 从源输入流中读取字节序列,反序列化为一个对象并返回 序列化:将数据分解成字节流,以便存储在文件中或在网络上传输

黑马程序员--Java基础学习笔记【异常处理】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 异常 异常就是Java程序在运行过程中出现的导致程序无法正常运行的错误. Java 中异常继承体系,顶层的类 java.lang.Throwable java.lang.Exception 所有异常的超类 RuntimeException 运行时异常可以不处理 非RuntimeExceptioin非运行时异常必须捕获处理 java.lang.Error 所有错误的超类 异常处理机制 当程序中抛

黑马程序员--Java基础学习笔记【正则表达式、常用API】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 正则表达式 正则表达式的组成规则 java.util.regex.Pattern 常见组成规则 字符集合 [abc] a.b.c中任意一个字符 [^abc] 除了a.b.c的任意字符 [a-z] a-z中的任意一个字符 [a-zA-Z0-9] a-z.A-Z.0-9中任意一个字符 [a-z&&[^bc]] a-z中除了b和c以外的任意一个字符 预定义字符集 .任意一个字符 \d 任意一个

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

一.笔记内容概述: 面向对象(概述&举例).类与对象的之间的关系.类与对象体现&细节.对象的内存体现.成员变量和局部变量的区别.类类型参数.匿名对象.基本数据类型参数传递图解.引用数据类型参数传递图解.封装&代码示例.面向对象(封装&思想).二维数组&定义方式&内存图解&另一种定义方式&应用场景. 二.常用内容介绍: 1.面向对象的特征: a.封装:将具体动作封装起来,方便调用,提高了代码的复用性和安全性. b.继承:继承某个类后,可以直接调

黑马程序员--Java基础学习笔记【IO流-字节流、转换流】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- IO 流 常用基类 字节流 InputStreamOutputStream 常用方法 int read() // 读取一个字节,以 int 形式返回 intread(byte[] b) // 读取最多数组长度个字节并存入该数组,返回实际读取字节 void write(int d) // 写出一个字节 voidwrite(byte[] d) // 将给定字节数组中的所有字节全部写出 void w

黑马程序员--Java基础学习笔记【文件操作、递归】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 文件操作 文件和目录路径名的抽象表示形式. 成员变量 StringpathSeparator= File.pathSeparator; // 路径分隔符 System.out.println(pathSeparator); // ; Stringseparator= File.separator;// 默认名称分隔符 System.out.println(separator); // \ 构造

黑马程序员--Java基础学习笔记【集合-Map】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Map 接口 Map 接口定义的集合,又称查找表 Map 接口和 Collection 接口没关系 Map 集合派系,存储映射键值对 不允许重复的键,每个键最多映射 1 个值 根据内部数据结构不同,Map 接口有多种实现类: 常用的有内部为 hash 表实现的 HashMap 和内部为排序二叉树实现的 TreeMap Map 接口和 Collection 接口的不同 Map 和 Collect