1.面相对象理解:
面相对象是相对于面向过程而言的,两者都为一种编程思想,面向对象认为一切皆为对象,将功能封装进对象,强调具备了功能的对象,通过对象去描述事物。面向对象可以让复杂问题简单化,能让我们进行角色转变,从执行者变为指挥者。面向对象有三个最基本的特性,即:封装,继承,多态。
2.面向对象的三个特征
(1)封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作;
(2)继承:继承是可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展;(3)多态:多态是允许将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句 话:允许将子类类型的指针赋值给父类类型的指针。
3.类和对象的关系
(1)类是对现实生活中事物的描述。
(2)对象是这类事物实实在在的一个个体
(3)描述事物和Java中类的关系
[1]定义类就是在描述事物,就是在定义属性和行为。属性和行为共同成为类中的成员(属性对应成员变量,行为对应成员方法)。
[2]在Java中产生一个类的实体就是用new来创建类的对象
(4)成员变量和局部变量
[1]作用范围
成员变量作用于整个类中。
局部变量作用于函数中,或者语句中。
[2]在内存中的位置
成员变量在对内存中,因为对象的存在,才在内存中存在;局部变量存在栈内存中。
4.匿名对象
(1)匿名对象与普通对象的关系
[1]对象可以有名字,也可以没有名字。没有对象名的对象就是匿名对象。
[2]匿名对象是普通对象的简化形式。
(2)匿名对象对属性和方法的调用
[1]匿名对象直接调用属性是没有意义的,原因就是匿名对象没有名字,也就是没有引用变量在栈内存中直接指向堆内存中的匿名对象。因此 new Car(). num =5;执行完之后,匿名对象就变成了垃圾,会被回收掉。那么对其属性的读写操作也就没有什么意义了。
[2]匿名对象直接调用方法是有意义的
(3)匿名对象的适用范围
[1]当对象的方法仅被调用一次的时候,可以使用匿名对象来简化书写。
匿名对象的弊端:但是如果对一个对象的多个成员进行调用的时候,匿名对象失去作用,必须给这个对象命名。如:
Car c = new Car();//对象多次使用,命名
c.run();
c.num = 4;
new Car().run();//只用一次,匿名
[2]可以将匿名对象作为实参进行参数传递。
show(new Car());//匿名对象直接作为参数进行传递
注意:当这个被调用的方法接受一个匿名对象并且执行完毕之后,这个堆内存中的匿名对象就变成了垃圾对象。
5.封装(Encapsulation)
(1)定义:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问的方式。之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断语句。对访问的数据进行操作,提高代码健壮性。
(2)封装的好处:将变化隔离,便于使用,提高重用性和安全性。
(3)封装的原则
[1]将不需要对外提供访问的内容隐藏起来;
[2]把属性都隐藏,提供公共方法对属性进行带有逻辑判断的访问。
(4)封装和私有的关系
[1]私有权限修饰符(private)用于修饰类中的成员(成员变量和成员函数)。仅仅为封装的一种表现形式;
[2]不私有同样也能实现封装。只要权限在你访问不到的权限的范围内,对你来说就是封装。
6.构造函数
(1)构造函数的特点
[1] 函数名和类名相同
[2]不用定义返回值类型
[3]不可以写return语句
(2)构造函数的作用:给对象进行初始化 (对象一建立就会调用与之对应的构造函数)
(3)构造函数小细节
[1]当一个类中没有显式定义构造函数时,系统就会默认给该类加入一个空参数的构造函数。
[2]当在类中显式定义了一个构造函数后,系统便不会给这个类在自动加入一个空参数的构造函数了。
(4)构造函数与一般函数的不同之处
[1]写法上不同
[2]运行上不同:构造函数在对象一建立的时候,就运行,给对象进行初始化。而一般方法是对象调用时才执行,给对象添加对象具备的功能。
[3]执行次数不同:一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次。
(5)什么时候定义构造函数?
当分析事物时,该事物存在具备一些特性或者行为,那么就将这些内容定义在构造函数中进行初始化。
(6)总结:构造函数和返回值类型为void的函数不写return的区别
构造函数是没有返回值类型,因此不可以写return。而返回值类型为void的函数没有具体的返回值,因此省略不写。
7.构造代码块
(1)作用:给对象进行初始化
对象以建立它就运行,而且优于构造函数执行。
(2)与构造函数的区别
构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化。
构造代码块中定义的是不同对象共性的初始化内容。
下边代码为构造函数和构造代码块的使用示例:
class Person
{
private String name;
private int age;
//构造代码块。
{
cry();
}
//构造函数
Person()
{
System.out.println("A: name="+name+",,age="+age);
}
Person(String n)
{
name = n;
System.out.println("B: name="+name+",,age="+age);
//cry();//哭是人类共性,将其定义在构造代码块中,进行统一初始化
}
Person(String n,int a)
{
name = n;
age = a;
System.out.println("C: name="+name+",,age="+age);
//cry();
}
public void cry()
{
System.out.println("cry......");
}
}
class PersonDemo2
{
public static void main(String[] args)
{
/*
三个个Person对象,分别指定用不同的构造函数进行初始化。个性的初始化
但是,在每一个构造函数运行之前,构造代码块都对这两个对象进行统一的共性初始化
*/
Person p1 = new Person();//调用空参数构造函数进行初始化
Person p2 = new Person("lisi");//调用非参数构造函数进行初始化
//System.out.println(p2.getName());
Person p3 = new Person("wnagu",10);//调用非参数构造函数进行初始化
}
}
8.this关键字
(1)作用:适用于区分局部变量和成员变量同名的情况。
(2)特点:代表本类的对象,具体代表他所在函数所属对象的引用。简单说,哪个对象在调用this所在函数,this就代表哪一个对象。
(3)应用:当定义类中功能时,该函数内部就要用到调用该函数的对象,这时用this来表示这个对象,但凡本类功能内部使用了本类对象,都用this表示。
(4)this在构造函数间调用:构造函数间调用只能用this语句,this语句只能放在构造函数第一行,因为构造函数要先执行。
下面是一个小例子:
class Person
{
//定义私有的name和age
private String name;
private int age;
//构造函数
Person(int age)
{
this.age = age;
}
Person(String name)
{
this.name = name;
}
Person(String name,int age)
{
this.name = name;
this.age = age;
}
//使用内部方法调用age和name写法
public void spe()
{
System.out.println("name="+this.name+"...age="+this.age);
this.show();
}
public void show()
{
System.out.println(this.name);
}
}