黑马程序员--面向对象(一)封装、成员变量与局部变量、匿名对象、构造函数、this关键字

 

面向对象

l  理解面向对象

l  面向对象是相对面向过程而言

l  面向对象和面向过程都是一种思想

l  面向过程: 强调的是功能行为

l  面向对象: 将功能封装进对象,强调具备了功能的对象

l  面向对象是基于面向过程的

 

面向对象的三大特征

封装,继承,多态

以后开发:其实就是找对象使用,没有对象,就创建对象

找对象,建立对象,使用对象,维护对象

类和对象的关系:

类就是:对现实生活中事物的描述

对象:就是这类事物,实实在在存在的个体

例:

现实生活中的对象:张三,李四

想要描述:提取对象中的共性内容,对事物的抽象

描述时:这些对象的共性有:姓名,年龄,性别,学习功能

映射到Java中,描述就是class定义的类

具体对象就是对应java在堆内存中用new建立的实体

 

描述事物其实就是在描述事的属性与行为。

属性:对应是类中变量,行为:对应的类中的函数(方法),

其实定义类就是在描述事物,就是在定义属性和行为,属性和行为共同成为类中的成员(成员变量和成员方法)

例:描述汽车(颜色,轮胎数)

 1 class  car
 2 {
 3     //描述颜色
 4     String color="红色" 5     //描述轮胎数
 6     int num=4;
 7     //运行行为
 8     void run(){
 9         System.out.println(color+".."+num);
10     }
11 }
12 class CarDemo
13 {
14     public void static main(Stirng [] args){
15         //生产汽车,在java中通过new操作符来完成
16         //其实就是在对内存产生一个实体
17         Car c=new Car();//就是一个类类型变量,记住:类类型变量指向对象
18         //需求:将已有的颜色改成蓝色,指挥该对象做,使用.在java指挥方式是:对象.成员
19         c.color="bule";
20         c.run();
21 
22         Car c1=new Car();//新的车
23         c1.run();
24     }
25 }

成员变量和局部变量的区别

成员变量作用于整个类中

局部变量作用于函数中,或者语句中

在内存中的位置

成员变量在堆内存中,因为对象的存在,才在内存中存在

    局部变量在栈内存中

 

匿名对象:

匿名对象是对象的简化形式

匿名对象两种使用情况

  1. 匿名对象使用方式一:当对对象方法只调用一次时,可以用匿名对象来完成,这样写比较简化,如果对一个对象进行多个成员调用,必须给这个对象起个名字

例:

Car c=new Car ();

c.num=5;

这两句话可以简写成一句换:

new Car ( ).num=5;

 

  1. 匿名对象使用方式二:匿名对象可以作为实际参数进行传递

例:

Car q=new Car();

show(q);

public static void show(Car c){

           c.num=3;

c.color=”black”;

c.run();

}

 

使用匿名类简化

Show(new Car());

public static void show(Car c){

           c.num=3;

c.color=”black”;

c.run();

}

 

 

 

封装(Encapsulation

封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式

好处

将变化隔离

便于使用

提高重用性

提高安全性

封装原则:

将不需要对外提供的内容都隐藏起来

把属性都隐藏,提供公共方式对其访问

 

如何封装:

可以使用private形式:注意:私有仅仅是封装的一种表现形式

Private :私有,权限修饰符,用于修饰类中的成员(成员变量,成员函数)

(私有只在本类中有效)

当使用private修饰成员后,其他类不能访问被private修饰的成员,所以这是需要一些对外提供的方法,可以进行访问与修改

之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断等语句,对访问的数据进行操作,提高代码健壮性

 

例:

 1 class  Person
 2 {
 3     private int age;
 4     //定义对外提供的方法,用于对age的修改
 5     public void setAge(int a){
 6         if(a>0&&a<130){
 7             age=a;
 8             speak();
 9         }
10         else{
11             System.out.println("年龄错误");
12         }
13     }
14     public int getAge(){
15         return age;
16     }
17     void speak(){
18         System.out.println("age="+age);
19     }
20 }
21 class PersonDemo
22 {
23     public static void main(String[] args) {
24         Person p=new Person();
25         p.setAge(20);
26     }
27 }

 

 

构造函数:

特点

  1. 函数名与类名相同
  2. 不用定义返回值类型
  3. 不可以写return语句
 1 例:
 2 class  Person
 3 {
 4     Person(){
 5         System.out.println("Person run");
 6     }
 7 }
 8 class PersonDemo2
 9 {
10     public static void main(String []args){
11         Person p=new Person();
12     }
13 }

结果:Person run

结论:对象一建立就会调用与之对应的构造函数

作用

可以用于给对象进行初始化

注意:

  1. 默认构造函数的特点:

当一个类中没有定义构造函数时,那么系统会默认给该类加一个空参数的构造函数

Person (){}

当在类中定义了构造函数后,默认的构造函数就没有了

这个默认的构造函数的权限和所属类一致

如果类被public修饰,那么默认的构造函数也带public修饰符

如果类没有被public修饰,那么默认的构造函数,也没有public修饰

默认构造函数的权限是随着类的变化而变化的

 

 2. 构造函数在运行上与一般方法的不同:

构造方法是在对象一建立就运行,给对象初始化,而一般方法是对象调用才执行,给对象添加对象具备的功能

一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次

 

3.多个构造函数是以重载的形式存在的

例:

 1 class Person 
 2 {
 3     private String name;
 4     private int age;
 5     //默认的构造函数
 6     Person(){
 7         System.out.println("A:name="+name+",,age="+age);
 8     }
 9     //方法的重载:方法名一样,参数列表不同
10     Person(String n){
11         name=n;
12         System.out.println("B: name="+name+",,age="+age);
13     }
14     Person(String n,int a){
15         name=n;
16         age=a;
17 System.out.println("C: name="+name+",,age="+age);
18     }
19 }
20 class PersonDemo3
21 {
22     public static void main(String [] args){
23         Person p1=new Person();
24         Person p2=new Person("lisi");
25         Person p3=new Person("wangwu",10);
26     }
27 }

什么时候定义构造函数?

当分析事物时,该事物存在就具备一些特性或者行为,那么将这些内容定义在构造函数中

 

构造代码块:

作用:给对象进行初始化

对象一建立就运行,而且优先于构造函数执行和构造函数的区别

构造代码块是给所有对象进行提议初始化,而构造函数是给对应的对象初始化,构造代码块中定义的是不同对象:共性的初始化内容,当你想每次new对象的时候都需要有相同的操作时,使用构造代码块

注意:每次每个对象实例化都会执行它

语法:

         语句;

 

例:

 1 class Person 
 2 {
 3     private String name;
 4     private int age;
 5     //构造代码块
 6     {
 7         System.out.println("构造代码块");
 8     }
 9       Person(){
10         System.out.println("A:name="+name+",,age="+age);
11     }
12     Person(String n){
13         name=n;
14         System.out.println("B: name="+name+",,age="+age);
15     }
16 }
17 class PersonDemo3
18 {
19     public static void main(String [] args){
20         Person p1=new Person();
21         Person p2=new Person("lisi");
22     }
23 }

结果:

 

 

this 关键字

this:就代表本类的对象

this代表他所在函数所属对象的引用

简单说:哪个对象在调用this所在的函数,this就代表哪个对象

this的应用:

1.成员变量和局部变量重名,可以用this来区分

当定义类中功能时:该函数内部要用到调用函数的对象时,这时用this来表示这个对象,但凡本类功能内部使用到了本类对象,都用this表示

 

 

例:

 1 class Person 
 2 {
 3     private String name;
 4     private int age;
 5     //当成员变量和局部变量,用this来区分
 6     Person(String name){
 7         this.name=name;//this代表本类对象,谁调用它this代表谁
 8     }
 9     Person(String n,int a){
10         name=n;
11         age=a;
12     }
13     public void speak(){
14         System.out.println("name="+name+"...age="+age);//省略了this:this.name;this.age
15         show();//也省略了this:this.show();
16     }
17     public void show(){
18         System.out.println(name);//其实都省略了this:this.name
19     }
20 }
21 class PersonDemo4
22 {
23     public static void main(String []args){
24         Person p=new Person("lisi");
25         Person p1=new Person("zhangsan");
26         p.speak();
27         p1.speak();
28 
29     }
30 }

结果:

 

需求:定义功能:给人定义一个用于比较年龄是否相同的功能,也就是是否是同龄人

 1 class Person
 2 {
 3     private int age;//年龄
 4     Person(int age){//Person类的构造方法
 5         this.age=age;
 6     }
 7     public boolean compare(Person p){
 8         return this.age==p.age;//这里的this指p1,因为p1.compare(p2),是p1调用的它
 9     }
10 }
11 class  PersonDemo5
12 {
13     public static void main(String []agrs){
14         Person p1=new Person(20);
15         Person p2=new Person(25);
16         boolean b=p1.compare(p2);
17         System.out.println(b);
18     }
19 }

2.构造函数间的调用:this语句

用于构造函数间进行互相调用

this语句只能定义在构造函数的第一行

因为初始化要先执行,并且只执行一次

this语句只能用在构造函数间

 

 

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>

posted @ 2013-12-27 01:25  h19891117  阅读(265)  评论(0编辑  收藏  举报