链式编程

每次调用方法后,返回的是一个对象

 

/*
 * 链式编程
 * 每次调用方法后,返回的是一个对象
*/

class Student {
	public void study() {
		System.out.println("good good study, day day up!");
	}
}

class StudentDemo {
	public Student getStudent() {
		return new Student();
	}
}

public class InnerClassDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		StudentDemo sd = new StudentDemo();

		sd.getStudent().study();// 链式编程
	}
}

 

面试题:

 

要求分别输出30,20,10

 

注意:

1:内部类和外部类没有继承关系

2:通过外部类名限定this对象

3:Outer.this

 

/*
 面试题:
 要求分别输出30,20,10
 
 注意:
 1:内部类和外部类没有继承关系
 2:通过外部类名限定this对象
 3:Outer.this
*/

class Outer {
	public int num = 10;

	class Inner {
		public int num = 20;

		public void show() {
			int num = 30;
			System.out.println(num);
			System.out.println(this.num);
			System.out.println(Outer.this.num);
		}
	}
}

public class InnerClassDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Outer.Inner oi = new Outer().new Inner();
		oi.show();
	}
}

 

匿名内部类在开发中的使用

 

/*
 * 匿名内部类在开发中的使用
*/

interface Person {
	public abstract void study();
}

class PersonDemo {
	// 接口名作为形式参数
	// 起始这里需要的不是接口,而是该接口的实现类
	public void method(Person p) {
		p.study();
	}
}

class Student implements Person// 实现类
{
	public void study() {
		System.out.println("good good study, day day up!");
	}
}

public class InnerClassDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		PersonDemo pd = new PersonDemo();
		Person p = new Student();
		pd.method(p);

		System.out.println("-----------------------------");

		pd.method(// 上下作用一样,下面的在Android更常用,因为匿名对象使用以后内存被回收
				new Person() {
					public void study() {
						System.out.println("good good study, day day up!");
					}
				});
	}
}

 

匿名内部类的面试题

 

class Outer {
	public static Inter method() {
		return new Inter() {
			public void show() {
				System.out.println("hello world.");
			}
		};
	}
}

public class InnerClassDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Outer.method().show();
		/*
		 * 1: Outer.method()可以看出method()应该是Outer的一个静态方法
		 * 2:Outer.method().show()可以看出method()方法的返回值是一个对象
		 * 3:接口Inter中有一个show()方法,method()方法的返回值是一个接口
		 */
	}
}

 

面试题

 

/*
* 注意:Integer的数据直接赋值,如果在-128到127之间,会直接从缓冲区获取数据
* */

 

public class IntegerDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Integer i1 = new Integer(127);
		Integer i2 = new Integer(127);
		System.out.println(i1 == i2);

		Integer i3 = new Integer(128);
		Integer i4 = new Integer(128);
		System.out.println(i3 == i4);

		Integer i5 = 127;
		Integer i6 = 127;
		System.out.println(i5 == i6);

		Integer i7 = 128;
		Integer i8 = 128;
		System.out.println(i7 == i8);

		/*
		 * 通过查看源码,得知针对-128到127之间的数据,做了一个数据缓冲区,如果数据在该范围内的,每次并不创建新的空间 以下是反编译后的语句
		 * Integer i9 = Integer.valueOf(128);
		 */

		Integer i9 = Integer.valueOf(128);
		Integer i10 = Integer.valueOf(128);
		System.out.println(i9 == i10);
	}
}

 

例3.1学生类Student的声明。

 

class Student {
	float heigth, weight;// 成员变量定义
	String name, sex, no;// 成员变量定义

	void setStudent(String n, String s, String o)// 方法定义
	{
		name = n;
		sex = s;
		no = n;
		System.out.println("姓名:" + name);
		System.out.println("性别:" + sex);
		System.out.println("学号:" + no);
	}

	void setWH(float w, float h)// 方法定义
	{
		weight = w;
		heigth = h;
	}
}

 

例3.2方法的例子,类B有方法u()和v()。

 

class B {
	double x, y;

	int u(int x, int y)// 方法u()返回int型值,有两个int型参数
	{
		return x * x + y * y + 1;// x、y是参数
	}

	float v(int a, float b) {
		return (float) (a * x + b * y);// x、y是成员变量
	}
}

 

例3.3利用关键字this访问被隐藏的成员变量。

 

class Jerry {
	int x, z;

	void g(int z) {
		int x = 5 + z;// 定义局部变量x,而z是参数
		this.x = x;// 局部变量x的值赋值给成员变量x
		this.z = z;// 参数z的值赋值给成员变量z
	}
}

 

例3.4方法重载的例子,类C的4个方法或因参数个数不同,或因参数的类型顺序不同,是4个合理的重载方法。

 

class C {
	float fun(float s)// 只有一个float参数
	{
		return s * s;
	}

	float fun(float x, int y)// 第一个是float参数,第二个int参数
	{
		return x * x + y * y;
	}

	float fun(int x, float y)// 第一个是int参数,第二个float参数
	{
		return x * x + y * y;
	}

	float fun(float x, float y, float z)// 有三个是float参数
	{
		return x * x + y * y + z;
	}
}

 

例3.5类内定义构造方法的例子。类Point定义了两个构造方法。

 

class Point {
	int x, y;

	Point()// 无参数的构造方法,点对象被创建时,总是预设x=10,y=20
	{
		x = 10;
		y = 20;
	}

	Point(int x, int y)// 有两个参数的构造方法,为点对象设置x和y坐标的初值
	{
		this.x = x;// 成员变量与参数同名,冠this是指成员变量,参见3.2.7
		this.y = y;
	}

	int getX() {
		return x;
	}

	int getY() {
		return y;
	}
}

 

例3.6使用对象的程序例子。

 

public class Example3_1 {
	public static void main(String[] args) {
		Point p1, p2, p3;// 声明对象p1,p2,p3
		p1 = new Point();// 创建对象p1
		p2 = new Point(40, 50);// 创建对象p2
		p3 = new Point(p1.getX() + p2.getX(), p1.getY() + p2.getY());
		System.out.println("P3.x=" + p3.getX() + ",p3.y=" + p3.getY());
		Point p4 = new Point(p1.x, p2.y);// 声明并创建对象p4
		System.out.println("P4.x=" + p4.x + ",p4.y=" + p4.y);
	}
}

 

例3.7类D定义了一个实例方法,两个类方法。

 

class D {
	int a;// 实例变量
	static int c;// 类变量

	float max(int x, int y)// 实例方法
	{
		return a = x > y ? x : y;
	}

	static void setCount(int c0)// 类方法
	{
		c = c0;
	}

	static void incCount(int step)// 类方法
	{
		c += step;
	}
}

 

例3.8含不合法代码的例子。程序的注释指明合法和不合法的原有。

 

class E {
	float u;
	static float v;

	static void setUV(boolean f) {
		u = s_m(f);// 合法,类方法可以调用类方法
		v = r_m(!f);// 非法,类方法不能直接调用实例方法
	}

	static float s_m(boolean f) {
		return f ? u : v;// 非法,类方法只能引用类变量
	}

	float r_m(boolean f) {
		return f ? u : v;// 合法,实例方法能引用实例变量和类变量
	}
}

 

例3.9说明类变量用法的应用程序。改写Point类的声明,在Point类中增加一个类变量pCount,它的初值为0。在构造方法中,有类变量pCount增1的代码,这能记录类的对象个数。

 

public class Example3_2 {
	public static void main(String[] args) {
		Point p1, p2, p3;
		p1 = new Point();
		p2 = new Point(40, 50);
		p3 = new Point(p1.getX() + p2.getX(), p1.getY() + p2.getY());
		System.out.println("p3.x=" + p3.getX() + ",p3.y=" + p3.getY());
		Point p4 = new Point(p1.x, p2.y);
		System.out.println("p4.x=" + p4.x + ",p4.y=" + p4.y);
		System.out.println("程序共有Point对象" + Point.pointNum() + "个");
	}
}

class Point {
	int x, y;
	static int pCount = 0;

	Point()// 无参数的构造方法,点对象被创建时,总是预设x=10,y=20
	{
		x = 10;
		y = 20;
		pCount++;
	}

	Point(int x, int y)// 有两个参数的构造方法,为点对象设置坐标的初值
	{
		this.x = x;// 由于成员变量与参数同名,this表明是成员变量
		this.y = y;
		pCount++;
	}

	static int pointNum() {
		return pCount;
	}

	int getX() {
		return x;
	}

	int getY() {
		return y;
	}
}

 

例3.10继承声明子类的例子。

 

class Mother {
	private int money;
	float weight, height;

	String speak(String s) {
		return s;
	}

	float getWeight() {
		return weight;
	}

	float getHeight() {
		return height;
	}

	String dance() {
		return "我会跳舞";
	}
}

class Daughter extends Mother {
	String cat;

	String sing(String s) {
		return s;
	}

	String dance() {
		return "我是小舞蹈演员";
	}
}

public class Example3_10 {
	public static void main(String[] args) {
		Daughter girl = new Daughter();
		girl.cat = "漂亮的帽子";
		girl.weight = 35.0f;
		girl.height = 120.0f;
		System.out.println(girl.speak("我是女儿"));
		System.out.println(girl.speak("我像母亲一样很会说话"));
		System.out.println(girl.speak("我重" + girl.weight + "公斤"));
		System.out.println(girl.speak("我高" + girl.height + "公分"));
		System.out.println(girl.speak("我还比母亲多一项" + girl.cat));
		System.out.println(girl.sing("我还能唱歌"));
		System.out.println(girl.dance());
	}
}

 

例3.11说明多态性的程序例子。

 

class Shape {
	float area()// 抽象的几何形状,一律返回面积为0
	{
		return 0.0f;
	}
}

class Circle extends Shape {
	float R;

	Circle(float r) {
		R = r;
	}

	float area()// 圆类重新定义求面积的方法,能正确求出圆的面积
	{
		return 3.1415926f * R * R;
	}
}

class Rectangle extends Shape {
	float W, H;

	Rectangle(float w, float h) {
		W = w;
		H = h;
	}

	float area()// 长方形类也重新定义求面积的方法,能正确求出长方形的面积
	{
		return W * H;
	}
}

public class Example3_4 {
	public static void main(String[] args) {
		Circle c;
		Rectangle r;
		c = new Circle(1.0f);
		r = new Rectangle(3.0f, 4.0f);
		System.out.println("圆面积=" + c.area());
		System.out.println("长方形面积=" + r.area());
		;
	}
}

 

例3.12一个多层继承的例子。

 

class Vehicle {
	public void start() {
		System.out.println(" Starting...");
	}
}

class Aircraft extends Vehicle {
	public void fly() {
		System.out.println(" Flying...");
	}
}

class Whirlybird extends Aircraft {
	public void whirl() {
		System.out.println(" Whirling...");
	}
}

class Jet extends Aircraft {
	public void zoom() {
		System.out.println(" Zooming...");
	}
}

 

例3.13说明多层继承中构造方法调用顺序的例子。

 

class A {
	int a;

	A(int a) {
		this.a = a;
		System.out.println("Constructing A");
	}
}

class B extends A {
	int b;

	B(int a, int b) {
		super(a);
		this.b = b;
		System.out.println("Constructing B");
	}
}

class C extends B {
	int c;

	C(int a, int b, int c) {
		super(a, b);
		this.c = c;
		System.out.println("Constructing C");
	}
}

class D extends C {
	int d;

	D(int a, int b, int c, int d) {
		super(a, b, c);
		this.d = d;
		System.out.println("Constructing D");
	}
}

public class Example3_13 {
	public static void main(String[] args) {
		D obj = new D(1, 2, 3, 4);
		System.out.println("对象obj的值是:" + obj.a + "," + obj.b + "," + obj.c + "," + obj.d);
		System.out.println("Main Program!");
	}
}

 

例3.14含抽象类和抽象方法的程序。

 

abstract class Shape// 抽象类
{
	int x, y;

	void MoveTo(int newx, int newy) {
		x = newx;
		y = newy;
	}

	Shape(int newx, int newy) {
		x = newx;
		y = newy;
	}

	abstract void Draw();// 抽象方法,没有实现
}

class Square extends Shape// 继承抽象类
{
	int len;// 正方形边长

	Square(int px, int py, int l) {
		super(px, py);
		len = l;
	}

	void Draw()// 超类抽象方法的具体的实现
	{
		System.out.print("我是正方形,");
		System.out.print("我的中心位置是:" + "(" + x + "," + y + "),");
		System.out.println("我的边长是:" + len);
		// 以x,y为中心,边长为len的正方形
	}
}

class Circle extends Shape// 继承抽象类
{
	int radius;// 半径

	Circle(int px, int py, int r) {
		super(px, py);
		radius = r;
	}

	void Draw()// 超类抽象方法的具体的实现
	{
		System.out.print("我是圆形,");
		System.out.print("我的中心位置是:" + "(" + x + "," + y + "),");
		System.out.println("我的半径是:" + radius);
		// 以x,y为圆心,半径为radius的圆
	}
}

class ShapeDraw {
	void draw(Shape obj) {
		obj.Draw();// 利用动态联编,按实际对象调用相应的Draw()方法
	}
}

public class Example3_14 {
	public static void main(String[] args) {
		ShapeDraw sd = new ShapeDraw();
		Square s = new Square(10, 10, 20);
		Circle c = new Circle(30, 30, 5);
		sd.draw(s);// 以s为实参调用sd的draw方法
		sd.draw(c);// 以c为实参调用sd的draw方法
	}
}

 

例3.15使用super调用超类构造方法、超类方法和超类成员变量的程序。

 

class A {
	int x;

	A(int inf) {
		x = inf;
	}

	void method() {
		System.out.println("我是类A的方法!值是" + x);
	}

	int getX() {
		return x;
	}
}

class B extends A// 继承类A声明类B
{
	double x;

	B(int a, double b) {
		super(a);// 调用类A的构造方法
		x = b;
	}

	void method() {
		System.out.println("我是类B的方法!值是" + x);
	}
}

class C extends B {
	char x;

	C(int a, double b, char c) {
		super(a, b);// 调用类B的构造方法
		x = c;
	}

	void method() {
		char chCx = x;// 这里的x是类C定义的x
		double dBx = super.x;// 引用父类的成员变量,类B的x
		int iAx = this.getX();// 不能用A.X,也不能用super.super.x
		super.method();// 调用类B的method()方法
		System.out.println("我是类C的方法!值是" + x);
		System.out.println("我获得的信息是:" + "chCx=" + x + chCx + ",dBx=" + dBx + ",iAx=" + iAx);
	}
}

public class Example3_15 {
	public static void main(String[] args) {
		C c = new C(2, 3.0, 'C');
		c.method();
	}
}

 

例3.16类A继承扩展类B,类A和类B之间有is-a关系。

 

class B {
	int b;

	B(int x) {
		b = x;
	}

	void write() {
		System.out.println("这是来自类B的输出!");
	}
}

class A extends B {
	int a;

	A(int x, int y) {
		super(x);
		a = y;
		write();
		System.out.println("我是子类A!" + "b=" + b + ",a=" + a);
	}
}

public class Example3_16 {
	public static void main(String[] args) {
		A obj = new A(1, 2);
	}
}

 

例3.17类A的某个成员变量的类型是B,类A和类B之间是has-a关系。

 

class A {
	B b;
	int a;

	A(int x, int y, int z) {
		b = new B(x, y);
		a = z;
		b.write();
	}
}

class B {
	int b1, b2;

	B(int x, int y) {
		b1 = x;
		b2 = y;
	}

	void write() {
		System.out.println("这是来自类B的输出!");
	}
}

public class Example3_17 {
	public static void main(String[] args) {
		A obj = new A(1, 2, 3);
	}
}

 

例3.18一个含内部类的程序。

 

class A {
	B obj;

	A() {
		obj = new B();
		obj.print();
	}

	class B// B是内部类
	{
		public void print() {
			System.out.println("内部类B...");
		}
	}
}

public class Example3_18 {
	public static void main(String[] args) {
		A obj = new A();
	}
}

 

例3.19声明接口和类实现接口的例子。

 

interface Computable// 声明一个接口
{
	final int MAX = 100;

	void speak(String s);

	int f(int x);

	int g(int x, int Y);
}

class A implements Computable// 类A实现Computable接口
{
	int no;

	public int f(int x)// 不要忘记public关键字
	{
		int sum = 0;
		for (int i = 1; i <= x; i++) {
			sum = sum + i;
		}
		return sum;
	}

	public int g(int x, int y) {
		return x * y;// 至少有return语句
	}

	public void speak(String s) {
		// 必须有方法体,但体内可以没有任何语句
	}
}

class B implements Computable// 类B也实现Computable接口,但实现的方案不同
{
	int no;

	public int f(int x) {
		int sum = 0;
		for (int i = 1; i <= x; i++) {
			sum = sum + i * i;
		}
		return sum;
	}

	public int g(int x, int y) {
		return x + y;
	}

	public void speak(String s) {
		// 必须有方法体,但体内可以没有任何语句
	}
}

public class Example3_19 {
	public static void main(String[] args) {
		A Li;
		B Tom;
		Li = new A();
		Li.no = 951898;
		Tom = new B();
		Tom.no = 951899;
		System.out.print("Li的编号:" + Li.no + ",最大值:" + Li.MAX);
		System.out.print(",从1到100求和=" + Li.f(100));
		System.out.println(",3与4的积=" + Li.g(3, 4));
		System.out.print("Tom的编号:" + Tom.no + ",最大值:" + Tom.MAX);
		System.out.print(",从1平方加到9平方=" + Tom.f(9));
		System.out.println(",5与6的和=" + Tom.g(5, 6));
	}
}

 

例3.20说明小应用程序建立和运行步骤的小应用程序。

 

import java.applet.*;
import java.awt.*;

public class Example3_20 extends Applet {
	int pos;

	public void init() {
		pos = 5;
	}

	public void start() {
		repaint();
	}

	public void stop() {

	}

	public void paint(Graphics g) {
		g.drawString("我们正在学习Java程序设计", 20, pos + 10);
		pos = (pos + 20) % 100 + 5;
	}
}