黑马程序员--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();
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u014344668/article/details/47429329