Monthly Archive: April, 2016

JAVA 多态总结

什么是多态

  1. 面向对象的三大特性:
    封装继承多态(抽象)
  2. 多态的定义:
    指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是方法的调用)
    简单来说,多态就是相同的行为,不同的实现
  3. 实现多态的技术称为:
    动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
  4. 多态的作用:
    消除类型之间的耦合关系。
  5. 现实中,关于多态的例子:
    比方说按下 F1 键这个动作,如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。

多态的必要条件

  1. 继承关系
  2. 重写
  3. 父类引用指向子类对象

多态的表现

  • 重写overriding是父类和子类之间多态性的一种表现
  • 重载overloading是一个类中多态性的表现。

多态的分类:

  • 静态多态(使用重载实现)
    在编译期就已知方法执行的最终结果
  • 动态多态(使用动态绑定和重写实现)
    编译期未知,运行期根据绑定对象的不同,有不同的效果。

Read more

JAVA 类的高级概念

访问修饰符

每一个成员(成员变量、方法和构造器)都有一个访问修饰符,用来判断谁可以访问该成员。

本类 同包类 不同包类
子类 非子类 子类 非子类
public
protected
默认修饰符
private

封装的概念及好处

  1. 组装(定义一个类就是封装)
    类的定义:1、属性  2、行为
  2. 信息隐藏
    • 访问修饰符
      Public、Pprotected、默认、Private
    • 方法实现调用者无需知道方法的具体步骤,只关心效果(功能)的达成
    • 访问器、修改器(get、set方法)
  3. 封装的好处
    • 类的成员变量可以成为只读或者只写的提供的方法可以根据自己的意义来是否提供给使用者
    • 类可以对存储在其成员变量中的内容有一个整体的控制可以对用户传进来的参数进行判断是否符合要求,在接口处把控
    • 类的用户不需要知道类是如何存储数据的
  4. 类的任何一个方法都是封装性的体现

Static关键字

  1. 凡是使用Static修饰的,都与对象无关,与类有关
  2. 凡是使用Static修饰的,都是优先加载的(JVM加载的时候就开始加载);
  3. 构造方法是不能使用Static修饰的(因为构造是在JVM加载后执行的动作)

属性:

  1. 类属性
    • 全类共享一个值(一处更改全类改变)
    • 存在于数据段的静态区,JVM加载期既放入
    • 常量属性直接用Static
    • 变量属性一定要分析出全类共享一个值才能使用
  2. 方法(又被称之为类方法)
    • 方法中只能操作Static修饰的属性或方法
    • 工具类的工具方法一般设置成Static(不改变属性值,只做处理操作)
  3. 初始化块
    1. 静态初始化块:
      • 在类加载期被执行,仅执行一次(因为加载是只做一次的)
      • 可以在类准备期间书写一些准备工作的代码,所以经常使用
      • 使用频率常常比静态方法和静态属性高;
    2. 实例初始化块:
      • 在产生对象的时候执行,可以被执行多次。
      • 在本类构造之前,在父类构造之后执行
      • 很少使用,功能与构造方法重合

静态类成员(方法)别名:类方法

  1. Static修饰的方法:可以直接用类进行调用。与对象无关,属于类级别;
  2. Static修饰的方法和属性在加载期会被优先加载;Static的方法不能操作费Static的属性和其他方法

使用范围:

  1. 工具类的工具方法设置为Static
  2. Static 修饰的方法叫静态方法,即类方法
    Static修饰过的方法属于类方法,它不属于这个类的实例(对象),因此在static修饰的方法中为变量赋值就会报错,因为我们内存中根本就还没有该变量。
  3. 类方法只能使用静态变量

访问方法:不用创建对象,直接使用   类名.属性

  1. 静态方法不能访问变量
  2. 非静态方法可以访问静态属性和变量

Read more

JAVA输出一组双色球

难点:红球不能一样~

实现方法:使用util库的Random获取随机数,再拼装为数组

package org.jalena;

import java.util.Random;

public class OutNumber {

	public OutNumber() {
	}

	private int[] getRedBall() {

		Random num = new Random(); // new一个随机数出来
		int[] redBall = new int[6]; // 声明一个6个数的int数组

		boolean result = false;

		do {
			int count = 0;
			result = false; // 循环赋值

			// 生成一个数组
			for (int i = 0; i < redBall.length; i++) {
				redBall[i] = num.nextInt(31) + 1;
			}

			// 判断数组是否有相同的
			for (int i = 0; i < redBall.length - 1; i++) {
				for (int j = i + 1; j < redBall.length; j++) {
					if (redBall[i] == redBall[j])
						count++;
				}
			}

			if (count > 0) {
				result = true;
			}

		} while (result);

		return redBall;
	}

	private String getBlueBall() {
		Random num = new Random();
		int blueBall = num.nextInt(31) + 1;

		String oblueBall;

		if (blueBall < 10) {
			oblueBall = "0" + blueBall;
		} else {
			oblueBall = "" + blueBall;
		}

		return oblueBall;
	}

	// 输出一组双色球号码
	public void getSsq() {

		// redBall
		System.out.print("红球是:");
		for (int a : this.getRedBall()) {
			if (a < 10) {
				System.out.print("0" + a + " ");
			} else {
				System.out.print(a + " ");
			}
		}

		// blueBall
		System.out.println("\t" + "蓝色球是:" + this.getBlueBall());

	}
}

JAVA 输出任意奇数的菱形

常用的输出方法为2个等腰三角形叠起来,但是那样循环太多,很容易把人绕昏!

package zuoye;

import java.util.Scanner;

public class Diamond {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.print("请输入要打印行数:");
		int line = 0;

		line = input.nextInt();

		if (line % 2 == 0 || line == 1) {
			System.out.print("输入错误,只能为奇数");
		}else{
			int middle = (line + 1) / 2; 				// 求出中间行号
			int	k = 0;      							// k用于判断是输出上部的位置还是输出下部的位置

			for (int i = 0 ; i < line; i++) { 			// 控制需要输出的行数,取值于 Scanner
				
				if (i < middle) {						// 如果当前行小于中间行,那么赋值k为上部符号和空格的输出
					k++; 								// 上面的三角形的行号(包括中间那行)
				} else {
					k--; 								// 下面的三角形的行号(不包括中间那行)
				}
				
				for (int j = 0; j < middle + k; j++) { 				// 每行打印的空格和星星总数为:j   middle + k = j  也就是总行数
					System.out.print(j > middle - k ? "O" : " "); 	// middle-k的那个格子打印空格,后面的格子打印O
				}
				System.out.println();
			}
		}
		input.close();   // 关闭输入
	}
}