/**PageBeginHtml Block Begin **/ /***自定义返回顶部小火箭***/ /*生成博客目录的JS 开始*/ /*生成博客目录的JS 结束*/

学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记



注:本文声明事项。

本博文整理者:刘军

本博文出自于: 《Java8 编程官方参考教程》一书

声明:1:转载请标注出处。本文不得作为商业活动。若有违本之,则本人不负法律责任。违法者自负一切法律责任。

          2: 本书对应的jdk为 jdk8版本

          3:因为内容容量太大,编辑器无法承受于是给拆分了以下版本:

          《Java 8编程官方参考教程(第9版).pdf》学习笔记(一)--->第一章到六章学习笔记讲:java的历史和演变、Java概述、数据类型、变量和数组、运算符、控制语句、类 等内容             

           《Java 8编程官方参考教程(第9版).pdf》学习笔记(二)--->第七章到九章学习笔记讲:java 方法、继承详解、包和接口

___________________________________________________________________________________________________________________________

《Java 8编程官方参考教程(第9版)》pdf 下载地址:http://pan.baidu.com/s/1o7Zp3Mq 密码:     33cf    

____________________________________________________________________________________________________________




第7章 方法和类的深入分析


7.1 重载方法

image_thumb[335]image_thumb[338]

  1 package Chap7;
  2 
  3 /**
  4  * Demonstrate method overloading.
  5  *
  6  * @ClassName: OverloadDemo
  7  * @Description:
  8  * @author 刘军/shall_liu (1136808529@qq.com)
  9  * @date 2017年9月14日 上午12:15:21
 10  *
 11  */
 12 class OverloadDemo {
 13 	void test() {
 14 		System.out.println("No parameters");
 15 	}
 16 
 17 	// Overload test for one integer parameter.
 18 	void test(int a) {
 19 		System.out.println("a: " + a);
 20 	}
 21 
 22 	// Overload test for two integer parameters.
 23 	void test(int a, int b) {
 24 		System.out.println("a and b: " + a + " " + b);
 25 	}
 26 
 27 	// overload test for a double parameter
 28 	double test(double a) {
 29 		System.out.println("double a: " + a);
 30 		return a * a;
 31 	}
 32 }
 33 
 34 
 35 package Chap7;
 36 
 37 /**
 38  *
 39  * @ClassName: Overload
 40  * @Description:
 41  * @author 刘军/shall_liu (1136808529@qq.com)
 42  * @date 2017年9月14日 下午11:35:25
 43  *
 44  */
 45 class Overload {
 46 	public static void main(String args[]) {
 47 		OverloadDemo ob = new OverloadDemo();
 48 		double result;
 49 
 50 		// call all versions of test()
 51 		ob.test();
 52 		ob.test(10);
 53 		ob.test(10, 20);
 54 		result = ob.test(123.25);
 55 		System.out.println("Result of ob.test(123.25): " + result);
 56 	}
 57 }
 58 //其运行结果为:
 59 No parameters
 60 a: 10
 61 a and b: 10 20
 62 double a: 123.25
 63 Result of ob.test(123.25): 15190.5625
 64 
 65 
 66 
 67 
View Code

image

  1 package Chap7;
  2 
  3 /**
  4  * Demonstrate method overloading.
  5  *
  6  * @ClassName: OverloadDemo
  7  * @Description:
  8  * @author 刘军/shall_liu (1136808529@qq.com)
  9  * @date 2017年9月14日 上午12:15:21
 10  *
 11  */
 12 class OverloadDemo {
 13 	void test() {
 14 		System.out.println("No parameters");
 15 	}
 16 
 17 	// Overload test for two integer parameters.
 18 	void test(int a, int b) {
 19 		System.out.println("a and b: " + a + " " + b);
 20 	}
 21 
 22 	// overload test for a double parameter and return type
 23 	void test(double a) {
 24 		System.out.println("Inside test(double) a: " + a);
 25 	}
 26 }
 27 
 28 package Chap7;
 29 
 30 /**
 31  *
 32  * @ClassName: Overload
 33  * @Description:
 34  * @author 刘军/shall_liu (1136808529@qq.com)
 35  * @date 2017年9月14日 下午11:35:25
 36  *
 37  */
 38 class Overload {
 39 	public static void main(String args[]) {
 40 		OverloadDemo ob = new OverloadDemo();
 41 		int i = 88;
 42 
 43 		ob.test();
 44 		ob.test(10, 20);
 45 
 46 		ob.test(i); // this will invoke test(double)
 47 		ob.test(123.2); // this will invoke test(double)
 48 	}
 49 }
 50 //其运行结果为:
 51 No parameters
 52 a and b: 10 20
 53 Inside test(double) a: 88.0
 54 Inside test(double) a: 123.2
 55 
View Code

image

image

7.1.1 重载构造函数

image

  1 package Chap7;
  2 
  3 /**
  4  *
  5 * @ClassName: Box
  6 * @Description:  重载构造器
  7 * @author  刘军/shall_liu (1136808529@qq.com)
  8 * @date 2017年9月14日 下午11:47:01
  9 *
 10  */
 11 class Box {
 12 	double width;
 13 	double height;
 14 	double depth;
 15 
 16 	// This is the constructor for Box.
 17 	Box(double w, double h, double d) {
 18 		width = w;
 19 		height = h;
 20 		depth = d;
 21 	}
 22 
 23 	// compute and return volume
 24 	double volume() {
 25 		return width * height * depth;
 26 	}
 27 }
View Code

image

  1 package Chap7;
  2 
  3 /**
  4  *
  5  * @ClassName: Box
  6  * @Description: 重载构造器
  7  * Here, Box defines three constructors to initialize the dimensions of a box
  8  * various ways.
  9  * @author 刘军/shall_liu (1136808529@qq.com)
 10  * @date 2017年9月14日 下午11:47:01
 11  *
 12  */
 13 class Box {
 14 	double width;
 15 	double height;
 16 	double depth;
 17 
 18 	// constructor used when all dimensions specified
 19 	Box(double w, double h, double d) {
 20 		width = w;
 21 		height = h;
 22 		depth = d;
 23 	}
 24 
 25 	// constructor used when no dimensions specified
 26 	Box() {
 27 		width = -1; // use -1 to indicate
 28 		height = -1; // an uninitialized
 29 		depth = -1; // box
 30 	}
 31 
 32 	// constructor used when cube is created
 33 	Box(double len) {
 34 		width = height = depth = len;
 35 	}
 36 
 37 	// compute and return volume
 38 	double volume() {
 39 		return width * height * depth;
 40 	}
 41 }
 42 
 43 
 44 
 45 package Chap7;
 46 
 47 /**
 48  *
 49 * @ClassName: OverloadCons
 50 * @Description:  重载构造器
 51 * @author  刘军/shall_liu (1136808529@qq.com)
 52 * @date 2017年9月14日 下午11:49:30
 53 *
 54  */
 55 
 56 class OverloadCons {
 57 	public static void main(String args[]) {
 58 		// create boxes using the various constructors
 59 		Box mybox1 = new Box(10, 20, 15);
 60 		Box mybox2 = new Box();
 61 		Box mycube = new Box(7);
 62 
 63 		double vol;
 64 
 65 		// get volume of first box
 66 		vol = mybox1.volume();
 67 		System.out.println("Volume of mybox1 is " + vol);
 68 
 69 		// get volume of second box
 70 		vol = mybox2.volume();
 71 		System.out.println("Volume of mybox2 is " + vol);
 72 
 73 		// get volume of cube
 74 		vol = mycube.volume();
 75 		System.out.println("Volume of mycube is " + vol);
 76 	}
 77 }
 78 
 79 //其运行结果为:
 80 Volume of mybox1 is 3000.0
 81 Volume of mybox2 is -1.0
 82 Volume of mycube is 343.0
 83 
 84 
 85 
View Code


7.2 将对象用作参数

image

  1 class PassOb {
  2   public static void main(String args[]) {
  3     Test ob1 = new Test(100, 22);
  4     Test ob2 = new Test(100, 22);
  5     Test ob3 = new Test(-1, -1);
  6 
  7     System.out.println("ob1 == ob2: " + ob1.equalTo(ob2));
  8 
  9     System.out.println("ob1 == ob3: " + ob1.equalTo(ob3));
 10   }
 11 }
 12 
 13 package Chap7;
 14 
 15 /**
 16  * Objects may be passed to methods.
 17  *
 18  * @ClassName: Test
 19  * @Description:
 20  * @author 刘军/shall_liu (1136808529@qq.com)
 21  * @date 2017年9月14日 下午11:52:55
 22  *
 23  */
 24 class Test {
 25 	int a, b;
 26 
 27 	Test(int i, int j) {
 28 		a = i;
 29 		b = j;
 30 	}
 31 
 32 	// return true if o is equal to the invoking object
 33 	boolean equalTo(Test o) {
 34 		if (o.a == a && o.b == b)
 35 			return true;
 36 		else
 37 			return false;
 38 	}
 39 }
 40 //其运行结果为:
 41 ob1 == ob2: true
 42 ob1 == ob3: false
 43 
View Code

image

  1 package Chap7;
  2 
  3 /**
  4  * Here, Box allows one object to initialize another.
  5  *
  6  * @ClassName: Box
  7  * @Description:
  8  * @author 刘军/shall_liu (1136808529@qq.com)
  9  * @date 2017年9月15日 上午12:00:54
 10  *
 11  */
 12 
 13 class Box {
 14 	double width;
 15 	double height;
 16 	double depth;
 17 
 18 	// construct clone of an object
 19 	Box(Box ob) { // pass object to constructor
 20 		width = ob.width;
 21 		height = ob.height;
 22 		depth = ob.depth;
 23 	}
 24 
 25 	// constructor used when all dimensions specified
 26 	Box(double w, double h, double d) {
 27 		width = w;
 28 		height = h;
 29 		depth = d;
 30 	}
 31 
 32 	// constructor used when no dimensions specified
 33 	Box() {
 34 		width = -1; // use -1 to indicate
 35 		height = -1; // an uninitialized
 36 		depth = -1; // box
 37 	}
 38 
 39 	// constructor used when cube is created
 40 	Box(double len) {
 41 		width = height = depth = len;
 42 	}
 43 
 44 	// compute and return volume
 45 	double volume() {
 46 		return width * height * depth;
 47 	}
 48 }
 49 
 50 package Chap7;
 51 
 52 /**
 53  *
 54  * @ClassName: OverloadCons2
 55  * @Description:
 56  * @author 刘军/shall_liu (1136808529@qq.com)
 57  * @date 2017年9月15日 上午12:01:21
 58  *
 59  */
 60 class OverloadCons2 {
 61 	public static void main(String args[]) {
 62 		// create boxes using the various constructors
 63 		Box mybox1 = new Box(10, 20, 15);
 64 		Box mybox2 = new Box();
 65 		Box mycube = new Box(7);
 66 
 67 		Box myclone = new Box(mybox1);
 68 
 69 		double vol;
 70 
 71 		// get volume of first box
 72 		vol = mybox1.volume();
 73 		System.out.println("Volume of mybox1 is " + vol);
 74 
 75 		// get volume of second box
 76 		vol = mybox2.volume();
 77 		System.out.println("Volume of mybox2 is " + vol);
 78 
 79 		// get volume of cube
 80 		vol = mycube.volume();
 81 		System.out.println("Volume of cube is " + vol);
 82 
 83 		// get volume of clone
 84 		vol = myclone.volume();
 85 		System.out.println("Volume of clone is " + vol);
 86 	}
 87 }
 88 
 89 
 90 //其运行结果为:
 91 Volume of mybox1 is 3000.0
 92 Volume of mybox2 is -1.0
 93 Volume of cube is 343.0
 94 Volume of clone is 3000.0
 95 
 96 
 97 
View Code


7.3 参数传递的深入分析

image

  1 package Chap7;
  2 
  3 /**
  4  * Objects may be passed to methods.
  5  *
  6  * @ClassName: Test
  7  * @Description:
  8  * @author 刘军/shall_liu (1136808529@qq.com)
  9  * @date 2017年9月14日 下午11:52:55
 10  *
 11  */
 12 // Simple Types are passed by value.
 13 class Test {
 14 	void meth(int i, int j) {
 15 		i *= 2;
 16 		j /= 2;
 17 	}
 18 }
 19 
 20 package Chap7;
 21 
 22 class CallByValue {
 23 	public static void main(String args[]) {
 24 		Test ob = new Test();
 25 		int a = 15, b = 20;
 26 
 27 		System.out.println("a and b before call: " + a + " " + b);
 28 
 29 		ob.meth(a, b);
 30 
 31 		System.out.println("a and b after call: " + a + " " + b);
 32 	}
 33 }
 34 
 35 //其运行结果为:、
 36 a and b before call: 15 20
 37 a and b after call: 15 20
 38 
 39 
View Code

image

image

  1 package Chap7;
  2 
  3 /**
  4  * Objects are passed through their references.
  5  *
  6  * @ClassName: Test
  7  * @Description:
  8  * @author 刘军/shall_liu (1136808529@qq.com)
  9  * @date 2017年9月14日 下午11:52:55
 10  *
 11  */
 12 
 13 class Test {
 14 	int a, b;
 15 
 16 	Test(int i, int j) {
 17 		a = i;
 18 		b = j;
 19 	}
 20 
 21 	// pass an object
 22 	void meth(Test o) {
 23 		o.a *= 2;
 24 		o.b /= 2;
 25 	}
 26 }
 27 
 28 
 29 package Chap7;
 30 
 31 /**
 32  *
 33  * @ClassName: PassObjRef
 34  * @Description:
 35  * @author 刘军/shall_liu (1136808529@qq.com)
 36  * @date 2017年9月15日 上午12:10:14
 37  *
 38  */
 39 class PassObjRef {
 40 	public static void main(String args[]) {
 41 		Test ob = new Test(15, 20);
 42 
 43 		System.out.println("ob.a and ob.b before call: " + ob.a + " " + ob.b);
 44 
 45 		ob.meth(ob);
 46 
 47 		System.out.println("ob.a and ob.b after call: " + ob.a + " " + ob.b);
 48 	}
 49 }
 50 
 51 //其运行结果为;
 52 ob.a and ob.b before call: 15 20
 53 ob.a and ob.b after call: 30 10
 54 
View Code

image


7.4 返回对象

image


  1 package Chap7;
  2 
  3 /**
  4  * Objects are passed through their references.
  5  *
  6  * @ClassName: Test
  7  * @Description:
  8  * @author 刘军/shall_liu (1136808529@qq.com)
  9  * @date 2017年9月14日 下午11:52:55
 10  *
 11  */
 12 
 13 class Test {
 14 	int a, b;
 15 
 16 
 17 	public Test() {
 18 	}
 19 
 20 	Test(int i) {
 21 		a = i;
 22 	}
 23 
 24 	Test(int i, int j) {
 25 		a = i;
 26 		b = j;
 27 	}
 28 
 29 	// pass an object
 30 	void meth(Test o) {
 31 		o.a *= 2;
 32 		o.b /= 2;
 33 	}
 34 
 35 	Test incrByTen() {
 36 		Test temp = new Test(a + 10);
 37 		return temp;
 38 	}
 39 }
 40 
 41 
 42 
 43 package Chap7;
 44 
 45 class RetOb {
 46 	public static void main(String args[]) {
 47 		Test ob1 = new Test(2);
 48 		Test ob2;
 49 
 50 		ob2 = ob1.incrByTen();
 51 		System.out.println("ob1.a: " + ob1.a);
 52 		System.out.println("ob2.a: " + ob2.a);
 53 
 54 		ob2 = ob2.incrByTen();
 55 		System.out.println("ob2.a after second increase: " + ob2.a);
 56 	}
 57 }
 58 
 59 //
 60 ob1.a: 2
 61 ob2.a: 12
 62 ob2.a after second increase: 22
 63 
 64 
 65 
View Code

image



7.5 递归

image

  1 package Chap7;
  2 
  3 //A simple example of recursion.
  4 class Factorial {
  5 	// this is a recusive function
  6 	int fact(int n) {
  7 		int result;
  8 
  9 		if (n == 1)
 10 			return 1;
 11 		result = fact(n - 1) * n;
 12 		return result;
 13 	}
 14 }
 15 
 16 
 17 package Chap7;
 18 
 19 class Recursion {
 20 	public static void main(String args[]) {
 21 		Factorial f = new Factorial();
 22 
 23 		System.out.println("Factorial of 3 is " + f.fact(3));
 24 		System.out.println("Factorial of 4 is " + f.fact(4));
 25 		System.out.println("Factorial of 5 is " + f.fact(5));
 26 	}
 27 }
 28 //
 29 
 30 
 31 Factorial of 3 is 6
 32 Factorial of 4 is 24
 33 Factorial of 5 is 120
 34 
View Code

image
image

  1 package Chap7;
  2 
  3 //Another example that uses recursion.
  4 
  5 class RecTest {
  6 	int values[];
  7 
  8 	RecTest(int i) {
  9 		values = new int[i];
 10 	}
 11 
 12 	// display arrary -- recursively
 13 	void printArray(int i) {
 14 		if (i == 0)
 15 			return;
 16 		else
 17 			printArray(i - 1);
 18 		System.out.println("[" + (i - 1) + "] " + values[i - 1]);
 19 	}
 20 }
 21 
 22 package Chap7;
 23 
 24 class Recursion2 {
 25 	public static void main(String args[]) {
 26 		RecTest ob = new RecTest(10);
 27 		int i;
 28 
 29 		for (i = 0; i < 10; i++)
 30 			ob.values[i] = i;
 31 
 32 		ob.printArray(10);
 33 	}
 34 }
 35 
 36 //
 37 [0] 0
 38 [1] 1
 39 [2] 2
 40 [3] 3
 41 [4] 4
 42 [5] 5
 43 [6] 6
 44 [7] 7
 45 [8] 8
 46 [9] 9
 47 
 48 
View Code


7.6 访问控制

image

image

  1 package Chap7;
  2 
  3 /* This program demonstrates the difference between
  4 public and private.
  5 */
  6 class Test {
  7 	int a; // default access
  8 	public int b; // public access
  9 	private int c; // private access
 10 
 11 	// methods to access c
 12 	void setc(int i) { // set c's value
 13 		c = i;
 14 	}
 15 
 16 	int getc() { // get c's value
 17 		return c;
 18 	}
 19 }
 20 
 21 
 22 package Chap7;
 23 
 24 class AccessTest {
 25 	public static void main(String args[]) {
 26 		Test ob = new Test();
 27 
 28 		// These are OK, a and b may be accessed directly
 29 		ob.a = 10;
 30 		ob.b = 20;
 31 
 32 		// This is not OK and will cause an error
 33 		// ob.c = 100; // Error!
 34 
 35 		// You must access c through its methods
 36 		ob.setc(100); // OK
 37 
 38 		System.out.println("a, b, and c: " + ob.a + " " + ob.b + " " + ob.getc());
 39 	}
 40 }
 41 //
 42 
 43 a, b, and c: 10 20 100
 44 
 45 
 46 
View Code

image

image

  1 package Chap7;
  2 
  3 //This class defines an integer stack that can hold 10 values. 
  4 class Stack {
  5 	/*
  6 	 * Now, both stck and tos are private. This means that they cannot be
  7 	 * accidentally or maliciously altered in a way that would be harmful to the
  8 	 * stack.
  9 	 */
 10 	private int stck[] = new int[10];
 11 	private int tos;
 12 
 13 	// Initialize top-of-stack
 14 	Stack() {
 15 		tos = -1;
 16 	}
 17 
 18 	// Push an item onto the stack
 19 	void push(int item) {
 20 		if (tos == 9)
 21 			System.out.println("Stack is full.");
 22 		else
 23 			stck[++tos] = item;
 24 	}
 25 
 26 	// Pop an item from the stack
 27 	int pop() {
 28 		if (tos < 0) {
 29 			System.out.println("Stack underflow.");
 30 			return 0;
 31 		} else
 32 			return stck[tos--];
 33 	}
 34 }
 35 
View Code

image

  1 class TestStack {
  2   public static void main(String args[]) {
  3     Stack mystack1 = new Stack();
  4     Stack mystack2 = new Stack();
  5 
  6     // push some numbers onto the stack
  7     for(int i=0; i<10; i++) mystack1.push(i);
  8     for(int i=10; i<20; i++) mystack2.push(i);
  9 
 10     // pop those numbers off the stack
 11     System.out.println("Stack in mystack1:");
 12     for(int i=0; i<10; i++)
 13        System.out.println(mystack1.pop());
 14 
 15     System.out.println("Stack in mystack2:");
 16     for(int i=0; i<10; i++)
 17        System.out.println(mystack2.pop());
 18 
 19     // these statements are not legal
 20     // mystack1.tos = -2;
 21     // mystack2.stck[3] = 100; 
 22   }
 23 }
View Code

image

7.7 理解st

image

image

  1 // Demonstrate static variables, methods, and blocks.
  2 class UseStatic {
  3   static int a = 3;
  4   static int b;
  5 
  6   static void meth(int x) {
  7     System.out.println("x = " + x);
  8     System.out.println("a = " + a);
  9     System.out.println("b = " + b);
 10   }
 11 
 12   static {
 13     System.out.println("Static block initialized.");
 14     b = a * 4;
 15   }
 16 
 17   public static void main(String args[]) {
 18     meth(42);
 19   }
 20 }
View Code

image

image

  1 class StaticDemo {
  2   static int a = 42;
  3   static int b = 99;
  4   static void callme() {
  5     System.out.println("a = " + a);
  6   }
  7 }
  8 
  9 class StaticByName {
 10   public static void main(String args[]) {
 11     StaticDemo.callme();
 12     System.out.println("b = " + StaticDemo.b);
 13   }
 14 }
 15 
View Code

image

7.8 final介绍

image

7.9 重新审视数组

image

  1 // This program demonstrates the length array member.
  2 class Length {
  3   public static void main(String args[]) {
  4     int a1[] = new int[10];
  5     int a2[] = {3, 5, 7, 1, 8, 99, 44, -10};
  6     int a3[] = {4, 3, 2, 1};
  7 
  8     System.out.println("length of a1 is " + a1.length);
  9     System.out.println("length of a2 is " + a2.length);
 10     System.out.println("length of a3 is " + a3.length);
 11   }
 12 }
 13 
View Code

image

  1 // Improved Stack class that uses the length array member.
  2 class Stack {
  3   private int stck[];
  4   private int tos;
  5 
  6   // allocate and initialize stack
  7   Stack(int size) {
  8     stck = new int[size];
  9     tos = -1;
 10   }
 11 
 12   // Push an item onto the stack
 13   void push(int item) {
 14     if(tos==stck.length-1) // use length member 
 15       System.out.println("Stack is full.");
 16     else
 17       stck[++tos] = item;
 18   }
 19 
 20   // Pop an item from the stack
 21   int pop() {
 22     if(tos < 0) {
 23       System.out.println("Stack underflow.");
 24       return 0;
 25     }
 26     else
 27       return stck[tos--];
 28   }
 29 }
View Code
  1 class TestStack2 {
  2   public static void main(String args[]) {
  3     Stack mystack1 = new Stack(5);
  4     Stack mystack2 = new Stack(8);
  5 
  6     // push some numbers onto the stack
  7     for(int i=0; i<5; i++) mystack1.push(i);
  8     for(int i=0; i<8; i++) mystack2.push(i);
  9 
 10     // pop those numbers off the stack
 11     System.out.println("Stack in mystack1:");
 12     for(int i=0; i<5; i++)
 13        System.out.println(mystack1.pop());
 14 
 15     System.out.println("Stack in mystack2:");
 16     for(int i=0; i<8; i++)
 17        System.out.println(mystack2.pop());
 18   }
 19 }
View Code

image

7.10 嵌套类和内部类

image

  1 // Demonstrate an inner class.
  2 class Outer {
  3   int outer_x = 100;
  4 
  5   void test() {
  6     Inner inner = new Inner();
  7     inner.display();
  8   }
  9 
 10   // this is an innner class
 11   class Inner {
 12     void display() {
 13       System.out.println("display: outer_x = " + outer_x);
 14     }
 15   }
 16 }
 17 
 18 class InnerClassDemo {
 19   public static void main(String args[]) {
 20     Outer outer = new Outer();
 21     outer.test();
 22   }
 23 }
 24 
View Code

image

  1 // This program will not compile.
  2 class Outer {
  3   int outer_x = 100;
  4 
  5   void test() {
  6     Inner inner = new Inner();
  7     inner.display();
  8   }
  9 
 10   // this is an innner class
 11   class Inner {
 12     int y = 10; // y is local to Inner
 13     void display() {
 14       System.out.println("display: outer_x = " + outer_x);
 15     }
 16   }
 17 
 18   void showy() {
 19     System.out.println(y); // error, y not known here!
 20   }
 21 }
 22 
 23 class InnerClassDemo {
 24   public static void main(String args[]) {
 25     Outer outer = new Outer();
 26     outer.test();
 27   }
 28 }
 29 
View Code

image


  1 
  2 // Define an inner class within a for loop.
  3 class Outer {
  4   int outer_x = 100;
  5 
  6   void test() {
  7     for(int i=0; i<10; i++) {
  8       class Inner {
  9         void display() {
 10           System.out.println("display: outer_x = " + outer_x);
 11         }
 12       }
 13       Inner inner = new Inner();
 14       inner.display();
 15     }
 16   }
 17 }
 18 
 19 class InnerClassDemo {
 20   public static void main(String args[]) {
 21     Outer outer = new Outer();
 22     outer.test();
 23   }
 24 }
 25 

image

image

7.11 String类介绍

image

image

image


  1 // Demonstrating Strings.
  2 class StringDemo {
  3   public static void main(String args[]) {
  4     String strOb1 = "First String";
  5     String strOb2 = "Second String";
  6     String strOb3 = strOb1 + " and " + strOb2;
  7 
  8     System.out.println(strOb1);
  9     System.out.println(strOb2);
 10     System.out.println(strOb3);
 11   }
 12 }

image

image

  1 // Demonstrating some String methods.
  2 class StringDemo2 {
  3   public static void main(String args[]) {
  4     String strOb1 = "First String";
  5     String strOb2 = "Second String";
  6     String strOb3 = strOb1;
  7 
  8     System.out.println("Length of strOb1: " +    strOb1.length());
  9 
 10     System.out.println("Char at index 3 in strOb1: " + strOb1.charAt(3));
 11 
 12     if(strOb1.equals(strOb2)) {
 13       System.out.println("strOb1 == strOb2");
 14     }else{
 15       System.out.println("strOb1 != strOb2");
 16     }
 17 
 18     if(strOb1.equals(strOb3)) {
 19       System.out.println("strOb1 == strOb3");}
 20     else{
 21       System.out.println("strOb1 != strOb3");}
 22   }
 23 }
 24 

image

  1 // Demonstrate String arrays.
  2 class StringDemo3 {
  3   public static void main(String args[]) {
  4     String str[] = { "one", "two", "three" };
  5 
  6     for(int i=0; i<str.length; i++)
  7       System.out.println("str[" + i + "]: " + str[i]);
  8   }
  9 }
 10 

image

7.12 使用命令行参数

image

  1 class CommandLine {
  2   public static void main(String args[]) {
  3     for(int i=0; i<args.length; i++)
  4       System.out.println("args[" + i + "]: " +   args[i]);
  5   }
  6 }
  7 

image


7.13 varargs:可变长度参数

image

  1 // Use an array to pass a variable number of 
  2 // arguments to a method. 
  3 class PassArray {
  4   static void vaTest(int v[]) {
  5     System.out.print("Number of args: " + v.length +  " Contents: ");
  6 
  7     for(int x : v){
  8       System.out.print(x + " ");
  9     }
 10     System.out.println();
 11   }
 12 
 13   public static void main(String args[])
 14   {
 15     // Notice how an array must be created to 
 16     // hold the arguments. 
 17     int n1[] = { 10 };
 18     int n2[] = { 1, 2, 3 };
 19     int n3[] = { };
 20 
 21     vaTest(n1); // 1 arg 
 22     vaTest(n2); // 3 args 
 23     vaTest(n3); // no args 
 24   }
 25 }

image

  1 // Demonstrate variable-length arguments. 
  2 class VarArgs {
  3 
  4   // vaTest() now uses a vararg. 
  5   static void vaTest(int ... v) {
  6     System.out.print("Number of args: " + v.length +  " Contents: ");
  7 
  8     for(int x : v) {
  9       System.out.print(x + " ");
 10     }
 11     System.out.println();
 12   }
 13 
 14   public static void main(String args[])
 15   {
 16 
 17     // Notice how vaTest() can be called with a 
 18     // variable number of arguments. 
 19     vaTest(10);      // 1 arg 
 20     vaTest(1, 2, 3); // 3 args 
 21     vaTest();        // no args 
 22   }
 23 }
 24 

image

image

  1 // Use varargs with standard arguments. 
  2 class VarArgs2 {
  3 
  4   // Here, msg is a normal parameter and v is a 
  5   // varargs parameter. 
  6   static void vaTest(String msg, int ... v) {
  7     System.out.print(msg + v.length +
  8                         " Contents: ");
  9 
 10     for(int x : v) {
 11       System.out.print(x + " ");
 12      }
 13 
 14     System.out.println();
 15   }
 16 
 17   public static void main(String args[])
 18   {
 19     vaTest("One vararg: ", 10);
 20     vaTest("Three varargs: ", 1, 2, 3);
 21     vaTest("No varargs: ");
 22   }
 23 }
 24 

image

7.13.1 重载varargs方法

image

  1 // Varargs and overloading. 
  2 class VarArgs3 {
  3 
  4   static void vaTest(int ... v) {
  5     System.out.print("vaTest(int ...): " +  "Number of args: " + v.length +  " Contents: ");
  6 
  7     for(int x : v) {
  8       System.out.print(x + " ");
  9     }
 10     System.out.println();
 11   }
 12 
 13   static void vaTest(boolean ... v) {
 14     System.out.print("vaTest(boolean ...) " +  "Number of args: " + v.length +  " Contents: ");
 15 
 16     for(boolean x : v) {
 17       System.out.print(x + " ");
 18     }
 19     System.out.println();
 20   }
 21 
 22   static void vaTest(String msg, int ... v) {
 23     System.out.print("vaTest(String, int ...): " +  msg + v.length +  " Contents: ");
 24 
 25     for(int x : v) {
 26       System.out.print(x + " ");
 27      }
 28     System.out.println();
 29   }
 30 
 31   public static void main(String args[])
 32   {
 33     vaTest(1, 2, 3);
 34     vaTest("Testing: ", 10, 20);
 35     vaTest(true, false, false);
 36 

image

7.13.2 varargs方法与模糊性

image

  1 // Varargs, overloading, and ambiguity. 
  2 // 
  3 // This program contains an error and will 
  4 // not compile! 
  5 class VarArgs4 {
  6 
  7   static void vaTest(int ... v) {
  8     System.out.print("vaTest(Integer ...): " +  "Number of args: " + v.length +  " Contents: ");
  9 
 10     for(int x : v) {
 11       System.out.print(x + " ");
 12     }
 13     System.out.println();
 14   }
 15 
 16   static void vaTest(boolean ... v) {
 17     System.out.print("vaTest(boolean ...) " +  "Number of args: " + v.length +  " Contents: ");
 18 
 19     for(boolean x : v) {
 20       System.out.print(x + " ");
 21    }
 22     System.out.println();
 23   }
 24 
 25 
 26   public static void main(String args[])
 27   {
 28     vaTest(1, 2, 3);  // OK 
 29     vaTest(true, false, false); // OK 
 30 
 31     vaTest(); // Error: Ambiguous! 
 32   }
 33 }

image

image


第8章 继承

image

8.1 继承的基础知识

image

image

  1 // A simple example of inheritance.
  2 
  3 // Create a superclass.
  4 class A {
  5   int i, j;
  6 
  7   void showij() {
  8     System.out.println("i and j: " + i + " " + j);
  9   }
 10 }
 11 
 12 // Create a subclass by extending class A.
 13 class B extends A {
 14   int k;
 15 
 16   void showk() {
 17     System.out.println("k: " + k);
 18   }
 19   void sum() {
 20     System.out.println("i+j+k: " + (i+j+k));
 21   }
 22 }
 23 
 24 class SimpleInheritance {
 25   public static void main(String args[]) {
 26     A superOb = new A();
 27     B subOb = new B();
 28 
 29     // The superclass may be used by itself.
 30     superOb.i = 10;
 31     superOb.j = 20;
 32     System.out.println("Contents of superOb: ");
 33     superOb.showij();
 34     System.out.println();
 35 
 36     /* The subclass has access to all public members of
 37        its superclass. */
 38     subOb.i = 7;
 39     subOb.j = 8;
 40     subOb.k = 9;
 41     System.out.println("Contents of subOb: ");
 42     subOb.showij();
 43     subOb.showk();
 44     System.out.println();
 45 
 46     System.out.println("Sum of i, j and k in subOb:");
 47     subOb.sum();
 48   }
 49 }
 50 

image

image


8.1.1 成员访问与继承

image

  1 /* In a class hierarchy, private members remain
  2    private to their class.
  3 
  4    This program contains an error and will not
  5    compile.
  6 */
  7 
  8 // Create a superclass.
  9 class A {
 10   int i; // public be default
 11   private int j; // private to A
 12 
 13   void setij(int x, int y) {
 14     i = x;
 15     j = y;
 16   }
 17 }
 18 
 19 // A's j is not accessible here.
 20 class B extends A {
 21   int total;
 22 
 23   void sum() {
 24     total = i + j; // ERROR, j is not accessible here
 25   }
 26 }
 27 
 28 class Access {
 29   public static void main(String args[]) {
 30     B subOb = new B();
 31 
 32     subOb.setij(10, 12);
 33 
 34     subOb.sum();
 35     System.out.println("Total is " + subOb.total);
 36   }
 37 }
 38 

image

8.1.2 一个更实际的例子

image

  1 // This program uses inheritance to extend Box.
  2 class Box {
  3   double width;
  4   double height;
  5   double depth;
  6 
  7   // construct clone of an object
  8   Box(Box ob) { // pass object to constructor
  9     width = ob.width;
 10     height = ob.height;
 11     depth = ob.depth;
 12   }
 13 
 14   // constructor used when all dimensions specified
 15   Box(double w, double h, double d) {
 16     width = w;
 17     height = h;
 18     depth = d;
 19   }
 20 
 21   // constructor used when no dimensions specified
 22   Box() {
 23     width = -1;  // use -1 to indicate
 24     height = -1; // an uninitialized
 25     depth = -1;  // box
 26   }
 27 
 28   // constructor used when cube is created
 29   Box(double len) {
 30     width = height = depth = len;
 31   }
 32 
 33   // compute and return volume
 34   double volume() {
 35     return width * height * depth;
 36   }
 37 }
 38 
 39 // Here, Box is extened to include weight.
 40 class BoxWeight extends Box {
 41   double weight; // weight of box
 42 
 43   // constructor for BoxWeight
 44   BoxWeight(double w, double h, double d, double m) {
 45     width = w;
 46     height = h;
 47     depth = d;
 48     weight = m;
 49   }
 50 }
 51 
 52 class DemoBoxWeight {
 53   public static void main(String args[]) {
 54     BoxWeight mybox1 = new BoxWeight(10, 20, 15, 34.3);
 55     BoxWeight mybox2 = new BoxWeight(2, 3, 4, 0.076);
 56     double vol;
 57 
 58     vol = mybox1.volume();
 59     System.out.println("Volume of mybox1 is " + vol);
 60     System.out.println("Weight of mybox1 is " + mybox1.weight);
 61     System.out.println();
 62 
 63     vol = mybox2.volume();
 64     System.out.println("Volume of mybox2 is " + vol);
 65     System.out.println("Weight of mybox2 is " + mybox2.weight);
 66   }
 67 }
 68 

image

  1 // Here, Box is extended to include color.
  2 class ColorBox extends Box {
  3   int color; // color of box
  4 
  5   ColorBox(double w, double h, double d, int c) {
  6     width = w;
  7     height = h;
  8     depth = d;
  9     color = c;
 10   }
 11 }
 12 

image

8.1.3 超类变量可以引用子类对象

image

  1 class RefDemo {
  2   public static void main(String args[]) {
  3     BoxWeight weightbox = new BoxWeight(3, 5, 7, 8.37);
  4     Box plainbox = new Box();
  5     double vol;
  6 
  7     vol = weightbox.volume();
  8     System.out.println("Volume of weightbox is " + vol);
  9     System.out.println("Weight of weightbox is " + weightbox.weight);
 10     System.out.println();
 11 
 12     // assign BoxWeight reference to Box reference
 13     plainbox = weightbox;
 14 
 15     vol = plainbox.volume(); // OK, volume() defined in Box
 16     System.out.println("Volume of plainbox is " + vol);
 17 
 18     /* The following statement is invalid because plainbox
 19        does not define a weight member. */
 20 //  System.out.println("Weight of plainbox is " + plainbox.weight);
 21   }
 22 }

image

8.2 使用super关键字

image

8.2.1 使用super调用超类的构造函数

image

image

  1 // BoxWeight now uses super to initialize its Box attributes.
  2 class BoxWeight extends Box {
  3   double weight; // weight of box
  4 
  5   // initialize width, height, and depth using super()
  6   BoxWeight(double w, double h, double d, double m) {
  7     super(w, h, d); // call superclass constructor
  8     weight = m;
  9   }
 10 }

image

  1  // A complete implementation of BoxWeight.
  2 class Box {
  3   private double width;
  4   private double height;
  5   private double depth;
  6 
  7   // construct clone of an object
  8   Box(Box ob) { // pass object to constructor
  9     width double h, double d) {
 10     width = w;
 11     height = h;
 12     depth = d;
 13   }
 14 
 15   // constructor used when no dimensions specified
 16   Box() {
 17     width = -1;  // use -1 to indicate
 18     height = -1; // an uninitialized
 19     depth = -1;  // box
 20   }
 21  = ob.width;
 22     height = ob.height;
 23     depth = ob.depth;
 24   }
 25 
 26   // constructor used when all dimensions specified
 27   Box(double w,
 28   // constructor used when cube is created
 29   Box(double len) {
 30     width = height = depth = len;
 31   }
 32 
 33   // compute and return volume
 34   double volume() {
 35     return width * height * depth;
 36   }
 37 }
 38 
 39 // BoxWeight now fully implements all constructors.
 40 class BoxWeight extends Box {
 41   double weight; // weight of box
 42 
 43   // construct clone of an object
 44   BoxWeight(BoxWeight ob) { // pass object to constructor
 45     super(ob);
 46     weight = ob.weight;
 47   }
 48 
 49   // constructor when all parameters are specified
 50   BoxWeight(double w, double h, double d, double m) {
 51     super(w, h, d); // call superclass constructor
 52     weight = m;
 53   }
 54 
 55   // default constructor
 56   BoxWeight() {
 57     super();
 58     weight = -1;
 59   }
 60 
 61   // constructor used when cube is created
 62   BoxWeight(double len, double m) {
 63     super(len);
 64     weight = m;
 65   }
 66 }
 67 
 68 class DemoSuper {
 69   public static void main(String args[]) {
 70     BoxWeight mybox1 = new BoxWeight(10, 20, 15, 34.3);
 71     BoxWeight mybox2 = new BoxWeight(2, 3, 4, 0.076);
 72     BoxWeight mybox3 = new BoxWeight(); // default
 73     BoxWeight mycube = new BoxWeight(3, 2);
 74     BoxWeight myclone = new BoxWeight(mybox1);
 75     double vol;
 76 
 77     vol = mybox1.volume();
 78     System.out.println("Volume of mybox1 is " + vol);
 79     System.out.println("Weight of mybox1 is " + mybox1.weight);
 80     System.out.println();
 81 
 82     vol = mybox2.volume();
 83     System.out.println("Volume of mybox2 is " + vol);
 84     System.out.println("Weight of mybox2 is " + mybox2.weight);
 85     System.out.println();
 86 
 87     vol = mybox3.volume();
 88     System.out.println("Volume of mybox3 is " + vol);
 89     System.out.println("Weight of mybox3 is " + mybox3.weight);
 90     System.out.println();
 91 
 92     vol = myclone.volume();
 93     System.out.println("Volume of myclone is " + vol);
 94     System.out.println("Weight of myclone is " + myclone.weight);
 95     System.out.println();
 96 
 97     vol = mycube.volume();
 98     System.out.println("Volume of mycube is " + vol);
 99     System.out.println("Weight of mycube is " + mycube.weight);
100     System.out.println();
101   }
102 }
103 

image

  1 // construct clone of an object
  2 BoxWeight(BoxWeight ob) { // pass object to constructor
  3   super(ob);
  4   weight = ob.weight;
  5 }
  6 

image

8.2.2 super的另一种用法

image

  1 // Using super to overcome name hiding.
  2 class A {
  3   int i;
  4 }
  5 
  6 // Create a subclass by extending class A.
  7 class B extends A {
  8   int i; // this i hides the i in A
  9 
 10   B(int a, int b) {
 11     super.i = a; // i in A
 12     i = b; // i in B
 13   }
 14 
 15   void show() {
 16     System.out.println("i in superclass: " + super.i);
 17     System.out.println("i in subclass: " + i);
 18   }
 19 }
 20 
 21 class UseSuper {
 22   public static void main(String args[]) {
 23     B subOb = new B(1, 2);
 24 
 25     subOb.show();
 26   }
 27 }
 28 

image


8.3 创建多级继承层次

image

  1 // Extend BoxWeight to include shipping costs.
  2 
  3 // Start with Box.
  4 class Box {
  5   private double width;
  6   private double height;
  7   private double depth;
  8 
  9   // construct clone of an object
 10   Box(Box ob) { // pass object to constructor
 11     width = ob.width;
 12     height = ob.height;
 13     depth = ob.depth;
 14   }
 15 
 16   // constructor used when all dimensions specified
 17   Box(double w, double h, double d) {
 18     width = w;
 19     height = h;
 20     depth = d;
 21   }
 22 
 23   // constructor used when no dimensions specified
 24   Box() {
 25     width = -1;  // use -1 to indicate
 26     height = -1; // an uninitialized
 27     depth = -1;  // box
 28   }
 29 
 30   // constructor used when cube is created
 31   Box(double len) {
 32     width = height = depth = len;
 33   }
 34 
 35   // compute and return volume
 36   double volume() {
 37     return width * height * depth;
 38   }
 39 }
 40 
 41 // Add weight.
 42 class BoxWeight extends Box {
 43   double weight; // weight of box
 44 
 45   // construct clone of an object
 46   BoxWeight(BoxWeight ob) { // pass object to constructor
 47     super(ob);
 48     weight = ob.weight;
 49   }
 50 
 51   // constructor when all parameters are specified
 52   BoxWeight(double w, double h, double d, double m) {
 53     super(w, h, d); // call superclass constructor
 54     weight = m;
 55   }
 56 
 57   // default constructor
 58   BoxWeight() {
 59     super();
 60     weight = -1;
 61   }
 62 
 63   // constructor used when cube is created
 64   BoxWeight(double len, double m) {
 65     super(len);
 66     weight = m;
 67   }
 68 }
 69 
 70 // Add shipping costs
 71 class Shipment extends BoxWeight {
 72   double cost;
 73 
 74   // construct clone of an object
 75   Shipment(Shipment ob) { // pass object to constructor
 76     super(ob);
 77     cost = ob.cost;
 78   }
 79 
 80   // constructor when all parameters are specified
 81   Shipment(double w, double h, double d,
 82             double m, double c) {
 83     super(w, h, d, m); // call superclass constructor
 84     cost = c;
 85   }
 86 
 87   // default constructor
 88   Shipment() {
 89     super();
 90     cost = -1;
 91   }
 92 
 93   // constructor used when cube is created
 94   Shipment(double len, double m, double c) {
 95     super(len, m);
 96     cost = c;
 97   }
 98 }
 99 
100 class DemoShipment {
101   public static void main(String args[]) {
102     Shipment shipment1 =
103                new Shipment(10, 20, 15, 10, 3.41);
104     Shipment shipment2 =
105                new Shipment(2, 3, 4, 0.76, 1.28);
106 
107     double vol;
108 
109     vol = shipment1.volume();
110     System.out.println("Volume of shipment1 is " + vol);
111     System.out.println("Weight of shipment1 is "
112 

image

8.4 构造函数的调用时机

image

  1 // Demonstrate when constructors are called.
  2 
  3 // Create a super class.
  4 class A {
  5   A() {
  6     System.out.println("Inside A's constructor.");
  7   }
  8 }
  9 
 10 // Create a subclass by extending class A.
 11 class B extends A {
 12   B() {
 13     System.out.println("Inside B's constructor.");
 14   }
 15 }
 16 
 17 // Create another subclass by extending B.
 18 class C extends B {
 19   C() {
 20     System.out.println("Inside C's constructor.");
 21   }
 22 }
 23 
 24 class CallingCons {
 25   public static void main(String args[]) {
 26     C c = new C();
 27   }
 28 }
 29 

image

8.5 方法重写

image

  1 // Method overriding.
  2 class A {
  3   int i, j;
  4 
  5   A(int a, int b) {
  6     i = a;
  7     j = b;
  8   }
  9 
 10   // display i and j
 11   void show() {
 12     System.out.println("i and j: " + i + " " + j);
 13   }
 14 }
 15 
 16 class B extends A {
 17   int k;
 18 
 19   B(int a, int b, int c) {
 20     super(a, b);
 21     k = c;
 22   }
 23 
 24   // display k -- this overrides show() in A
 25   void show() {
 26     System.out.println("k: " + k);
 27   }
 28 }
 29 
 30 class Override {
 31   public static void main(String args[]) {
 32     B subOb = new B(1, 2, 3);
 33 
 34     subOb.show(); // this calls show() in B
 35   }
 36 }
 37 

image

  1 class B extends A {
  2   int k;
  3 
  4   B(int a, int b, int c) {
  5     super(a, b);
  6     k = c;
  7   }
  8 
  9   void show() {
 10     super.show(); // this calls A's show()
 11     System.out.println("k: " + k);
 12   }
 13 }
 14 

image

image

  1 // Methods with differing type signatures are overloaded -- not overridden.
  2 class A {
  3   int i, j;
  4 
  5   A(int a, int b) {
  6     i = a;
  7     j = b;
  8   }
  9 
 10   // display i and j
 11   void show() {
 12     System.out.println("i and j: " + i + " " + j);
 13   }
 14 }
 15 
 16 // Create a subclass by extending class A.
 17 class B extends A {
 18   int k;
 19 
 20   B(int a, int b, int c) {
 21     super(a, b);
 22     k = c;
 23   }
 24 
 25   // overload show()
 26   void show(String msg) {
 27     System.out.println(msg + k);
 28   }
 29 }
 30 
 31 class Override {
 32   public static void main(String args[]) {
 33     B subOb = new B(1, 2, 3);
 34 
 35     subOb.show("This is k: "); // this calls show() in B
 36     subOb.show(); // this calls show() in A
 37   }
 38 }
 39 

imageimage

8.6 动态方法调度

image

  1 // Dynamic Method Dispatch
  2 class A {
  3    void callme() {
  4      System.out.println("Inside A's callme method");
  5   }
  6 }
  7 
  8 class B extends A {
  9   // override callme()
 10   void callme() {
 11     System.out.println("Inside B's callme method");
 12   }
 13 }
 14 
 15 class C extends A {
 16   // override callme()
 17   void callme() {
 18     System.out.println("Inside C's callme method");
 19   }
 20 }
 21 
 22 class Dispatch {
 23   public static void main(String args[]) {
 24     A a = new A(); // object of type A
 25     B b = new B(); // object of type B
 26     C c = new C(); // object of type C
 27     A r; // obtain a reference of type A    
 28 
 29     r = a; // r refers to an A object
 30     r.callme(); // calls A's version of callme
 31 
 32     r = b; // r refers to a B object
 33     r.callme(); // calls B's version of callme
 34 
 35     r = c; // r refers to a C object
 36     r.callme(); // calls C's version of callme
 37   }
 38 }
 39 

image


8.6.1 重写方法的目的

image

8.6.2 应用方法重写

image

  1 // Using run-time polymorphism.
  2 class Figure {
  3   double dim1;
  4   double dim2;
  5 
  6   Figure(double a, double b) {
  7     dim1 = a;
  8     dim2 = b;
  9   }
 10 
 11   double area() {
 12     System.out.println("Area for Figure is undefined.");
 13     return 0;
 14   }
 15 }
 16 
 17 class Rectangle extends Figure {
 18   Rectangle(double a, double b) {
 19     super(a, b);
 20   }
 21 
 22   // override area for rectangle
 23   double area() {
 24     System.out.println("Inside Area for Rectangle.");
 25     return dim1 * dim2;
 26   }
 27 }
 28 
 29 class Triangle extends Figure {
 30   Triangle(double a, double b) {
 31     super(a, b);
 32   }
 33 
 34   // override area for right triangle
 35   double area() {
 36     System.out.println("Inside Area for Triangle.");
 37     return dim1 * dim2 / 2;
 38   }
 39 }
 40 
 41 class FindAreas {
 42   public static void main(String args[]) {
 43     Figure f = new Figure(10, 10);
 44     Rectangle r = new Rectangle(9, 5);
 45     Triangle t = new Triangle(10, 8);
 46 
 47     Figure figref;
 48 
 49     figref = r;
 50     System.out.println("Area is " + figref.area());
 51 
 52     figref = t;
 53     System.out.println("Area is " + figref.area());
 54 
 55     figref = f;
 56     System.out.println("Area is " + figref.area());
 57   }
 58 }
 59 

image




8.7 使用抽象类

image

image

  1 // A Simple demonstration of abstract.
  2 abstract class A {
  3   abstract void callme();
  4 
  5   // concrete methods are still allowed in abstract classes
  6   void callmetoo() {
  7     System.out.println("This is a concrete method.");
  8   }
  9 }
 10 
 11 class B extends A {
 12   void callme() {
 13     System.out.println("B's implementation of callme.");
 14   }
 15 }
 16 
 17 class AbstractDemo {
 18   public static void main(String args[]) {
 19     B b = new B();
 20 
 21     b.callme();
 22     b.callmetoo();
 23   }
 24 }

image

image

  1 // Using abstract methods and classes.
  2 abstract class Figure {
  3   double dim1;
  4   double dim2;
  5 
  6   Figure(double a, double b) {
  7     dim1 = a;
  8     dim2 = b;
  9   }
 10 
 11   // area is now an an abstract method 
 12   abstract double area();
 13 }
 14 
 15 class Rectangle extends Figure {
 16   Rectangle(double a, double b) {
 17     super(a, b);
 18   }
 19 
 20   // override area for rectangle
 21   double area() {
 22     System.out.println("Inside Area for Rectangle.");
 23     return dim1 * dim2;
 24   }
 25 }
 26 
 27 class Triangle extends Figure {
 28   Triangle(double a, double b) {
 29     super(a, b);
 30   }
 31 
 32   // override area for right triangle
 33   double area() {
 34     System.out.println("Inside Area for Triangle.");
 35     return dim1 * dim2 / 2;
 36   }
 37 }
 38 
 39 class AbstractAreas {
 40   public static void main(String args[]) {
 41   // Figure f = new Figure(10, 10); // illegal now
 42     Rectangle r = new Rectangle(9, 5);
 43     Triangle t = new Triangle(10, 8);
 44 
 45     Figure figref; // this is OK, no object is created
 46 
 47     figref = r;
 48     System.out.println("Area is " + figref.area());
 49 
 50     figref = t;
 51     System.out.println("Area is " + figref.area());
 52   }
 53 }


image


8.8 在继承中使用final关键字


8.8.1 使用final关键字阻止重写

image

  1 class A {
  2   final void meth() {
  3     System.out.println("This is a final method.");
  4   }
  5 }
  6 
  7 class B extends A {
  8   void meth() { // ERROR! Can't override.
  9     System.out.println("Illegal!");
 10   }
 11 }
 12 

image

8.8.2 使用final关键字阻止继承

image

  1 final class A {
  2   // ...
  3 }
  4 
  5 // The following class is illegal.
  6 class B extends A { // ERROR! Can't subclass A
  7   // ...
  8 }

image


8.9 Object类

image

      image



第9章 包和接口

image


9.1 包

image

9.1.1 定义包

image


image

image

9.1.2 包查找与CLASSPATH

image


image


9.1.3 一个简短的包示例

  1 // A simple package
  2 package MyPack;
  3 
  4 class Balance {
  5   String name;
  6   double bal;
  7 
  8   Balance(String n, double b) {
  9     name = n;
 10     bal = b;
 11   }
 12 
 13   void show() {
 14     if(bal<0)
 15       System.out.print("-->> ");
 16     System.out.println(name + ": $" + bal);
 17   }
 18 }
 19 
 20 class AccountBalance {
 21   public static void main(String args[]) {
 22     Balance current[] = new Balance[3];
 23 
 24     current[0] = new Balance("K. J. Fielding", 123.23);
 25     current[1] = new Balance("Will Tell", 157.02);
 26     current[2] = new Balance("Tom Jackson", -12.33);
 27 
 28     for(int i=0; i<3; i++) current[i].show();
 29   }
 30 }

image



9.2 访问保护

imageimageimage


  1 package p1;
  2 
  3 public class Protection {
  4   int n = 1;
  5   private int n_pri = 2;
  6   protected int n_pro = 3;
  7   public int n_pub = 4;
  8 
  9   public Protection() {
 10     System.out.println("base constructor");
 11     System.out.println("n = " + n);
 12     System.out.println("n_pri = " + n_pri);
 13     System.out.println("n_pro = " + n_pro);
 14     System.out.println("n_pub = " + n_pub);
 15   }
 16 }
 17 
 18 class Derived extends Protection {
 19   Derived() {
 20     System.out.println("derived constructor");
 21     System.out.println("n = " + n);
 22 
 23 //  class only
 24 //  System.out.println("n_pri = " + n_pri);
 25 
 26     System.out.println("n_pro = " + n_pro);
 27     System.out.println("n_pub = " + n_pub);
 28   }
 29 }
 30 
 31 class SamePackage {
 32   SamePackage() {
 33     Protection p = new Protection();
 34     System.out.println("same package constructor");
 35     System.out.println("n = " + p.n);
 36 
 37 //  class only
 38 //  System.out.println("n_pri = " + p.n_pri);
 39 
 40     System.out.println("n_pro = " + p.n_pro);
 41     System.out.println("n_pub = " + p.n_pub);
 42   }
 43 }
 44 

image

  1 package p2;
  2 
  3 class Protection2 extends p1.Protection {
  4   Protection2() {
  5     System.out.println("derived other package constructor");
  6 
  7 //  class or package only
  8 //  System.out.println("n = " + n);
  9 
 10 //  class only
 11 //  System.out.println("n_pri = " + n_pri);
 12 
 13     System.out.println("n_pro = " + n_pro);
 14     System.out.println("n_pub = " + n_pub);
 15   }
 16 }
 17 
 18 class OtherPackage {
 19   OtherPackage() {
 20     p1.Protection p = new p1.Protection();
 21     System.out.println("other package constructor");
 22 
 23 //  class or package only
 24 //  System.out.println("n = " + p.n);
 25 
 26 //  class only
 27 //  System.out.println("n_pri = " + p.n_pri);
 28 
 29 //  class, subclass or package only
 30 //  System.out.println("n_pro = " + p.n_pro);
 31 
 32     System.out.println("n_pub = " + p.n_pub);
 33   }
 34 }

image

  1 // Demo package p1.
  2 package p1;
  3 
  4 // Instantiate the various classes in p1.
  5 public class Demo {
  6   public static void main(String args[]) {
  7     Protection ob1 = new Protection();
  8     Derived ob2 = new Derived();
  9     SamePackage ob3 = new SamePackage();
 10   }
 11 }
 12 

image

  1 // Demo package p2.
  2 package p2;
  3 
  4 // Instantiate the various classes in p2.
  5 public class Demo {
  6   public static void main(String args[]) {
  7     Protection2 ob1 = new Protection2();
  8     OtherPackage ob2 = new OtherPackage();
  9   }
 10 }
 11 


9.3 导入包

image

image

image


image

  1 package JavaBase_ReferenceNanual.Chap9.listing8.MyPack;
  2 
  3 /**
  4  * 项目名称:JavaEE_Base
  5  * 类名称:Balance
  6  * 类描述: Now, the Balance class, its constructor,
  7  * and its show() method are public. This means that they can be used by
  8  * non-subclass code outside their package.
  9  * 创建人: shall_liu(1136808529@qq.com)
 10  * 创建时间:2017年9月21日 上午12:01:36
 11  * 修改人:amin
 12  * 修改时间:2017年9月21日 上午12:01:36
 13  * 修改备注:
 14  * @version
 15  */
 16 public class Balance {
 17 	String name;
 18 	double bal;
 19 
 20 	public Balance(String n, double b) {
 21 		name = n;
 22 		bal = b;
 23 	}
 24 
 25 	public void show() {
 26 		if (bal < 0)
 27 			System.out.print("-->> ");
 28 		System.out.println(name + ": $" + bal);
 29 	}
 30 }

image

  1 package JavaBase_ReferenceNanual.Chap9.listing9.MyPack;
  2 
  3 import JavaBase_ReferenceNanual.Chap9.listing8.MyPack.*;
  4 /**
  5  *
  6 *
  7 * 项目名称:JavaEE_Base
  8 * 类名称:TestBalance
  9 * 类描述:
 10 * 创建人:  shall_liu(1136808529@qq.com)
 11 * 创建时间:2017年9月21日 上午12:06:30
 12 * 修改人:amin
 13 * 修改时间:2017年9月21日 上午12:06:30
 14 * 修改备注:
 15 * @version
 16 *
 17  */
 18 class TestBalance {
 19   public static void main(String args[]) {
 20 
 21     /* Because Balance is public, you may use Balance
 22        class and call its constructor. */
 23     Balance test = new Balance("J. J. Jaspers", 99.88);
 24 
 25     test.show(); // you may also call show()
 26   }
 27 }
 28 

image

9.4 接口

image

9.4.1 定义接口

image

image

image

image

9.4.2 实现接口

image

image

image

image

  1 package JavaBase_ReferenceNanual.Chap9.listing9.MyPack;
  2 
  3 import javax.security.auth.callback.Callback;
  4 
  5 class Client implements Callback {
  6 	// Implement Callback's interface
  7 	public void callback(int p) {
  8 		System.out.println("callback called with " + p);
  9 	}
 10 
 11 	void nonIfaceMeth() {
 12 		System.out.println("Classes that implement interfaces " + "may also define other members, too.");
 13 	}
 14 }
 15 
 16 package JavaBase_ReferenceNanual.Chap9.listing9.MyPack;
 17 
 18 import javax.security.auth.callback.Callback;
 19 /**
 20  *
 21 *
 22 * 项目名称:JavaEE_Base
 23 * 类名称:TestIface
 24 * 类描述:
 25 * 创建人:  shall_liu(1136808529@qq.com)
 26 * 创建时间:2017年9月21日 上午1:00:06
 27 * 修改人:amin
 28 * 修改时间:2017年9月21日 上午1:00:06
 29 * 修改备注:
 30 * @version
 31 *
 32  */
 33 class TestIface {
 34 	  public static void main(String args[]) {
 35 	    Callback c = new Client();
 36 	    ((Client) c).callback(42);
 37 	  }
 38 	}
 39 //运行结果为
 40 callback called with 42
 41 

image

  1 package JavaBase_ReferenceNanual.Chap9.listing9.MyPack;
  2 
  3 import javax.security.auth.callback.Callback;
  4 
  5 /**
  6  *
  7 *
  8 * 项目名称:JavaEE_Base
  9 * 类名称:AnotherClient
 10 * 类描述:  Another implementation of Callback.
 11 * 创建人:  shall_liu(1136808529@qq.com)
 12 * 创建时间:2017年9月21日 上午1:03:26
 13 * 修改人:amin
 14 * 修改时间:2017年9月21日 上午1:03:26
 15 * 修改备注:
 16 * @version
 17 *
 18  */
 19 class AnotherClient implements Callback {
 20 	// Implement Callback's interface
 21 	public void callback(int p) {
 22 		System.out.println("Another version of callback");
 23 		System.out.println("p squared is " + (p * p));
 24 	}
 25 }
 26 
 27 
 28 package JavaBase_ReferenceNanual.Chap9.listing9.MyPack;
 29 
 30 import javax.security.auth.callback.Callback;
 31 
 32 class Client implements Callback {
 33 	// Implement Callback's interface
 34 	public void callback(int p) {
 35 		System.out.println("callback called with " + p);
 36 	}
 37 
 38 	void nonIfaceMeth() {
 39 		System.out.println("Classes that implement interfaces " + "may also define other members, too.");
 40 	}
 41 }
 42 
 43 package JavaBase_ReferenceNanual.Chap9.listing9.MyPack;
 44 
 45 import javax.security.auth.callback.Callback;
 46 
 47 /**
 48  *
 49 *
 50 * 项目名称:JavaEE_Base
 51 * 类名称:TestIface2
 52 * 类描述:
 53 * 创建人:  shall_liu(1136808529@qq.com)
 54 * 创建时间:2017年9月21日 上午1:04:49
 55 * 修改人:amin
 56 * 修改时间:2017年9月21日 上午1:04:49
 57 * 修改备注:
 58 * @version
 59 *
 60  */
 61 
 62 class TestIface2 {
 63 	public static void main(String args[]) {
 64 		Callback c = new Client();
 65 		AnotherClient ob = new AnotherClient();
 66 
 67 		((Client) c).callback(42);
 68 
 69 		c = ob; // c now refers to AnotherClient object
 70 		((Client) c).callback(42);
 71 	}
 72 }
 73 

image

image

image


9.4.3 嵌套接口

image


  1 // A nested interface example.
  2 
  3 // This class contains a member interface.
  4 class A {
  5   // this is a nested interface
  6   public interface NestedIF {
  7     boolean isNotNegative(int x);
  8   }
  9 }
 10 
 11 // B implements the nested interface.
 12 class B implements A.NestedIF {
 13   public boolean isNotNegative(int x) {
 14     return x < 0 ? false : true;
 15   }
 16 }
 17 
 18 class NestedIFDemo {
 19   public static void main(String args[]) {
 20 
 21     // use a nested interface reference
 22     A.NestedIF nif = new B();
 23 
 24     if(nif.isNotNegative(10))
 25       System.out.println("10 is not negative");
 26     if(nif.isNotNegative(-12))
 27       System.out.println("this won't be displayed");
 28   }
 29 }
 30 

image


9.4.4 应用接口

image

  1 // Define an integer stack interface.
  2 interface IntStack {
  3   void push(int item); // store an item
  4   int pop(); // retrieve an item
  5 }
  6 
  7 // An implementation of IntStack that uses fixed storage.
  8 class FixedStack implements IntStack {
  9   private int stck[];
 10   private int tos;
 11 
 12   // allocate and initialize stack
 13   FixedStack(int size) {
 14     stck = new int[size];
 15     tos = -1;
 16   }
 17 
 18   // Push an item onto the stack
 19   public void push(int item) {
 20     if(tos==stck.length-1) // use length member 
 21       System.out.println("Stack is full.");
 22     else
 23       stck[++tos] = item;
 24   }
 25 
 26   // Pop an item from the stack
 27   public int pop() {
 28     if(tos < 0) {
 29       System.out.println("Stack underflow.");
 30       return 0;
 31     }
 32     else
 33       return stck[tos--];
 34   }
 35 }
 36 
 37 class IFTest {
 38   public static void main(String args[]) {
 39     FixedStack mystack1 = new FixedStack(5);
 40     FixedStack mystack2 = new FixedStack(8);
 41 
 42     // push some numbers onto the stack
 43     for(int i=0; i<5; i++) mystack1.push(i);
 44     for(int i=0; i<8; i++) mystack2.push(i);
 45 
 46     // pop those numbers off the stack
 47     System.out.println("Stack in mystack1:");
 48     for(int i=0; i<5; i++)
 49        System.out.println(mystack1.pop());
 50 
 51     System.out.println("Stack in mystack2:");
 52     for(int i=0; i<8; i++)
 53        System.out.println(mystack2.pop());
 54   }
 55 }

image

  1 // Define an integer stack interface.
  2 interface IntStack {
  3   void push(int item); // store an item
  4   int pop(); // retrieve an item
  5 }
  6 
  7 // Implement a "growable" stack.
  8 class DynStack implements IntStack {
  9   private int stck[];
 10   private int tos;
 11 
 12   // allocate and initialize stack
 13   DynStack(int size) {
 14     stck = new int[size];
 15     tos = -1;
 16   }
 17 
 18   // Push an item onto the stack
 19   public void push(int item) {
 20     // if stack is full, allocate a larger stack
 21     if(tos==stck.length-1) {
 22       int temp[] = new int[stck.length * 2]; // double size
 23       for(int i=0; i<stck.length; i++) temp[i] = stck[i];
 24       stck = temp;
 25       stck[++tos] = item;
 26     }
 27     else
 28       stck[++tos] = item;
 29   }
 30 
 31   // Pop an item from the stack
 32   public int pop() {
 33     if(tos < 0) {
 34       System.out.println("Stack underflow.");
 35       return 0;
 36     }
 37     else
 38       return stck[tos--];
 39   }
 40 }
 41 
 42 class IFTest2 {
 43   public static void main(String args[]) {
 44     DynStack mystack1 = new DynStack(5);
 45     DynStack mystack2 = new DynStack(8);
 46 
 47     // these loops cause each stack to grow
 48     for(int i=0; i<12; i++) mystack1.push(i);
 49     for(int i=0; i<20; i++) mystack2.push(i);
 50 
 51     System.out.println("Stack in mystack1:");
 52     for(int i=0; i<12; i++)
 53        System.out.println(mystack1.pop());
 54 
 55     System.out.println("Stack in mystack2:");
 56     for(int i=0; i<20; i++)
 57        System.out.println(mystack2.pop());
 58   }
 59 }
 60 

image

  1 /* Create an interface variable and
  2    access stacks through it.
  3 */
  4 class IFTest3 {
  5   public static void main(String args[]) {
  6     IntStack mystack; // create an interface reference variable
  7     DynStack ds = new DynStack(5);
  8     FixedStack fs = new FixedStack(8);
  9 
 10     mystack = ds; // load dynamic stack
 11     // push some numbers onto the stack
 12     for(int i=0; i<12; i++) mystack.push(i);
 13 
 14     mystack = fs; // load fixed stack
 15     for(int i=0; i<8; i++) mystack.push(i);
 16 
 17 
 18     mystack = ds;
 19     System.out.println("Values in dynamic stack:");
 20     for(int i=0; i<12; i++)
 21        System.out.println(mystack.pop());
 22 
 23     mystack = fs;
 24     System.out.println("Values in fixed stack:");
 25     for(int i=0; i<8; i++)
 26        System.out.println(mystack.pop());
 27   }
 28 }
 29 

image

9.4.5 接口中的变量

image

  1 import java.util.Random;
  2 
  3 interface SharedConstants {
  4   int NO = 0;
  5   int YES = 1;
  6   int MAYBE = 2;
  7   int LATER = 3;
  8   int SOON = 4;
  9   int NEVER = 5;
 10 }
 11 
 12 class Question implements SharedConstants {
 13   Random rand = new Random();
 14   int ask() {
 15     int prob = (int) (100 * rand.nextDouble());
 16     if (prob < 30)
 17       return NO;           // 30%
 18     else if (prob < 60)
 19       return YES;          // 30%
 20     else if (prob < 75)
 21       return LATER;        // 15%
 22     else if (prob < 98)
 23       return SOON;         // 13%
 24     else
 25       return NEVER;        // 2%
 26   }
 27 }
 28 
 29 class AskMe implements SharedConstants {
 30   static void answer(int result) {
 31     switch(result) {
 32       case NO:
 33         System.out.println("No");
 34         break;
 35       case YES:
 36         System.out.println("Yes");
 37         break;
 38       case MAYBE:
 39         System.out.println("Maybe");
 40         break;
 41       case LATER:
 42         System.out.println("Later");
 43         break;
 44       case SOON:
 45         System.out.println("Soon");
 46         break;
 47       case NEVER:
 48         System.out.println("Never");
 49         break;
 50     }
 51   }
 52 
 53   public static void main(String args[]) {
 54     Question q = new Question();
 55     answer(q.ask());
 56     answer(q.ask());
 57     answer(q.ask());
 58     answer(q.ask());
 59   }
 60 }

image

9.4.6 接口可以扩展

image

  1 // One interface an extend another.
  2 interface A {
  3   void meth1();
  4   void meth2();
  5 }
  6 
  7 // B now includes meth1() and meth2() -- it adds meth3().
  8 interface B extends A {
  9   void meth3();
 10 }
 11 
 12 // This class must implement all of A and B
 13 class MyClass implements B {
 14   public void meth1() {
 15     System.out.println("Implement meth1().");
 16   }
 17 
 18   public void meth2() {
 19     System.out.println("Implement meth2().");
 20   }
 21 
 22   public void meth3() {
 23     System.out.println("Implement meth3().");
 24   }
 25 }
 26 
 27 class IFExtend {
 28   public static void main(String arg[]) {
 29     MyClass ob = new MyClass();
 30 
 31     ob.meth1();
 32     ob.meth2();
 33     ob.meth3();
 34   }
 35 }

image

9.5 默认接口方法

image

image

image



9.5.1 默认方法的基础知识

image

  1 public interface MyIF {
  2   // This is a "normal" interface method declaration. 
  3   // It does NOT define a default implementation. 
  4   int getNumber();
  5 
  6   // This is a default method. Notice that it provides 
  7   // a default implementation. 
  8   default String getString() {
  9     return "Default String";
 10   }
 11 }
 12 

image

  1 // Implement MyIF. 
  2 class MyIFImp implements MyIF {
  3   // Only getNumber() defined by MyIF needs to be implemented. 
  4   // getString() can be allowed to default. 
  5   public int getNumber() {
  6     return 100;
  7   }
  8 }
  9 

image

  1 // Use the default method. 
  2 class DefaultMethodDemo {
  3   public static void main(String args[]) {
  4 
  5     MyIFImp obj = new MyIFImp();
  6 
  7     // Can call getNumber(), because it is explicitly 
  8     // implemented by MyIFImp: 
  9     System.out.println(obj.getNumber());
 10 
 11     // Can also call getString(), because of default 
 12     // implementation: 
 13     System.out.println(obj.getString());
 14   }
 15 }
 16 

image

  1 class MyIFImp2 implements MyIF {
  2   // Here, implementations for both getNumber( ) and getString( ) are provided. 
  3   public int getNumber() {
  4     return 100;
  5   }
  6 
  7   public String getString() {
  8     return "This is a different string.";
  9   }
 10 }

image



9.5.2 一个更加实用的例子

image

  1 interface IntStack {
  2   void push(int item); // store an item 
  3   int pop(); // retrieve an item 
  4 
  5   // Because clear( ) has a default, it need not be 
  6   // implemented by a preexisting class that uses IntStack. 
  7   default void clear() {
  8     System.out.println("clear() not implemented.");
  9   }
 10 }

image


9.5.3 多级继承的问题

image

image

image



9.6 在接口中使用静态方法

image

  1 public interface MyIF {
  2   // This is a "normal" interface method declaration. 
  3   // It does NOT define a default implementation. 
  4   int getNumber();
  5 
  6   // This is a default method. Notice that it provides 
  7   // a default implementation. 
  8   default String getString() {
  9     return "Default String";
 10   }
 11 
 12   // This is a static interface method. 
 13   static int getDefaultNumber() {
 14     return 0;
 15   }
 16 }

9.7 关于包和接口的最后说明


posted @ 2017-09-14 00:25  一品堂.技术学习笔记  阅读(724)  评论(0编辑  收藏  举报