Java day5

第五章: Objects and Classes

一. OOP中的基本概念
Java的编程语言是面向对象的,采用这种语言进行编程称为
面向对象编程(Object-Oriented Programming, OOP), 它允许设
计者将面向对象设计实现为一个可运行的系统。Java的编程单位
是类,对象最后要通过类进行实例化(即“创建”)。
面向对象编程有三个特性:封装,继承,多态的概念
封装:对类中的属性和方法的具体实现进行封装(隐藏)
外界不可见
继承:继承父类中的属性和方法 extends
class 子类 extends 父类
都是单继承
多态:同一个领域中(继承同一个类或者实现同一个接口)的不同对象调用相同的方法表现不同
class 鸟 implments Common{
public void fly(){

}
}
class 飞机 implments Common{
public void fly(){

}
}

二. 类和对象
类是具有相同属性和行为的对象的集合。
对象是类的具体化,对象是唯一的。
面向对象的开发方法把软件系统看成各种对象的集合,
对象就是最小的子系统,一组相关的对象能够组合成
更复杂的子系统。面向对象的开发方法将软件系统看
成各种对象的集合,接近人的自然思维方式。

对象是对问题领域中事件的抽象。对象具有以下特性:
1) 万物皆为对象。问题领域中的实体和概念都可以抽象为对象。
    例如学生,成绩单、教师、课和教室。
2) 每个对象都是惟一的。正如世界上不存在一模一样的叶子。
3) 对象具有属性和行为。
   例如小张,性别女,年龄22,身高1.6m, 体重40kg, 能够学习,唱歌。
   小张的属性包括姓名、性别、年龄、身高和体重,
   行为包括学习、唱歌。
   例如一部手机,牌子是诺基亚、价格是2000元,银白色,能够拍照、打电话和收发短信等。
   这部手机的属性包括品牌类型type、价格price和颜色color,行为包括拍照takePhoto(),
   打电话call(),收发短信receiveMessage()和发短信sendMessage().
4) 对象具有状态。状态是指某个瞬间对象的各个属性的取值。
   对象的某些行为会改变对象自身的状态,即属性的取值。
   例如小张本来体重为40kg,经为减肥后,体重减35kg. 
   肥胖状态: 40kg
          |
          | 减肥行为
          |              
   肥胖状态: 35kg 
 
5) 每个对象都是某个类的实例。小张和小王都属于学生类、中国和美国都属于国家类、中文和英文都属于语言类。
同一个类的所有实例都有相同属性,但属性取值不一事实上相同,但是它们的状态不一定相同。
例如小张和小王都属于学生类,都有姓名、性别、年龄、身高和体重这些属性,但是他们的属
性取值不同。同一个类的所有实例都有相同行为,意味着它们具有一些相同的功能。
类是一组具有相同属性和行为对象的模板。面向对象编程的主要任务就是定义对象模型中的各个类。   
1) 类是一种类型:是引用类型;
2) 类是元数据:描述数据的数据,数据在面向对象领域里以对象的形式存在,
类是对象共有属性和方法的抽象描述。

Java程序是各种对象相互交互作用、而不是类。举例:
1) 早上到公司上班,在电梯中碰到总经理我们会说,
张总早或王总早,会不会说人早呀!那非得把你抄鱿鱼不可。
2) 我们要看电视,是买台电视机,而不是买制作电视机的模具;

在java中,类的申明和实现在同一时间,而且必须在一起,前面我们已经做过很多的例子。
在C++中,类的申明和实现可以被分开,不知道也没有关系,这只是让我们了解下两者的区别。

三. 定义方法形式
格式: 修饰符s 返回类型 方法名(参数列表)异常抛出类型{方法体}

参数列表:传入数据
返回值类型:传出数据的类型
          没有返回值,必须写void
修饰符:访问修饰符public,private或者static,final。
       没有优先级

public int getValue(int value){
if(value>10){
return value+10;
}
}

四. 参数传递:实参传递给形参
形参:方法声明时的参数
实参:方法调用时传递的参数
1)值传递:传递的是数值
参数是基本数据类型的时候,采用值传递
2)地址传递:传递的是地址
参数是引用数据类型的时候,采用地址传递

五. this关键字:当前对象
1)区分实例变量和局部变量
this.name=name;
2)调用本类的构造器
this(参数列表);
3)调用本类的方法
this.方法名()

六. 数据隐藏
好处:防止外界进行非法修改
如何实现:1)数据的访问修饰符private
2)提供统一的操作(属性的set,get)
数据隐藏就是封装的一个方面,封装的另一个方面隐藏方法。

七. 方法重载
对于类的方法(包括从父类中继承的方法),
如果有两个方法的方法名相同,但参数不一致,
那么可以说,一个方法是另一个方法的重载方法。
这种现象叫重载。
方法的重载满足的条件:
1)在同一个类中
2)方法名相同
3)参数列表不相同
a)参数个数不相同 ||
b)参数类型不相同 ||
c)参数列表的顺序不相同
4)返回值类型可以不同
5)访问修饰符可以不同

在一个类中不允许定义两个方法名相同,
并且参数签名也完全相同的方法。
因为假如存在这样的两个方法,
Java虚拟机在运行时就无法决定到底
执行哪个方法。参数签名是指参数的类型、个数和顺序。

八. 创建和初始化对象(new)
Person p=new Person();
public class Person{
private String name=“briup”;
}
1)在栈区开辟空间保存对象的引用
2)在堆区开辟空间保存对象本身的数据
3)堆区的地址赋值给栈区的对象的引用
4)为对象的属性进行默认初始化(系统完成)
5)为对象的属性进行显示初始化,比如人的最大年龄100
6)调用普通代码块{}
7)调用构造器

九. 构造方法
构造器:根据用户需求传入数据,
然后根据传入数据对属性进行初始化。
作用:为属性进行初始化
1)方法名和类名相同
2)没有返回值类型
3)构造的重载(根据不同的情况调用不同的构造器进行相应的初始化)
调用本类的构造器:this(参数列表),必须放在方法的第一行
4)系统会提供一个无参的构造器,
但是如果本类实现了其他的构造器,系统提供的无参构造器失效。
public class Test{
public Test(){}
public void Test(){} //普通的方法
}

十:继承
好处:代码复用,简化编程
代码复用用在哪些地方:
1)复用父类的属性
2)复用父类的方法(直接调用父类的方法)
3)重写父类的方法
实现:class 子类 extends 父类
单继承
关系:子类 is a 父类 或者 子类 is a like 父类
class Student extends Person
student is a Person
Person is a Student(error)
子类继承父类哪些:
1)构造器不能继承
2)方法和属性全部继承

继承注意的问题:
1)创建一个子类对象必须先创建一个父类对象
2)子类的构造器会默认调用父类的无参构造器
super();
3)父类的无参构造器失效,
子类构造器就需要显式的调用父类存在的其他构造器
super(参数列表); 必须放在构造器的第一行
4)当一个子类继承了一个父类后,
父类中所有的字段和方法都被子类继承拥有,
子类可以任意的支配使用,
每个子类对象中都拥有了父类中的所有字段。
当构造一个子类的实例对象时,
该对象的实例变量包括了子类本身以及父类中的所有实例变量,
实例方法也包括了子类和父类中的所有实例方法。
子类构造器用来初始化子类中所有的实例变量,
而父类构造器super(实参)用来初始化父类中所有的实例变量。
那么在堆中为子类实例对象分配的内存区域中
包括了子类和父类中所有初始化后的实例变量。
5)在构造器同时出现this和super:不能够。

十一:super代表父类对象
this代表当前对象
1)调用父类的属性(很少用)
super.name=name;
2)调用父类的构造器
super(参数列表);
3)调用父类的方法(子类中包含和父类相同的方法名)
super.方法名(参数列表);

十二:方法的重写
条件:当父类的方法不能够满足子类方法的需求。
就可以对父类的方法进行重写
1)发生在子父类
2)方法名必须相同 &&
参数列表必须相同 &&
返回值类型必须相同
3)可见性(访问修饰符)不能变小
4)异常不能扩大
加上@Override让编译器来检查是否是一个重写方法

一:多态 (面向接口的编程,统一接口的编程)
概念:同一领域中的不同对象调用相同的方法表现不一样
Person p=new Student();
静态数据类型:变量申明时候的类型,编译时
动态数据类型:创建对象时的数据类型,运行时
对象真正的数据类型是动态数据类型决定的,运行时数据类型

实现多态必须满足什么条件:
1)子类必须重写父类中的方法
2)父类的引用指向子类的对象

二:数据类型转换

  1. 先使用instanceof 识别类型
  2. 子类型隐式地扩展到父类型(自动转换)
  3. 父类型必须显式地缩小到子类型

转换规则:被转换的实际对象类型一定是转换以后类型的自身或者子类。
ClassCastException:类型转换异常
尽量把错误控制在编译期
instanceof:数据类型转换之前进行判断该对象是否是该类的实例

三:对象与对象的关系
is a:继承关系
has a:包含关系(组合,聚合)
use a:使用关系(参数传递时)

组合:整体和部分同时存在同时消亡
创建整体对象的时候,将部分对象一起创建。
人和手就是组合关系
聚合:整体和部分不是同时存在不是同时消亡
人和电脑就是聚合关系
人和地址也是聚合关系

组合关系:比如A类中包含B类的一个引用b,当A类的一个对象消亡时,
b这个引用所指向的对象也同时消亡。
聚合关系:反之b所指向的对象还会有另外的引用指向它。

现实生活中,人和手,脚是组合关系,因为当人死后
手和脚就不复存在了。
人和电脑就是聚合的关系

class Hand{}
class Computer{}
组合:
class Person{
private Hand hand;
public Person(){
hand=new Hand();
}
}
聚合:
class Person{
private Computer computer;
public setComputer(){
computer = new Computer();
}
}

组合聚合的区别和联系:
1)整体与部分的关系:组合的关系更强一些。对于组合
来说,如果失去整体,部分将不存在了。
2)代码实现来看:组合在整体的构造器中实例化部分,
这个部分不能被其他实例共享。整体和部分的生命周期
是同步的。而聚合关系的部分,可以在构造器中通过
参数传递的形式进行初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值