黑马程序员_面向对象(1)

来源:互联网 发布:java自行车是高端的吗 编辑:程序博客网 时间:2024/05/29 04:47

------- android培训、java培训、期待与您交流! ----------

第三章:面向对象(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关键字貌似是用来区分局部变量和成员变量;

要将后面的name赋给对象中的name,最终是把具体值赋给某一个对象里面的name,真正运行的是对象,举例:用图纸造汽车,正真开上马路=的是汽车,也就是对象,

8.2、this代表的是本类中的对象;本类中有那么的对象,到底代表哪一个?

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语句只能定义在构造函数的第一行,因为被初始化动作要先执行;

0 0
原创粉丝点击