面向对象
1.何为面向对象
- 面相对象是相对面向过程而言的
- 面相对象和面向过程都是一种思想
- 面向过程
- 强调功能行为
- 面向对象
- 将功能封装进对象,强调具备了功能的对象。
- 面向对象是基于面向过程的。
2.类与对象
- 类就是对现实生活中事物的描述;
- 对象则是这类事物,实实在在存在的个体;
- 描述类时,有属性(成员变量)和行为(成员方法);
- 成员变量与局部变量
- 成员变量作用于整个类中;
- 局部变量作用于函数中或者语句中;
- 成员变量在堆内存中,因为对象的存在才在内存中存在;
- 局部变量在栈内存中
3.匿名对象
使用:
- 当对对象的方法只调用一次,可以使用匿名对象来完成,这样较为简化;若对一个对象进行多个成员调用,必须给这个对象起个名字;
- 可以将匿名对象作为实际参数进行传递。
4.封装
- 封装:指隐藏对象的属性和实现细节,仅对外提供公共访问方式;
- 好处:
- 将变化隔离
- 便于使用
- 提高重用性
- 提高安全性
- 将变化隔离
- 封装原则:
- 将不需要对外提供的内容都隐藏起来
- 把属性都隐藏,提供公共方法对其访问
- 将不需要对外提供的内容都隐藏起来
4.1 private
私有只在本类中有效
一个成员变量(私有属性)通常对应两个访问方式,一个是设置set一个是获取get;
局部变量必须初始化值,成员变量不需要初始化值,有系统默认
5.构造函数
5.1特点:
- 函数名与类名相同
- 不用定义返回值类型
- 不可以写return语句
5.1作用:
给对象进行初始化。即对象一建立,就会调用与之对应的构造函数
5.3注意:
- 默认构造函数的特点;
- 多个构造函数是一重载的方式存在的;
- 当一个类中没有定义构造函数,系统会默认给该类加入一个空参数的构造函数;
- 构造函数在对象一建立就运行,给对象初始化,而一般函数是对象调用才执行,给对象添加对象具备的功能;
- 一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次;
- 当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中;
5.4构造代码块
- 作用:给对象进行初始化,对象一建立就运行,并优先于构造函数执行
构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化
6.关键字
6.1 this关键字
作用:用于区分局部变量和成员变量同名的情况;
this代表本类的对象;哪个对象调用this所在的函数,this就代表哪个对象;即this代表它所在函数所属对象的引用
应用:
- 当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示对象
- 构造函数之间调用只能使用this关键字;
- this的调用必须放在构造函数第一句,因为初始化要先执行;
6.2 static关键字
6.2.1 作用:
- 修饰符,用于修饰成员(成员变量,成员函数),被修饰后成为类变量;
- 当成员被静态修饰后,便多一个调用方式,除了可以被对象调用外,还可以直接被类名调用(类名.静态变量)。
6.2.2 特点:
- static修饰的变量存在于随着类的加载而加载,随着类的消失而消失;说明其生命周期最长;
- 优先于对象存在,即静态是先存在的,对象是后存在的;
- 被所有对象共享
- 可直接被类名所调用
ps:实例变量与类变量的区别
- 存放位置
类变量随着类的加载而存在于方法区中;实例变量随着对象的建立而存在于堆内存中;
- 生命周期
类变量生命周期最长,随着类的消失而消失;
实例变量生命周期随着对象消失而消失;
6.2.3 使用注意事项:
- 静态方法只能访问静态成员;非静态方法既可以访问静态也可以访问非静态;
- 静态方法中不可以定义this,super关键字,因为静态优先于对象存在;
- 主函数为静态。
6.2.4 优缺点:
- 优点:
- 对对象的共享数据进行单独空间的存储,节省空间,没必要对每一个对象都存储一份;
- 可以直接被类名调用。
- 缺点:
- 生命周期过长;
- 访问出现局限性(只能访问静态)。
6.2.5 何时使用:
何时定义静态变量(类变量):当对象出现共享数据时,该数据被静态所修饰,对象中的特有数据要定义成非静态存在于堆内存中;
- 只要数据在对象中都是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。如果是相同的数据,对象不需要做修改,只需要使用即可,不需要存储在对象中,定义成静态的。
何时定义静态函数:当功能内部没有访问非静态数据(对象的特有数据),则该功能可以定义为静态的。
- 简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。如果不需要,就可以将该功能定义成静态的。当然,也可以定义成非静态,但是非静态需要被对象调用。如果没有访问特有数据的方法,该对象的创建是没有意义。
6.2.5 静态的应用:
- 每个应用程序中都有共性的功能,可以将这些功能进行抽取,独立封装,以重复使用
6.2.5 静态代码块:
特点:
- 随着类的加载而执行,只执行一次,用于给类进行初始化;
- 优先于主函数执行;(如例1)
- 只有类 加载的时候才会执行静态代码块。(如例2)
例1
class StaticCode{
static
{
System.out.print(“a”);
}
}
class StaticCodeDemo{
static
{
System.out.print("b");
}
public static void main(String[] args)
{
new StaticCode();
new StaticCode();
System.out.print("over");
}
static{
System.out.print("c");
}
}
输出结果:bcaover
例2
class StaticCode{
static
{
System.out.print(“a”);
}
public static void show(){
System.out.print(“show run”);
}
}
class StaticCodeDemo{
static
{
System.out.print("b");
}
public static void main(String[] args)
{
StaticCode s = null;
}
static{
System.out.print("c");
}
}
输出结果:bcover
By the way说一下构造代码块,如下例:
class StaticCode{
int num = 9;
StaticCode()//构造函数,给对应对象初始化
{
System.out.println(“b”);
}
static
{
System.out.print("a");//静态代码块,给类初始化
}
{
System.out.print("c"+9);//构造代码块,给对象初始化
}
StaticCode(int x)//构造函数,给对应对象初始化
{
System.out.println("d"+x);
}
public static void show(){
System.out.print("show run");
}
}
class StaticCodeDemo{
public static void main(String[] args)
{
new StaticCode(4);
}
static{
System.out.print("e");
}
}
输出结果:eac9d4
7.main函数
public static void mian(String[] args);
主函数是一个特殊的函数,作为程序的入口,可以被jvm(虚拟机)调用。
主函数的定义:
- public:代表该函数访问权限是最大的;
- static:代表主函数随着类的加载就已经存在了;
- void:主函数没有具体返回值;
- main:不是关键字,但是是一个特殊字符,可以被jvm识别;
- (String[] args):函数的参数,参数类型是一个字符串类型数组,该数组中的元素是字符串;
- 主函数为固定模式,jvm唯一识别格式
- args为参数名,可更改;
jvm在调用主函数时,传入的是new String[0];
例如:
class MainDemo
{
public static void main(String[] args){
System.out.println(args);
}
}
执行结果:
例如1:
class MainDemo
{
public static void main(String[] args){
System.out.println(args.length);
System.out.println(args.[0]);
}
}
编译后输入数值:
例如2:
class MainDemo
{
public static void main(String[] args){
String[] arr ={“hehe”,”haha”,”heihei”,”xixi”};
MainTest.main(arr);
}
}
class MainTest(){
public static void main(String[] args){
for(int x=0; x