黑马程序员--面向对象(一)封装、成员变量与局部变量、匿名对象、构造函数、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 }
成员变量和局部变量的区别
成员变量作用于整个类中
局部变量作用于函数中,或者语句中
在内存中的位置
成员变量在堆内存中,因为对象的存在,才在内存中存在
局部变量在栈内存中
匿名对象:
匿名对象是对象的简化形式
匿名对象两种使用情况
- 匿名对象使用方式一:当对对象方法只调用一次时,可以用匿名对象来完成,这样写比较简化,如果对一个对象进行多个成员调用,必须给这个对象起个名字
例:
Car c=new Car ();
c.num=5;
这两句话可以简写成一句换:
new Car ( ).num=5;
- 匿名对象使用方式二:匿名对象可以作为实际参数进行传递
例:
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 }
构造函数:
特点:
- 函数名与类名相同
- 不用定义返回值类型
- 不可以写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
结论:对象一建立就会调用与之对应的构造函数
作用:
可以用于给对象进行初始化
注意:
- 默认构造函数的特点:
当一个类中没有定义构造函数时,那么系统会默认给该类加一个空参数的构造函数
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>