06_java面向对象—封装
前言:复杂到简单,执行者到指挥者,在Java中,一切皆对象。
面向对象的三个特征:封装,继承,多态。
java开发中其实就是在:找对象,建立对象,使用对象,维护对象的关系
类和对象的关系
● class:对事物的描写
● 对象:在堆内存中用new建立事物的实体
描述事物其实就是描述事物的属性和行为
● 属性:类中的变量
● 行为:类中的函数(方法)
匿名对象
● 方式一:对象的函数调用一次时,可以用匿名对象来完成。
● 方式二:可以将匿名对象作为实际参数进行传递。
封装
类和对象的关系
● class:对事物的描写
● 对象:在堆内存中用new建立事物的实体
描述事物其实就是描述事物的属性和行为
● 属性:类中的变量
● 行为:类中的函数(方法)
匿名对象
● 方式一:对象的函数调用一次时,可以用匿名对象来完成。
● 方式二:可以将匿名对象作为实际参数进行传递。
封装
1. 将变化隔离
2. 便于使用
3. 提高重用性
4. 提高安全性
原则:
● 将不必要对外提供的内容隐藏起来。
● 把属于隐藏,提供公共方法对其访问。
private(私有):封装:权限修饰符。(成员变量,成员函数)
作用:用于修饰类中的成员,private自在本类中有效,外界无法直接访问。
成员变量私有化后,成员变量一般提供两种访问方式
例子:
class feng
{
private int num; //将成员变量私有化
public void setNum (int a) //设置;访问方式
{
num=a;
}
public int getNum () //获取;访问方式
{
return num;
}
public void setNum (int a) //设置;访问方式
{
num=a;
}
public int getNum () //获取;访问方式
{
return num;
}
}
构造函数
特点:函数名与类名相同,不用定义返回值类型,不可以写return语。
作用:可以用于给对象初始化。
小细节:当一个类中没有构造函数时,那么系统会自动给该类默认加入一个空参数的构造函数式:「构造函数名{}{}」。默认的构造函数权限与所属类一致。
构造函数与一般函数的不同:
构造函数:对象一建立就运行,给对象初始化。
一般函数:是对调用才执行,给对象添加对象具备的功能。
构造函数:一个对象建立,构造函数只运行一次。
一般函数:一般函数可以被该对象调用多次。
一般函数:是对调用才执行,给对象添加对象具备的功能。
构造函数:一个对象建立,构造函数只运行一次。
一般函数:一般函数可以被该对象调用多次。
构造函数代码块
作用:给对象进行初始化。对象建立就运行,而且优先于构造函数执行。
区别:构造代码块是给所有对象进行统一初始化,构造函数是给对应的对象初始化。
如何使用:可以对不同对象的共性进行初始化。
区别:构造代码块是给所有对象进行统一初始化,构造函数是给对应的对象初始化。
如何使用:可以对不同对象的共性进行初始化。
例子:
{
System.out.println("xxxxxxxxx") //这就是构造函数代码块
}
this:代表本类的对象。
this:到底代表哪个对象?代表它所在函数所属对象的引用。
简单说:哪个对象在调用this所在的函数,this就代表那个对象。
this:到底代表哪个对象?代表它所在函数所属对象的引用。
简单说:哪个对象在调用this所在的函数,this就代表那个对象。
作用⑴:用于区分局部变量和成员变量同名的情况。
作用⑵:用于构造函数间互相调用,但只能定义在构造函数的第一行。
作用⑵:用于构造函数间互相调用,但只能定义在构造函数的第一行。
static(静态):共享:修饰符:用于修饰成员(成员变量和成员函数)
作用:当成员被静态修饰后,就多了一个调用方式,除了被对象调用外,还可以直接被类名调用「类名.静态成员」。
作用:当成员被静态修饰后,就多了一个调用方式,除了被对象调用外,还可以直接被类名调用「类名.静态成员」。
【 static特点 】
1,静态随着类的加载而加载,随着类的消失而消失,说明它的生命周期最长。
2,优先于对象的存在。类一加载到内存后,静态就存在,所以静态可以用类名直接调用的方式。
3,被所有对象共享。也就是说静态修饰的是对象的共性特征。
4,可以直接被类名调用。
【 实例变量和类变量的区别】
存放位置
1,类变量随着类的加载而存在于方法区。
2,实例变量随着对象的建立而存在于堆内存中。
生命周期
1,类变量生命周期最长,随着类的消失而消失。
2,实例变量生命周期随着对象的消失而消失。
2,实例变量生命周期随着对象的消失而消失。
【 静态使用注意事项 】
1. 静态方法只能访问静态成员。
非静态方法即可以访问静态成员,也可以访问非静态成员。
2. 静态方法中不可以定义this,super关键字。
因为静态优先于对象的存在,所以静态方法中不可以出现this。
3. 主函数是静态的。
静态利于弊
2. 静态方法中不可以定义this,super关键字。
因为静态优先于对象的存在,所以静态方法中不可以出现this。
3. 主函数是静态的。
静态利于弊
利处:对对象的共享数据进行单独空间存储,节省空间。
可以直接被类名调用。
弊端:生命周期过长。
访问出现局限性(只有静态才能访问静态)。
弊端:生命周期过长。
访问出现局限性(只有静态才能访问静态)。
什么时候使用静态函数?
当静态函数只访问静态成员时,没有访问到非静态成员。(就是对象的特有数据)
例子:
class ren
{
String name;
public static void shuo()
{
System.out.println("xiaoxiao")
}
}
class
{
public static void main(String[] args)
{
public static void main(String[] args)
{
ren.shuo(); //静态函数没有调用非静态成员,直接用[类名.静态成员]来调用。
} //这样就不需要建立对象。
} //这样就不需要建立对象。
}
静态代码块
例子:
static
{
System.out.println("xxxxxxx")
}
main主函数(主函数格式是固定的作为程序的入口,被jvm识别。)
public :代表该函数访问权限是最大的。
static :代表主函数随着类的加载就已经存在了。
void :主函数没有具体的返回值。
main :不是关键字,但是是一个特殊的单词,可以被jvm识别。
(string[] args): 函数的参数,参数类型是一个数组,该数组中的元素是字符串。
1.什么时候使用静态?
静态修饰的是成员变量和成员函数。
2.什么时候定义静态变量(类变量)
对象出现共享数据时,用静态修饰,存在于方法区
对象中的特有数据要定义成非静态。存在于堆内存
3.什么时候定义静待函数
功能内部没有访问到非静态数据(就是对象的特有数据)
那么该功能可以定义成静态
1.类加载到内存中。
2.静态代码块运行。
3.在堆内存中开辟空间,并分配内存地址值。
4.在堆内存中建立对象的特有属性,并进行默认初始化。
5.对特有属于进行显示初始化。
6.对构造代码块初始化。
7.对对象进行对应的构造函数初始化。
8.将内存地址赋给栈内存中的变量。
3.在堆内存中开辟空间,并分配内存地址值。
4.在堆内存中建立对象的特有属性,并进行默认初始化。
5.对特有属于进行显示初始化。
6.对构造代码块初始化。
7.对对象进行对应的构造函数初始化。
8.将内存地址赋给栈内存中的变量。