第三章:面向对象(1)
第一部分:
1、什么是面向对象?
1.1、概念
- 面向对象是是一个抽象的概念,它相对的面向过程而言。
- 面向过程:强调的是功能行为,一种过程,先做什么,后做什么。
- 面向对象:将功能封装到对象里,强调的是具备某功能的对象;
1.2、举例理解
1.2.1、把大象放进冰箱需要分成3步:打开冰箱、把大象放进冰箱、关上冰箱;这些都是强调的过程,这个是一个标准的面向过程的例子;1.2.2、面向对象强调的是对象,找到冰箱,那么冰箱的所有功能就找到了;1.2.3、移动窗口,最小化窗口、关闭窗口;强调的是过程;面向过程1.2.4、窗口移动,窗口最小化,窗口关闭;强调的是窗口;面向对象;1.2.5、人开门;开门这个动作是门的行为,门里面有轴,门怎么开的,门是最清楚的,人只是给门的一个打开的信号。1.2.6、买电脑;1.2.7、公司招聘人;1.2.8、人在黑板上画圆
- 名词提炼:对象:Person,blackboard,circle;
- 有一个画圆的动作,画圆这个动作里面,用到了圆心,还有半径,所以要知道圆心和半径,才能把圆给画出来,而圆心和半径都是圆里面的数据,画圆的方法要操作圆心和半径这个数据,这两个数据在哪个对象的身上,是在圆身上具备的,所以是画圆的方法提供的;
1.2.9、列车司机紧急刹车1.2.10、两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子;1.2.11、一个小球从绳子的一端移动到了另一端;1.2.12、售货员正在统计售票小票上面的数据;
- 对象提炼:售货员、小票;
- 统计小票上的金额方法是售货员提供的,是票据自己算的,买的商品金额是多少是在这个小票里面,售货员只是调用了售货票据的getTotalMony(),这个方法;该方法是小票提供的;
1.3、图形理解
1.4、用代码的形式体现人开门
人开门:名词提炼法:把名词提炼出来封装成对象; 人 { 开门(门) { 门.开(); } } 门 { 门(){操作门轴} }
1.5、面向对象的好处
- 把复杂的问题简单化;
- 从以前的执行者过度到了现在了指挥者;
1.6、总结
面向对象设计:谁拥有数据,谁就对外提供操作这些数据的方法,把数据私有化了,以后要对这些数据,如修改或者删除;
2、面向对象的特征:
面向对象的三个特征:
- 封装
- 继承
- 多态
3、类和对象的关系
3.1、类:现实生活中事物的描述;3.2、对象:这类事物实实在在存在的个体;3.3、在java中描述是通过类的形式类体现的;3.4、对象在java中是通过new操作而产生的一个实实在在的实体,该实体在堆内存中;3.5、凡是数据多了,用实体来存储,对象也是用来存储数据用的,凡是用来存储数据的,都称为实体,都放在堆内存中;3.6、通过图列来描述类和对象的关系
- 描述汽车:汽车是通过图纸生产出来的,图纸就是汽车事物的描述,而通过图纸生产出来的都是实实在在的个体,图纸定义的是红色。有4个轮胎,每一个个体都具备演的和轮胎数;
- 对一个事物的描述就是在描述两个部分:第一个是事物的属性,第二个是事物的行为;
- 属性对应的是类中的变量,行为对应的是类的函数(方法);
- 其实定义类就是在描述事物,就是在定义属性和行为,属性和行为又共同成为类中的类中的成员,成员包括成员变量和成员函数;
- 属性-->成员变量
- 行为-->成员函数
4、成员变量和局部变量
成员变量:定义在函数外面的变量,成为成员变量;
特点:它们作用的范围不同,成员变量作用于整个类中,局部变量作用函数中或者for语句中,此外:在内存中的位置也是不同的,成员变量在堆内存中,因为对象的存在,才在内存中存在,而局部变量存在于栈内存中;
5、匿名对象
5.1、概念:顾名思义就是一个没有名字的对象,创建一个对象出来,没有赋给一个变量;5.2、特点:
- 对方法或者字段只进行一次调用;
- 可以作为实际参数进行传递;
- 只能在堆内存里面开辟存储空间;
5.3、举例:
class CarDemo { public static void main(String[] args) { new Car().num =5;//匿名对象就是没有名字的对象 new Car().color ="blue";//使用一次后就消失了; new Car().run(); } }
5.4、匿名对象的使用方式
- 当对对象的方法只调用一次的时候,可以用匿名对象完成,这样写比较简化,如果对一个对象进行多个成员调用,必须给这个对象起个名字;
- 可以将匿名对象作为实际参数进行传递;
6、封装
6.1、含义:是指隐藏对象的属性和实现细节,仅对外提供 公共访问方式。6.2、好处:
- 将变化隔离。
- 便于使用。
- 提高重用性。
- 提高安全性。
6.3、代码体现
class Person { private int age; public void setAge(int a) { if(age>0 && age<130)//如果判断成功了,就调用speak方法 { age =a; speak(); } else { System.out.println("feifa age"); } } public int getAge() { return age;//返回一个age,需要一个return。 } public void speak() { System.out.println("age="+age); } } class PersonDemo { public static void main(String[] args) { Person p = new Person(); //p.age =20; p.setAge(50); p.speak(); } }
7、构造函数
7.1、特点:
- 函数名与类名相同
- 不用定义返回值类型
- 不可以写return语句
注意:构造函数的特点是:函数名和类名是相同的,是不需要定义返回值类型的,和void不相同,void是没有具体的返回值类型;
7.2、对象一建立就调用与之对应的构造函数;
7.3、构造函数的作用:可以用于给对象进行初始化;也就是说当在堆内存中产生对象,这个对象需要一个初始化动作;比如:人一初始化就会哭,哭就是人的初始化行为;
7.4、构造函数的一个小细节:
当yield类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的狗仔函数,叫做Person(){}---->方便对象初始化,分i在对象是建立不出来的;当在类中自定义了构造函数时默认的构造函数就没有了;
7.5、用代码描述人:
class Person { private String name; private int age; //构造代码快。每个构造函数的对象都要执行, { //System.out.println("person code"); cry(); } // 对不同的构造函数分别进行初始化; Person() { System.out.println("name="+name+",,,age="+age); } // 重载 Person(String n) { name = n; System.out.println("name="+name+",,age="+age); } public void setName(String n) { name =n; } public String getName() { return name; } Person(String n,int a) { name = n; age = a; System.out.println("name="+name+",,,age="+age); } public void cry() { System.out.println("cry"); } } class PersonDemo2 { public static void main(String[] args) { Person p1 = new Person(); //p1.cry();//一般方法。 Person p2 = new Person("zhangsan"); // p2.setName("zhangsansan"); // p2.setName("zhangsansan33333"); // System.out.println(p2.getName()); Person p3 = new Person("lisi",49); } }
运行后的结果:
7.6、注意:
在描述人的时候,人这个对象一产生,要么有年龄,要么有姓名,不可能出现没有姓名,没有年龄的情况;
7.7、构造函数和一般函数的区别:
构造函数和一般函数在写法上有不同;
在运行上也有不同,构造函数是对象一建立就运行,给对象初始化,而一般方法的是对象调用才运行,是给对象具备的功能,一个对象建立,构造函数只运行一次,而一般方法可以被对象调用多次;
7.8、什么时候定义构造函数呢?
当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中,构造函数在进行定义时;
7.9、构造代码块
作用:给对象进行初始化,对象一建立就运行,而且优先于构造函数执行;
构造代码块和构造函数的区别:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象进行初始化;
有的孩子是有名字,有的孩子是没名字的,但是不管你有名字还是没名字,都要执行构造代码块;
8、this关键字
8.1、this关键字貌似是用来区分局部变量和成员变量;
8.2、this代表的是本类中的对象;本类中有那么的对象,到底代表哪一个?要将后面的name赋给对象中的name,最终是把具体值赋给某一个对象里面的name,真正运行的是对象,举例:用图纸造汽车,正真开上马路=的是汽车,也就是对象,
this代表它所在函数所属对象的引用;简单的说:哪个对象在调用this所在的函数,this就代表哪个对象;
8.3、代码表示:
class Person { private String name; private int age; Person() { System.out.println("name="+name+",,,age="+age); } Person(String name) { this.name = name; } Person(int age) { this.age = age; } Person(String name,int age) { // this.name = name;//this,谁调用我,我就代表谁。 this(name);//this语句 this.age = age; System.out.println("name="+name+",,,age="+age); } public boolean compare(Person p) { return this.age==p.age;//p2传给了p。 } public void speak() { System.out.println("name="+name+",,age="+age); } } class PersonDemo4 { public static void main(String[] args) { Person p1 = new Person("lisu",24); // Person p2 = new Person(24); // boolean b = p1.compare(p2); // System.out.println(b); // p1.speak(); //p1.cry();//一般方法。 // Person p2 = new Person("zhangsan"); // p2.setName("zhangsansan"); // p2.setName("zhangsansan33333"); // System.out.println(p2.getName()); // Person p3 = new Person("lisi",49); } }
this语句:用于构造函数之间调用this(name)---->this语句;
构造函数间调用只能用this语句,调用时要传相对应的参数;
this语句只能定义在构造函数的第一行,因为被初始化动作要先执行;