面向对象
面向对象的特点:
- 面向对象是相对面向过程而言;
- 面向对象和面向过程都是一种思想;
- 面向过程强调的是功能行为;
- 面向对象:将功能封装进对象,强调具备了功能的对象;
- 面向对象是基于面向过程的;
面向对象的三个特征:
- 封装;
- 继承;
- 多态;
实际开发中就是找对象使用,没有对象就创建对象;找对象,建立对象,使用对象,维护对象的关系;
类和对象的关系:
- 类:就是对现实事物的描述;
- 对象:就是这类事物,实实在在存在的个体,创建对象就是创建这个类所描述的事物的实体;
类中的成员变量和局部变量:
- 成员变量:定义在类中的成员位置上,作用于整个类中,在堆内存中,因为对象的存在而存在;
- 局部变量:定义在局部,作用于函数中或者语句中,存在于栈内存中,使用完即被释放;
创建的类中可以写主函数(此时创建的类可独立运行),但一般创建的类中不用写主函数,因为一个程序会有很多类组成,但仅需一个主函数即可;
创建对象:
- 要想使用某个类中的方法,需先创建这个类的对象,通过对象调用相应的方法(静态方法可直接通过:类名.方法名 即可调用),创建对象的格式:
类名 变量名=new 类名();
例:String string=new String();
创建匿名对象:
- 匿名对象是对象的简化形式;
- 匿名对象的两种使用情况:
- 当对象方法仅进行一次调用的时候;
创建匿名对象无需声明引用类型及方法名,直接new对象即可;
例:String string=new String();
String.length();
以上两句可直接简化为:new String().length();
注:当一个对象被多次调用,则必须给对象起名; - 匿名对象可以作为实际参数进行传递;
例:创建一个集合往集合中添加一个字符串;
ArrayList list=new ArrayList();
list.add(new String(new char[]{‘a’,’b’,’c’}));//该语句中对象作为参数传递;
- 当对象方法仅进行一次调用的时候;
面向对象:封装(Encapsulation)
- 封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式;
- 封装的好处:将变量隔离;
便于使用;
提供重用性;
提高安全性; - 封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问;
一般类中的每个属性都对应2个访问方式:get()、set(),有几个属性就对应几对访问方式,之所以对外提供访问方式就是因为类中的属性private时对外提供对应的方法对其进行访问,可以在访问方式中加入逻辑判断等语句,对访问数据进行操作,提高代码的安全性和健壮性。
private关键字
- private :私有,权限修饰符:用于修饰类中的成员(成员变量,成员函数)。
- 私有只在本类中有效。
- 将age私有化以后,类以外即使建立了对象也不能直接访问。
但是人应该有年龄,就需要在Person类中提供对应访问age的方式。 - 注意:私有仅仅是封装的一种表现形式。
- 之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断等语句。
- 对访问的数据进行操作。提高代码健壮性。
示例代码:
class Person
{
private int age;
public void setAge(int a)
{
if(a>0 && a<130)
{
age = a;
speak();
}
else
System.out.println("feifa age");
}
public int getAge()
{
return age;
}
private void speak()
{
System.out.println("age="+age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
//p.age = -20;//成员私有后在类外面即使创建对象也不能访问;
p.setAge(-40);
//p.speak();
}
}
构造函数:
- 特点:
- 函数名与类名相同;
- 不用定义返回值类型;
- 不可以写return语句;
- 多个构造函数是以重载的形式存在的;
- 作用:给对象进行初始化,对象一建立就会调用与之对应的构造函数;
- 与一般函数的区别:
- 写法不同,运行不同,作用不同:构造函数对象一建立就运行,给对象初始化,而一般函数对象调用才执行;给对象添加功能,一个对象建立构造函数只运行一次,而一般方法可被调用多次。
- 当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数,当在类中自定义了构造函数后,默认的构造函数就没有了,系统默认添加的构造函数为:
类名( ){ };
注:构造函数被私有化后,将不能建立与之对应的类的对象,此时一般该类内部会自己建立一个对象,并对外提供获取对象的静态方法;
构造代码块:
- 作用:给对象进行初始化,对象一建立就运行,而且优先于构造函数执行;
- 与构造函数的区别:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化;
- 特点:构造代码块中定义的是不同对象共性的初始化内容,在类中的创建格式如下:
//构造代码块无函数名;
{
语句;
}
this关键字
- this代表本类的对象,代表它所在函数所属对象的引用,简单说哪个对象在调用this所在的函数,this就代表哪个对象;
- this的应用:当定义类中功能时,该函数内部要用到调用该函数的对象时,这是用this来表示这个对象,即:但凡本类功能内部使用到本类对象,都用this表示;
- 构造函数间调用只能用this语句,形如:this(name),即:this语句用于构造函数之间进行互相调用;
- this语句只能定义在构造函数的第一行,因为初始化要先执行;
- 综上:this关键字的两个作用:
- 用于区分同名变量(成员变量与局部变量)的情况;
- 用于构造函数之间的调用;
注:this(……)语句是不能用于一般函数中的,只能用于构造函数间;
一般函数是不能直接调用构造函数的;
/*
this语句 :用于构造函数之间进行互相调用。
this语句只能定义在构造函数的第一行。因为初始化要先执行。
*/
class Person
{
private String name;
private int age;
{
System.out.println("code run");
}
Person()
{
//this("hah");
System.out.println("person run");
}
Person(String name)
{
//this();
this.name =name;
}
Person(String name,int age)
{
//this(name);
//this.name = name;
this.age = age;
}
}