—— android培训、java培训、期待与您交流! ———-
面向对象
1.1、概念
面向对象是相对面向过程而言,面向对象和面向过程都是一种思想
面向过程:(强调功能行为)
强调的是功能行为。代表语言:C语言。
面向对象:(强调对象)
将功能封装进对象,强调具备了功能的对象。代表语言:Java、C++、C#。
1.2、优点
1:将复杂的事情简单化。
2:面向对象将以前的过程中的执行者,变成了指挥者。
3:面向对象这种思想是符合现在人们思考习惯的一种思想。
1.3、完成过程
1. 明确所需的功能,找到具有所需的功能的对象。
2. 如果该对象不存在,那么创建一个具有所需功能的对象。
3. 调用相应的功能方法,完成功能
1.4、面向对象的特征:
1.4.1、封装:
1、含义:
隐藏对象的属性和实现细节,仅对外提供公共访问方式。如对于属性 xxx,
可以使用setXXX(),getXXX()对其进行操作。
2、好处:
将变化隔离;便于使用;提高重用性;安全性。
3、封装原则:
将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
1.4.2、继 承
1、含义
利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是
复用(继承)这些类的方法和域。在此基础上,还可以添加一些新的方法和域,以满足新的需
2、好处
1)提高了代码的复用性。
2)让类与类之间产生了关系,提供了另一个特征多态的前提
3、基本原则
只支持单继承,但对于一个继承体系的使用,可以查阅顶层父类中的内容,创建最底层子类的对象。
A继承B B继承C C继承D,那么A就可以继承到 D的方法。
4、继承的细节:
1)什么时候使用继承呢?
当类与类之间存在着所属关系时,才具备了继承的前提。英文书中,所属关系:" is a "
注意:
不要仅仅为了获取其他类中的已有成员进行继承。
所以判断所属关系,可以简单看,如果继承后,被继承的类中的功能,都可以被该子类所具备,
那么继承成立。如果不是,不可以继承。
2)在方法覆盖时,注意两点:
1:子类覆盖父类时,必须要保证,子类方法的权限必须大于等于父类方法权限可以实现继承。
否则,编译失败。
2:覆盖时,要么都静态,要么都不静态。 (静态只能覆盖静态,或者被静态覆盖)
弊端:
打破了封装性。对于一些类,或者类中功能,是需要被继承,或者复写的。
1.4.3、多态
1、含义
函数本身就具备多态性,某一种事物有不同的具体的体现。
2、体现
父类引用或者接口的引用指向了自己的子类对象。Animal a = new Cat();
3、好处
提高了程序的扩展性。
4、思想上
多态的出现思想上也做着变化:以前是创建对象并指挥对象做事情。有了多态以后,我们可以找到
对象的共性类型,直接操作共性类型做事情即可,这样可以指挥一批对象做事情,即通过操作父类或接口实现。
5、多态的前提:
1)必须要有关系,比如继承、或者实现。
2)通常会有覆盖操作。
6、弊端
当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,
不可以访问子类中特有的方法。(前期不能使用后期产生的功能,即访问的局限性)
如果想用子类对象的特有方法,如何判断对象是哪个具体的子类类型呢?
可以可以通过一个关键字 instanceof判断对象是否实现了指定的接口或继承了指定的类
格式:<对象 instanceof 类型> ,判断一个对象是否所属于指定的类型。
Student instanceof Person = true;
//student继承了person类
2.0 关系
java中描述事物通过类的形式体现,类是具体事物的抽象,概念上的定义,
也就是对象的抽象描述。对象即是该类事物实实在在存在的个体。
2.0、类与对象
2.1、类
过程和对象在我们的程序中是如何体现的呢?过程其实就是函数;对象是将函数等一些内容进行了封装。
1、 类的定义
生活中描述事物无非就是描述事物的属性和行为。如:人有身高,体重等属性,有说话,打球等行为。
Java中用类class来描述事物也是如此。
属性:对应类中的成员变量。
行为:对应类中的成员函数。
定义类其实在定义类中的成员(成员变量和成员函数)。
在类中定义其实都称之为成员。成员有两种:
1:成员变量:其实对应的就是事物的属性。
2:成员函数:其实对应的就是事物的行为。
所以,定义类,就是在定义成员变量和成员函数。但是在定义前,必须先要对事物进行属性和行为的分析,才可以用代码来体现。
2、匿名对象
1:当对方法只进行一次调用的时候,可以使用匿名对象。
2:当对象对成员进行多次调用时,不能使用匿名对象。必须给对象起名字。
例:
class Car{
int num;
String color;
}
class CarDemo{
public static void main(String[] args){
//匿名对象可以作为实际参数进行传递
show(new Car());
}
public static void show(Car c){
c. num = 3;
c. color = "black" ;
System.out.println("function show is running!" );
System.out.println(c.num + "..." + c. color);
}
}
// 3...black
3、变量
1)成员变量:
1. 成员变量定义在类中,在整个类中都可以被访问。
2. 成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
3. 成员变量有默认初始化值。
2)局部变量:
1. 局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
2. 局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
3. 局部变量没有默认初始化值。
4、 创建对象,使用对象
1)例:
//对Person这类事物进行描述
class Person
{
//成员变量
private String name= "";
private int age= 0;
//初始化
Person(String name,int age){
this.name=name;
this.age=age;
}
//成员方法
void show()
{
//输出变量的值
System.out.println("name= " +name+"...age= " +age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
//通过new关键字,建立对象
//p就是一个类类型的引用变量,指向了该类的对象
Person p = new Person("zhangsan",24);
//输出成员变量的属性值
System.out.println(p.age );
//通过对象.成员的形式来使用对象的功能
p.show();
}
}
/*只要是用new操作符定义的实体就在会堆内存中开辟一个新的空间,并且每一个对象中都有一份属于自己的属性。
通过对象.对象成员的方式操作对象中的成员,对其中一个对象的成员进行了修改,和另一个对象没有关系。*/
5、函数
5.1、构造函数
用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种。
特点:
1)该函数的名称和所在类的名称相同。
2)不需要定义返回值类型。
3)该函数没有具体的返回值。
记住:所有对象创建时,都需要初始化才可以使用。
注意事项
一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数的构造函数,为了方便该类创建对象,完成初始化。如果在类中自定义了构造函数,那么默认的构造函数就没有了。
一个类中,可以有多个构造函数,因为它们的函数名称都相同,所以只能通过参数列表来区分。所以,一个类中如果出现多个构造函数。它们的存在是以重载体现的。
5.2、构造函数和一般函数的区别
1)两个函数定义格式不同。
2)构造函数是在对象创建时,就被调用,用于初始化,而且初始化动作只执行一次。
一般函数,是对象创建后,需要调用才执行,可以被调用多次。
5.3、使用
分析事物时,发现具体事物一出现,就具备了一些特征,那就将这些特征定义到构造函数内。
5.4、构造代码块和构造函数的区别
1)构造代码块
是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块。只要对象一建立。就会调用这个代码块。
2)构造函数
是给与之对应的对象进行初始化。它具有针对性。
6、其他
创建一个对象都在内存中做了什么事情?
1:先将硬盘上指定位置的Person.class文件加载进内存。
2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),
然后在main方法的栈区分配了一个变量p。
3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
5:对空间中的属性进行显示初始化。
6:进行实体的构造代码块初始化。
7:调用该实体对应的构造函数,进行构造函数初始化。()
8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)