链式编程

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

/*
* 链式编程
* 每次调用方法后,返回的是一个对象
*/ 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;
}
}

04747_Java语言程序设计(一)_第3章_面向对象编程基础的更多相关文章

  1. 【 .NET 面向对象程序设计进阶》】【 《.NET 面向对象编程基础》】【《正则表达式助手》】

    <.NET 面向对象程序设计进阶> <.NET 面向对象程序设计进阶> <正则表达式助手>

  2. 第二章 Matlab面向对象编程基础

    DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...

  3. Object-C 1.0 第三章:面向对象编程基础知识(OOP)

    1. 间接(indirection)        1.1 变量和间接(使用变量来代替一些数字)        1.2 使用文件名的间接                const  表示一个变量不允许 ...

  4. ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 使用ArcGIS进行空间分析 1.1 GIS分析基础 G ...

  5. ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区 1 用ArcMap制作地图 作为ArcGIS for Deskto ...

  6. ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第四章_入门案例分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 入门案例分析 在第一章里,我们已经对ArcGIS系列软件的体系结构有了一 ...

  7. 简学Python第六章__class面向对象编程与异常处理

    Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群  群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性p ...

  8. 16第一章 ASP.Net编程基础知识

    第一章        ASP.Net编程基础知识 第一章        ASP.Net编程基础知识 本章首先介绍用ASP.Net技术编制服务器端动态网页所需的网络和HTML标记语言方面的有关知识.然后 ...

  9. Objective-C 基础教程第三章,面向对象编程基础知

    目录 Objective-C 基础教程第三章,面向对象编程基础知 0x00 前言 0x01 间接(indirection) 0x02 面向对象编程中使用间接 面向过程编程 面向对象编程 0x03 OC ...

  10. 第5章 Linux网络编程基础

    第5章 Linux网络编程基础 5.1 socket地址与API 一.理解字节序 主机字节序一般为小端字节序.网络字节序一般为大端字节序.当格式化的数据在两台使用了不同字节序的主机之间直接传递时,接收 ...

随机推荐

  1. Quartz集成springMVC 的方案二(持久化任务、集群和分布式)

    Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等. Quartz核心是调度器,还采用多线程管理. 1.持久化任务:当应用程序停止运行时,所有调度信 ...

  2. java 实例化是调用了子类重写方法

    java 实例化时调用了抽象方法或者class里面某个方法,如果子类有重写改方法,实际运行的是子类重写方法 package auto.test; //抽象父类 public abstract clas ...

  3. 修改过mysql数据库字段内容默认值为当前时间

    --添加CreateTime 设置默认时间 CURRENT_TIMESTAMP  ALTER TABLE `table_name`ADD COLUMN  `CreateTime` datetime N ...

  4. python中os模块常用方法

    #!/usr/bin/python## os module test import os print 'os.name: ', os.nameprint 'os.getcwd(): ', os.get ...

  5. Building bridges_hdu_4584(排序).java

    Building bridges Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...

  6. android_launcher的源码详细分析

    转载请注明出处:http://blog.csdn.net/fzh0803/archive/2011/03/26/6279995.aspx 去年做了launcher相关的工作,看了很长时间.很多人都在修 ...

  7. oracle之replace结合substr的使用

    select * from( SELECT TMM.ORDER_ID, TMM.IMPORT_ID, TMM.TMALL_ORDER_ID, TMM.MEMBER_NAME, TMM.ALIPAY_U ...

  8. extjs folder is lost解决方法 和 FineUI主题切换时 iframe内的内容主题不变的解决方法

    错误原因:extjs包和FineUI版本不一致 或者是 webconfig配置中 没有设置为任何人可访问  解放方法下载和FineUI版本相同的extjs包就ok了 解决方法:FineUI主题切换时 ...

  9. Android SDK离线安装

    Android SDK离线安装是本文要介绍的内容,主要是来了解并学习Android SDK安装的内容,具体关于Android SDK是如何离线安装的内容来看本文详解. Android开发环境,完整的说 ...

  10. Merge Sorted Array 合并数组并排序

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...