Java 语言基础05

Java 语言基础05

 

面向对象

1 面向对象(OO)
1) 什么是Object(对象), Object 本意:东西,是指一个具体事物实例
2) 面向对象, 面向客观事物之间的关系.
4) OOA面向对象分析/OOD 面向对象设计
   客人来了(来了一个客人类型的某人)
  
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
    |
    |
    |
    |
    |          . p(x,y)
    |
    |
    |
    |
   
    Y

构造器: 用来描述对象的初始化过程的.
语法要求: 1 构造器的名与类名一致
          2 不能定义返回值类型
          3 构造器可以重载

3 构造器(构造方法) 的作用: 用来描述对象的初始化过程的.
  1)
  如: 月饼实例的创建, 使用面和馅创建.
              制作(构造器)
  月饼模子(类)  -----> 月饼(对象)
              原料(构建参数)
            属性赋值
  点类型   -------->  点(3,4)
           坐标(3,4)
 
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() 是调用本类的其他构造器, 可以使用构造器的重用,
    简化代码的实现.
  * this() 必须写在构造器的第一行!

5) 构造方法重载: 参数不一样的构造器
     案例: Point.java
   方法签名 = 方法名+参数类型列表
   方法重载:a 方法名一样 b 方法参数不一样
     也可以说: 方法名一样, 方法签名不同的方法
    
6) 默认构造器
  1 java 类一定有构造器
  案例: ConstructorDemo.java
  2 如果类没有声明任何构造器,Javac自动提供一个
  默认构造器, 无参数默认构造器
  3 如果提供构造器声明, Javac将不再提供默认构
  造器.  
/**
* 构造器规则
*  1 类一定有构造器: 根本规则
*  2 默认构造器现象
*    A 如果类没有声明任何构造器, javac(编译器)自动添加默认构造器
*    B 如果类声明构造器, javac就不再添加默认构造器了!
*/
public class ConstructorDemo {
  public static void main(String[] args) {
    //Foo foo = new Foo(5);//编译错误, 没有Foo(int) 构造器!
    Foo foo = new Foo();//调用默认构造器
    //Goo goo = new Goo();//编译错误,Goo没有无参数构造器(默认构造器)
    //Goo 有构造器, 但是没有无参数构造器!
    Goo goo = new Goo(5);//调用有参数构造器Goo(int)
    System.out.println(goo.a);
  }
}
class Foo{// javac自动添加默认构造器: public Foo(){}
}
class Goo{//Javac 不再添加默认构造器
  int a;
  public Goo(int a) {
    this.a = a;
  }
}
 
4 对象的方法
1) 表示对象的功能, 依赖于对象存在.
  案例: Point.java
  如: p1.distance() 和 p2.distance()
  方法是动作,是功能,一般用动词声明. 
2)方法也经常重载, 重载:方法名一样, 参数不一样重载体现了,
   功能的多态.重载的方法经常互相重用.


案例1: 圆(Circle), 矩形(Rectangle)
         
     圆: 包含 圆心(Point)和半径(int)两个属性
     矩形: 包含 顶点和宽,高三个属性
     提供合理的构造器
     提供方法, 计算当前图形的面积
              计算当前图形是否包含(contains(Point))指定的点
              重载方法 contains(int x, int y) 图形是否包含坐标x,y 
public class Circle extends Shape 
{
	double radius = 0;
	Point p;
	public Circle(double radius,Point p)
	{
		this.radius = radius;
		this.p = p;
	}
	
	public double getArea()	
	{
		 return this.area= Math.PI*radius*radius;
	}
	public boolean contains(Point p)
	{
		return this.contains(p.x, p.y); 
	}
	public boolean contains(double x,double y)
	{
		double t = Math.sqrt((this.p.x-x)*(this.p.x-x)+(this.p.y-y)*(this.p.y-y));
		if(t<=this.radius)	return true;
		else return false;
	}
}

 public abstract class Shape {
	public  double area = 0;
	public  double circumference = 0;
	
	public abstract double getArea();
	public abstract boolean contains(Point p);	

}
public class Point {
	 double x;
	 double y;
	
	public Point (double x,double y)
	{
		this.x = x;
		this.y =y;
	}
}
 
案例2: 定义民政业务类 Person
   定义属性: 编号,名字,性别,年龄, 婚否, 身份证号, 地址, 电话,
           伴侣
   提供方法: 结婚, 参数是另外一个人
           定义合理的结婚规则
           结婚结果, 如果成功就合理更新双方的属性 婚否和伴侣,
           返回true, 代表结婚成功, 结婚失败就返回false

public class Person {
	int id;//编号
	String name;//名字
	char gender;//性别
	int age;//年龄
	boolean married;//婚否
	String cardId;//身份证号  
	String address;//地址
	String phoneNumber;//电话
	String parter;//伴侣 
	
	public boolean marry(Person p)
	{
		if ((this.gender!=p.gender)&&(this.parter==null&&p.parter==null)&&((this.gender=='男'&&this.age>=22)&&(p.gender=='女'&&this.age>=20))||((this.gender=='女'&&this.age>=20 )&& (p.gender=='男'&&this.age>=22)))
		{
			p.parter = this.name;
			p.married = true;
			this.parter = p.name;
			this.married = true;			
			return true;
		}
		else return false;
	}	
}

你可能感兴趣的:(java)