面向对象
-------android培训、java培训、期待与您交流!----------
内容: 面向对象(匿名对象)、static代码块、构造代码块与构造函数、单例设计模式。
面向过程:强调的是功能行为。
面向对象:相对于面向过程而言,它将功能封装进对象,强调具备了功能的对象。
1、开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情。
设计的过程:其实就是在管理和维护对象之间的关系。
面向对象的三个特征:
封装(Encapsulation)
继承(inheritance)
多态(polymorphism)
2、类与对象的关系:
Java中描述事物通过类的形式体现,即称之为面向对象;
类是具体事物的抽象,概念上的定义。
而对象即是该类事物实实在在存在的个体,即类所描述的实体。
(对象是汽车,则类是生产汽车的图纸,注明了对象的属性与行为(功能)。)
例: 汽车(生活中统称的所有汽车)可以看着 Car 这个Java类;
生产一辆名为法拉利ferrari的汽车: Car ferrari = new Car();
//ferrari是这辆车的名字,而new Car()相当于根据图纸Car生产出来的汽车。
3、Java中用类class来描述事物的属性与行为:
属性:对应类中的成员变量。
行为:对应类中的成员函数。
定义类: 其实就是在定义类中的成员(成员变量和成员函数)。
PS:类的类体是由两部分组成:变量的定义和函数(方法)的定义;
而它们都各自包含两个部分:
方法:
例: public static int getAge(String name){ ...... }
【类的大括号中的内容叫做类体;而方法的大括号中的内容叫做方法体。】
4、成员变量与局部变量的区别:
成员变量:
成员变量定义在类中,在整个类中都可以被访问;
成员变量随着对象的建立而建立,存在于对象所在的堆内存中;
成员变量有默认初始化值。
局部变量:
局部变量只定义在局部范围内,如:函数内,语句(for等)内等;
局部变量存在于栈内存中;
作用的范围结束,变量空间会自动释放;
局部变量没有默认初始化值,不初始化不能参与运算。
5、匿名对象:是对象的简化形式,有两种使用情况:
1、当对象方法仅调用一次时:
例如:[ Car c = new Car( );
【匿名对象仅调用对象方法;调用属性修改都是重新生成,没有指定目标即无法再此被使用】
2、匿名对象可以作为实际参数传递给方法:
例:
因为匿名对象——>直接将实际参数导入,生命周期短,使用完即在内存中被清除。
引用数据在缓存区中所需的生命周期:
6、封装(Encapsulation):是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:a、将变化隔离;b、便于使用;
c、提高重(/复)用性;d、提高安全性。
封装原则:
A、将不需要对外提供的内容隐藏(方法实现细节等);
B、把属性都隐藏(权限修饰符限制访问),提供公共方法对其访问。
7、静态代码块:
2、当类被调用时,随类的加载而加载,只执行一次。
构造代码块:
(而构造函数是给不同对象进行不同的初始化。)
构造代码块格式:
而构造函数:
8、函数执行顺序:
静态代码块——>构造代码块———>构造函数——>一般函数(调用才执行);
(类初始化)
PS:
不同点:
而构造代码块与构造函数虽然也只运行一次,但是可重复出现,不过是在属于(创建)不同的对象。
2、调用局限性:静态代码块属于静态类型,所以不能调用非静态成员;
分析:
Person p = new Person("zhangsan",20);
该句话都做了什么事情?
1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中。
2,执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
3,在堆内存中开辟空间,分配内存地址。
4,在堆内存中建立对象的特有属性。并进行默认初始化。
5,对属性进行显示初始化。
6,对对象进行构造代码块初始化。
7,对对象进行对应的构造函数初始化。
8,将内存地址付给栈内存中的p变量。
9、构造函数:
特点:
2、没有具体的返回类型,也就没有返回值(return);
3、不可以定义返回值类型void。
4、不能被直接调用,必须通过new运算符创建对象时才会自动调用;
作用: 给对象进行初始化。
注意:
2、多个构造函数是以重载的形式存在的,根据不同情况调用不同的构造函数。
构造函数与一般函数的区别:
什么时候使用构造函数?
1、当分析事物,该事物一存在就具备一些特性或者行为,那么就将这些内容定义在构造函数中(即带参数的构造函数)。
【2、通常要调用该类的非静态方法时,需要通过新建(new)构造函数来创建该类的实例对象,通过该对象来调用非静态方法等()】
注意: 构造函数可以被私有化(private),因为构造函数也是“成员” ;
构造函数私有化后,其他类就不能直接创建该类的实例对象(即无法调用私有化构造函数)。
PS:私有化构造函数,补充见本篇"14、静态的应用"。
10、主函数:public static void main(String[] args){ };
主函数是JVM默认所识别的入口函数,属于固定格式。
虽然主函数允许重载,但JVM只能识别规定参数格式的主函数(唯一可修改的是参数名args)。
(String[] args):其实是个String[]数组容器,可对其存储数据,可在运行该类时传递字符串数组给主函数,根据需要处理传递的数组数据。
11、private关键字:
常见应用之一:
将成员变量私有化,对外提供对应的set、get方法对其进行访问。提高对数据访问的安全性。
【set方法修饰符为void,而get方法修饰符与导入的数据类型有关(int、String等)。】
封装之所以对外提供访问方式,是因为可以在访问方式中加入逻辑判断等语句,对访问的数据进行操作、判断(不封装,加入逻辑判断等语句容易出现错误,封装也就提高代码健壮性)。
【Java中对成员变量的操作只能在方法中,方法可对成员变量及自己的局部变量进行操作。
在定义类的成员变量时可同时赋予初值,但是不能在声明后直接进行赋值(之后赋值只能在方法)】
12、this关键字:
特点:this代表其所在函数所属对象的引用(即this代表本类对象的引用)。
什么时候使用this关键字呢 ?
(this多数时候存在,不过没有同名成员相互干扰情况,所以可省略)
在定义类中功能时,该函数内部要用到调用该函数的对象时,就用this来表示这个对象。
其他解释定义:如果局部变量的名字与成员变量的名字相同,则在该局部变量存在的方法中成员变量被隐藏,暂时失效;如果想要在此方法中使用成员变量则要使用this关键字。
【构造函数间调用只能用this语句,(且this语句只能在构造函数中)
而this语句只能用在构造函数的第一行(因为调用的初始化动作要先执行)。】
this语句:this(name); ——>
13、static关键字:
被修饰后的成员具备以下特点:
1、随着类的加载而加载;(随类的消失而消失,所以生命周期最长)
2、优先于对象存在;
3、被所有对象所共享;
4、可以直接被类名调用。
使用注意:
1、静态方法只能访问静态成员;(非静态方法可访问非静态成员和静态成员)
2、静态方法中不可以写this,super关键字;
3、主函数是静态的(publicstatic void main(String[] args){…… })。
作用(利弊):
利: 对对象的共享数据进行单独空间的存储(存储在内存的静态区),节省内存空间;
资料补充:
1、成员变量可分为实例变量和类变量,被关键字static修饰的变量就是类变量。
2、类中的方法也分实例方法和类方法,同理:被static修饰的方法就是类方法。
(不被static修饰的变量、方法即实例变量和实例方法)
类变量随类的加载而存在于静态区中;实例变量随对象的建立而存在于堆内存中。
什么时候使用静态?
静态变量(类变量):当类中变量非类对象的特有数据(即共享数据)时,将该变量用static修饰成为静态变量。
静态函数: 当函数功能内部没有访问非静态数据(对象的特有数据)时,就可以定义为静态的。
(因为没有访问到对象的特有数据,所以不一定要创建对象来使用静态函数,因为静态函数可以通过类名直接调用)
14、静态的应用:
当多个应用程序中都有共性功能时,可以将这些功能进行抽取,独立封装成为“工具类”,以便复用。
注意:
1、由于该“工具类”中提供共性功能的方法(函数),基本上没有使用到该工具类中特有数据(实例成员),所以要求将这些工具类进行静态(static)修饰为静态方法;
2、同时该工具类也就没有必要在调用这些静态方法时创建对象(构造函数),所以可以将构造函数私有化(用private修饰),强制使外部程序无法创建该类的对象;
(Java程序默认会有无参构造函数,当该类对象没有封装数据时,创建对象就只是浪费内存空间。)
【ArrayTool.getMax();
【建议多看几次Java基础视频教程第06天-04面向对象(静态的应用-工具类),理解消化,这是Java面向对象的基础,后面的学习出现的Java工具就是根据这原理衍生创建。】
资料补充:
导入自建类:设置classpath路径:setclasspath= .; c:\...(指定目录)。
导入静态方法:(这其实是后面内容,但没详讲自建类的)
1、在自建类源文件开头中添加包名代码:package mypack;
2、调用类的源文件开头添加调用静态方法的代码:import static mypack.ArrayTool.*;
15、设计模式:
单例设计模式:
思路:
主要格式:
Class Single {
}
调用:
…………(调用该类中的方法等);
【上述这种类一进内存就先初始化对象的方式叫做饿汉式,
而另一种方法调用时才初始化对象(执行给Single s赋值,由null变为newSingle())为懒汉式】
饿汉式:类一进内存就先初始化对象。(多用于开发,因为要保证数据统一、又需要使用到其中的对象才用到单例设计模式,所以类一定需要加载的。)
懒汉式:对象调用时才初始化对象,或称延时加载。(少用、存在安全隐患)
class Single{