面向对象是一种相对于面向过程的编程思想,是对事物属性及功能进行描述,抽象提取封装的过程。面向对象是局域面向过程的,之前所学习的将功能提取写进方法里其实就是对过程的提取,而面向对象,是将方法封装进一个对象内,使其具有该功能,当需要使用该功能时直接调用具备该功能的对象,而不用具体指导内部的实现细节。
面向对象相对于面向过程简化了书写,提高了代码的复用性,使功能的实现逻辑变的简单。
面向对象
面向过程与面向对象的区别
面向过程强调的事功能行为
面向对象是将功能封装进对象,强调具备了功能的对象。
面向对象是局域面向过程的,之前所学习的将功能提取写进方法里其实就是对过程的提取,而面向对象,是将方法封装进一个对象内,使其具有该功能。
对象数量的确定;名词提炼法
人开门 class 人{ 开门(门) 门.开 } class 门{ 开(轴带动开门) }
面向对象的三大特征;封装,继承,多态
以后开发的过程基本是找对象,创建对象,使用对象,维护对象之间的关系。
类和对象的关系,
类就是对现实生活中事物的抽象描述,对象就是这些事物的实例,
映射到java中,描述就是class定义的类。具体的对象就是对应java中在堆内存中用new建立实体。类就像是汽车的设计图纸,生产出来的汽车就是对象,描述事物就是在描述事物的属性与行为。属性对应着类中的变量,行为对应着类中的函数方法,所以定义类就是在定义属性与行为,这些类中的成员,成员变量和成员方法。
对象的创建格式
类名 对象名=new 类名();类的实例化,此时在内存堆中产生一个对象实例,c是类类型变量,存在栈内存中指向对象,
对象成员的使用格式
对象.对象成员
从这里就可以看出只有一个主函数作为入口的原因,只要将其他对象的数据以类的形式进行封装,只需要在主函数进行调用就行。
成员变量与局部变量的区别
成员变量作用于整个类中,局部变量变量作用于函数中或者语句中。
在内存中两者的位置也不同,成员变量因为对象的存在而存在于堆内存中,局部变量存在与栈内存中。
匿名对象
匿名对象即是只是实例化对象但是并没有对其命名创建类类型变量,在栈内存中没有对堆内存中实体的引用关系,每次匿名对象语句执行完毕因为不再使用就对其进行不定时内存回收。
匿名对象的使用方式之一;当对象的方法只调用一次时,可以用匿名对象来完成,这样比较简化。当对对象的多个成员进行调用,必须给这个对象起个名字。
匿名对象的使用方式侄儿:可以将匿名对象作为实际参数进行传递。简化同时优化内存。
实参与形参,函数的调用时在栈内存中进行的,当一个函数结束时内存就会被回收。
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:将变化隔离。便于使用。提高复用性,提高安全性。
封装原则:将不需要对外提供的内容都隐藏起来。把属性都隐藏,提供公共方法对其访问。
函数是代码中最小的功能单元即最小的封装体。
private:私有,权限修饰符,用于修饰类中的成员(成员变量,成员方法)。私有只能在本类中得到访问。当需要访问时,需要设置访问的方法,一个私有的成员变量通常对应两个访问方法,set或者get。
private是封装隐藏中的最小权限。
构造函数
当分析事物时,该事物一存在就具备一些属性或行为时,需要在构造函数中定义。
对象一建立就会调用与之对应的构造函数,当一个类中没有定义构造函数时,那么系统会给该类默认加一个空参数的构造函数,用于对象的初始化,当在类中自定义了构造函数时,系统不会再进行添加了。当自定义的构造函数没有空参数构造函数时,是错的,必须要有空参的构造函数。
构造函数与一般函数的区别,构造函数是在对象一建立就自动调用,而一般方法则是需要对象调用时才执行,构造函数只运行一次,而一般函数可以被调用多次。
特点
1,函数名与类名相同
2,不用定义返回值类型
3,不可以写return语句
作用
可以用于给对象进行初始化。
构造代码块
作用类似于构造函数,但是执行顺序优先于构造函数,而且构造代码块是给所有对象进行统一初始化的,而构造函数只对对应参数的对象进行初始化。定义共性初始化。
this关键字
this关键字用于区分局部变量和成员变量同名的情况
person(String name){ this.name=name; }
this代指本类当前对象的引用。即当前对象名,类类型变量。
类中成员的调用都是通过对象来完成的,所以根据内存图,根据代码逻辑发生的顺序可以更容易的理解。事实上在不用区分不同的时候,如果成员调用的时候钱面没写this一般都是省略了。
谁调用了该方法,this就代表谁。
在构造函数中的调用,一般函数是不能调用构造函数的。
this语句调用构造函数只能放在第一个语句的位置。
Person(){} Person(String name){ this();//构造函数之间的调用只能用this关键字。 this.name=name; } Person(String name,int age){ this(name);//此处调用了上一个构造函数实现name的赋值,以简化代码。 this.age=age;//此处则只是普通的用法代指了当前对象的类类型变量。 }
static关键字;静态,用于修饰类中的成员,利用static修饰的成员内存就不在堆内存里了,而是提取出来放在内存的其他区域即方法区(共享区,数据区,用于存放类中的共享成员。),由对象所共享,以优化内存。
另外被static所修饰的成员不止可以被对象所调用也可以直接被类名所调用,格式类名.静态成员
所以static所修饰的成员应该是所有对象的共性。
静态static的特点
1,随着类的加载而加载
2,优先于对象存在
3,被所有对象所共享
4,可以直接被类名所调用
静态使用注意事项
1静态方法只能访问静态成员,非静态既可以访问静态成员也可以访问非静态
2静态方法中不可以定义this,super关键字,因为静态优先于对象存在。所以静态方法中不可以出现this,
3主函数是静态的。主函数的调用时一般通过类,或者对象调用而非直接调用的。主函数同类的成员访问只能访问静态的。
利:对对象的共享数据进行单独空间的存储,节省空间,没必要每一个对象中都存储一份。
弊端:生命周期过长,访问出现局限性。
main主函数
主函数是一个特殊的函数,作为程序的入口,可以被jvm调用
public,访问权限最高级
static,在内存中随着类的加载而加载,所以可以直接被调用
void,主函数没有具体的返回值
main,不是关键字,但是是一个特殊的单词,可以被jvm识别
参数,是一个字符串元素的数组
主函数的格式是固定的:JVM识别
public static void main(String[]args){
}
args是arguments的简写,这个变量名是可以随意的。只不过习惯的都写成这样的。JVM调用主函数时参数默认传入的是new String[0];长度为0的字符串数组。这个参数是可以改变的。
什么时候使用静态
定义静态变量;当所有对象存在共享数据时
定义静态函数;当方法内部没有访问非静态数据(即对象特有的数据)时可以定义成静态方法。即不需要使用到对象时
静态的应用
每一个应用程序都有共性的功能,可以将这些功能进行提取,独立封装,以便复用。
静态代码块
特点,随着类的加载而执行只执行一次,与构造代码块的区别也是执行优先级的区别,用于类的初始化。