---------------------- <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 }
成员变量和局部变量的区别
成员变量作用于整个类中
局部变量作用于函数中,或者语句中
在内存中的位置
成员变量在堆内存中,因为对象的存在,才在内存中存在
局部变量在栈内存中
匿名对象:
匿名对象是对象的简化形式
匿名对象两种使用情况
- 匿名对象使用方式一:当对对象方法只调用一次时,可以用匿名对象来完成,这样写比较简化,如果对一个对象进行多个成员调用,必须给这个对象起个名字
例:
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 PersonDemo22 {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 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>