博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
黑马程序员--面向对象(一)封装、成员变量与局部变量、匿名对象、构造函数、this关键字...
阅读量:5281 次
发布时间:2019-06-14

本文共 6269 字,大约阅读时间需要 20 分钟。

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

 

面向对象

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 CarDemo13 {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 PersonDemo22 {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 PersonDemo321 {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 PersonDemo318 {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.age15         show();//也省略了this:this.show();16     }17     public void show(){18         System.out.println(name);//其实都省略了this:this.name19     }20 }21 class PersonDemo422 {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 PersonDemo512 {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>

转载于:https://www.cnblogs.com/hjiangsj/p/3493405.html

你可能感兴趣的文章
Matlab parfor-loop并行运算
查看>>
string与stringbuilder的区别
查看>>
2012-01-12 16:01 hibernate注解以及简单实例
查看>>
iOS8统一的系统提示控件——UIAlertController
查看>>
PAT甲级——1101 Quick Sort (快速排序)
查看>>
python创建进程的两种方式
查看>>
1.2 基础知识——关于猪皮(GP,Generic Practice)
查看>>
迭代器Iterator
查看>>
java易错题----静态方法的调用
查看>>
php建立MySQL数据表
查看>>
最简单的线程同步的例子
查看>>
旅途上看的电影和观后感
查看>>
Ztree异步树加载
查看>>
关于IE和火狐,谷歌,Safari对Html标签Object和Embed的支持问题
查看>>
poj3320 Jessica's Reading Problem(尺取思路+STL)
查看>>
分布式计算开源框架Hadoop介绍
查看>>
安卓平台接口剖析
查看>>
坏的事情不都会带来坏的结果
查看>>
RPC的基础:调研EOS插件http_plugin
查看>>
第二次团队冲刺第二天
查看>>