Core Java Day01 2011/10/8

1 面向对象(OO,Object Oriented) 
 1) 什么是Object(对象), Object 本意:东西,是指一个具体事物实例 
 2) 面向对象, 面向客观事物之间的关系.
 4) OOA(Object-Oriented Analysis)面向对象分析/OOD(Object Oriented Design) 面向对象设计
   客人来了(来了一个客人类型的某人)
   
 5) 面向对象概念
  A 类型: 名词概念, 如: 客人, 菜品, 厨师
  B 引用(变量): 引用具体概念实例的代词, 如: 某人, 特价菜
  C 对象(东西): 具体概念的个体实例,如:张三丰这个人, 一盘大盘鸡
  D 行为(方法)
  E 多态: 行为/引用, 在具体情形下发生了变化的现象
          一盏灯:  多态的
          打: 根据宾语发生变化
  F 封装: 任何对象实例都是尽可能封装, 减少暴露
  E 继承: 概念的继承关系
   
2 Java 类型, 引用变量 与 堆对象
 1)Java 类, 是用来描述事物类型的. 如: 书
   <图书馆管理系统>中的概念: 书 Book
  书的特征: 书号, 书名, 编号, 作者, 价格...  
 2) 类的声明:
    public class Book{
     long id;
     String name;
     String isbn; //书号
     String[] authors; //作者
     double price;
    }
 3) 引用变量与对象的创建过程:
  A Java的内存管理与分配:
    栈是一块Java使用内存区域, 使用的方式:LIFO(后来者居上)
    堆也是一块Java使用内存区域, 使用方式: 无序随机分配
  B 局部变量 与 堆对象空间分配
   Java 局部变量(在方法中分配变量, 包括方法参数)在栈中分配,是按照变量的类型分配 
   对象在堆中分配, 按照类的属性(实例变量)分配空间
  C 变量类型与分配
   变量分为: 基本类型和引用类型
   基本类型变量的空间大小: 就是基本类型的空间大小, 值是基本类型的值
   引用变量的值是一个对象的地址值, 引用变量通过地址引用了一个堆对象.
   引用类型变量的占用空间大小和值管理是"透明的(不可看见)",
   由Java系统管理: 变量占用空间以及值的管理, 都是透明的. 
    
 4) 对象的属性默认自动初始化的. 自动初始化为"零"值, 引用为null
 5) 在null引用上调用属性或方法, 会发生运行时异常
 
 案例:
  平面绘图坐标系中的一个点(Point),定义合理的属性
  坐标是int类型.
   O+-----------------------------> X
    |
    |        . p1(x,y)
    |
    |
    |          . p2(x,y)
    |
    |
    |
    |
    
    Y
 
3 构造器(构造方法) 的作用: 用来描述对象的创建过程的.
  1) 
  如: 月饼实例的创建, 使用面和馅创建.
              制作(构造器)
  月饼模子(类)  -----> 月饼(对象)
              原料(构建参数)
   
  点类型   -------->  原点 
           坐标(1,2)
  
 2) Java中的构造器: 声明在类内部, 方法名与类名一致的方法叫构造方法, 构造方法不能声明返回值类型.
  构造方法可以包含参数, 参数一般是创建对象实例必须依赖的条件(前提条件).
public class Point {
  int x;
  int y;
  /** 构造器 */
  public Point(int x, int y){
    this.x = x;
    this.y = y;
  }
}
 
 3) 对象实例化过程:
 new运算: 创建对象实例
  1 根据类的属性在堆中分配对象空间.并且自动初始化实例变量
  2 根据参数类型调用构造器. 
  3 new运算返回对象的引用地址.
  
 4) this 关键字
  this 是对当前对象的引用, 是运行期间当前对象本身.可以使用this明确的访问当前对象的属性或者方法类似于"我".
  this() 是调用本类的其他构造器, 可以使用构造器的重用, 
    简化代码的实现. 
  * this() 必须写在构造器的第一行!
 
 5) 构造方法重载: 参数不一样的构造器
案例: Point.java
   方法签名 = 方法名+参数类型列表
   方法重载:a 方法名一样 b 方法参数不一样
     也可以说: 方法名一样, 方法签名不同的方法
     
 6) 默认构造器
  1 java 类一定有构造器
  案例: ConstructorDemo.java
  2 如果类没有声明任何构造器,Javac自动提供一个
  默认构造器, 无参数默认构造器
  3 如果提供构造器声明, Javac将不再提供默认构
  造器.   

4 对象的方法
 1) 表示对象的功能, 依赖于对象存在.
  案例: Point.java
  如: p1.distance() 和 p2.distance()
  方法是动作,是功能,一般用动词声明.  
 2)方法也经常重载, 重载:方法名一样, 参数不一样重载体现了,
   功能的多态.重载的方法经常互相重用.
   
5 Java中所用局部变量在栈中分配
  
作业:
  1 练习课题案例
  2 绘制PointDemo.java 的运行内存原理图
    实现方法 public double distabce(int x, int y)
  3 实现习题案例: 圆类, 矩形和Person类

 案例1: 圆(Circle), 矩形(Rectangle) 
 
  圆: 包含 圆心和半径两个属性
  矩形: 包含 顶点和宽,高三个属性
  提供合理的构造器
     提供方法, 计算当前图形的面积
              计算当前图形是否包含(contains(Point))指定的点
              重载方法 contains(int x, int y) 图形是否包含坐标x,y  
 案例2: 定义民政业务类 Person 
   定义属性: 编号,名字,性别,年龄, 婚否, 身份证号, 地址, 电话, 
           伴侣 
   提供方法: 结婚, 参数是另外一个人
           定义合理的结婚规则
           结婚结果, 如果成功就合理更新双方的属性 婚否和伴侣, 
           返回true, 代表结婚成功, 结婚失败就返回false
  
  4 预习: 类的继承 

==============================================================================
package corejava.day01;
/**
 * 书的概念
 * 
 * @author Administrator
 * 
 */
public class Book {
int id;// 编号
String name;// 书名
String[] authors;// 作者
String isbn;// 图书编号
double price;// 单价
}

==============================================================================
package corejava.day01;
public class BookDemo {
public static void main(String[] args) {
Book book = new Book();
book.name = "鬼吹灯";
System.out.println(book.name);
System.out.println("引用数据类型默认初始化为:" + book.isbn);
System.out.println("对没有初始化的引用数据进行操作时,会报空指针异常如:" + book.isbn.length());
System.out.println("双精度类型的数据默认初始化为:" + book.price);
book = new Book();
book.name = "山楂树之恋";
System.out.println(book.name);
}
}

==============================================================================
package corejava.day01;
/**
 * 定义一个圆类
 * 
 * @author Administrator
 * 
 */
public class Circle {
Point center;// 圆心
int r;// 半径

public Circle() {
}

public Circle(Point center, int r) {
this.center = center;
this.r = r;
}

public Circle(int x, int y, int r) {
this(new Point(x, y), r);
}

/**
 * 方法:计算圆的面积
 * 
 * @return double
 */
public double area() {
return Math.PI * this.r * this.r;
}

/**
 * 方法:判读坐标(X,Y)是否在圆内部
 * 
 * @param X
 *            表示坐标x的值
 * @param Y
 *            表示坐标Y的值
 * @return boolean
 */
public boolean contains(int x, int y) {
return this.center.distance(x, y) >= this.r;
}

/**
 * 方法:计算一个点是否在圆内
 * 
 * @param p
 *            表示一个点
 * @return boolean
 */
public boolean contains(Point p) {
return this.contains(p.x, p.y);
}
}

==============================================================================
package corejava.day01;

public class CircleDemo {

public static void main(String[] args) {
Circle circle = new Circle(3, 4, 5);
System.out.println("利用圆的contains(int x,int y)方法判断点(6,8)是否在圆内:"
+ circle.contains(6, 8));

Point p = new Point(6, 8);
System.out.println("利用圆的contains(Point p)方法判断点(6,8)是否在圆内:"
+ circle.contains(p));

}

}

==============================================================================
package corejava.day01;

/**
 * 默认构造器测试
 * 
 * 1 如果类中没有声明任何构造器, javac 会在编译期间自动提供默认构造器
 * 
 * 2 如果类中声明了构造器, Javac将不再提供默认构造器
 * 
 * @author Administrator
 * 
 */

public class ConstructorDemo {
public static void main(String[] args) {
@SuppressWarnings("unused")
Foo foo = new Foo();// 有默认构造器
//Goo goo = new Goo();//编译错误,Goo没有默认构造器
@SuppressWarnings("unused")
Goo goo = new Goo(1);//调用Goo(int) 构造器
}
}

class Foo {
// 默认构造器由javac自动添加
// public Foo() {}
}

class Goo {
int a;

public Goo(int a) {
this.a = a;
}
}

==============================================================================
package corejava.day01;

/**
 * 定义一个点类
 * 
 * @author Administrator
 * 
 */

public class Point {

int x;// 表示点的X坐标
int y;// 表示点的Y坐标

/**
 * 构造器在软件业务(功能)层面上,描述了一个对象的创建过程
 * 
 * 构造器:1.方法名必须和类名相同 2.没有返回值类型 3.使用new关键字
 * 
 * 
 * 利用坐标为前提,创建一个点对象
 * 
 * @param X
 *            表示点的X坐标
 * @param Y
 *            表示点的Y坐标
 */
public Point() {
}

public Point(int x, int y) {
this.x = x;// 软件功能上:对点对象X属性进行初始化
this.y = y;
}

/**
 * 创建对角线上的点
 */
public Point(int x) {
this.x = x;
this.y = x;
// 调用本类的构造器,实现构造器的重用,用本类型其它构造器时(this())必须写在构造器的第一行!
// this(x,x);
}

/**
 * 方法: 计算当前点到原点(0,0)的距离(勾股定理)
 * 
 * @return double
 */
public double distance() {
return this.distance(0, 0);
}

/**
 * 方法:计算当前点到坐标x,y的距离
 * 
 * @param X
 *            表示点的X坐标
 * @param Y
 *            表示点的Y坐标
 * @return double
 */
public double distance(int x, int y) {
return Math.sqrt((this.x - x) * (this.x - x) + (this.y - y)
* (this.y - y));
}

/**
 * 方法:计算当前点到其它点的距离(other)
 * 
 * @param other
 *            表示其他点
 * 
 * @return double
 */
public double distance(Point other) {
return this.distance(other.x, other.y);
}
}

==============================================================================
package corejava.day01;

public class PointDemo {

public static void main(String[] args) {
Point p1 = new Point(3, 4);
System.out.println("当前点(3,4)到原点(0,0)的距离为:" + p1.distance());

Point p2 = new Point(2);
System.out.println("当前点(2,2)到原点(0,0)的距离为:"+p2.distance());
System.out.println("当前点(3,4)到点(2,2)的距离为:" + p1.distance(p2));
}
}
实验内容: 一、定义一个名为Circle的圆类,位于shape包中。要求如下: (1) 该类需要描述圆在二维坐标系中的位置,圆心的横、纵坐标值均取整数;描述圆的半径,取双精度类型。 (2) 无参构造方法将圆心坐标设为坐标圆点,半径设为1.0;有参构造方法需要根据参数值设置圆心坐标和半径值。 (3) 提供一个计算圆面积的方法double getArea()。 (4) 提供一个判断当前圆对象与参数圆对象是否相交的方法(相交方式见下图): boolean isIntersected(Circle another) (5) 提供一个判断当前圆对象是否包含参数圆对象的方法(包含方式见下图): boolean contains(Circle another) (6) 提供一个判断当前圆对象与参数圆对象的大小关系的方法(判断依据是半径,半径之差的绝对值小于0.0001认为相等;返回负数表示当前圆对象小,0表示相等,正数表示当前圆对象) int compareTo(Circle another) (7) 提供返回当前圆的字符串的方法,格式为:[Circle(x,y)-raduis] String toString() 二、定义一个包含main方法的类TestCircle,位于shape包中。要求如下: (1) main方法中调用以下方法。 (2) 编写静态方法createArray,生成位置和大小均随机的10个圆对象,置于数组中。 (3) 编写静态方法sort对这10个圆对象进行升序排序,并输出。 (4) 编写静态方法computeArea计算这10个圆中互不相交和包含的圆的面积之和。 提交要求:打包为可以执行的JAR文档,其中要包含源程序文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值