面向对象
面向对象的特点
是一种符合人们思考习惯的思想
可以将复杂的事情简单化
将程序员从执行者转换成了指挥者
完成需求时:
先要去找具有所需的功能的对象来用。
如果该对象不存在,那么创建一个具有所需功能的对象。
类与对象分析
在面向对象的编程思想中, 着眼点在于找到一个能够帮助解决问题的实体, 然后委托这个实
体解决问题。
在这里, 这个具有特定的功能, 能够解决特定问题的实体, 就是一个对象。
由若干个具有相同的特征和行为的对象的组成的集合, 就是一个类。
类是对象的集合, 对象是类的个体。
面向对象与面向过程的区别
面向对象基于面向过程
面向对象与面向过程都是思想
面向对象比面向过程高级
面向对象更符合人们的思考习惯
面向对象使人们变成指挥则
面向过程比面向对象更底层,执行效率更高
只能用对象干活吗?
对
Dog.play();通过字节码文件对象调用方法。
匿名对象
定义
匿名对象就是没有名字的对象
因为没有名字,所以当我们想使用匿名对象实现功能时,只能在创建对象的这个时刻使用一次。一旦使用完毕,这个对象我们就再也无法调用,变成了垃圾。系统会通过垃圾回收机制在某个时刻进行内存回收。
**作用:**简化代码,常用传参。
节省内存资源,优化内存的使用。
内存宝贵,使用匿名对象可以更好的使用内存(随用随键,用完更快回收内存),节省内存。
使用场景
1.用作方法参数
2.用作匿名内部类
类中的成员访问
成员分类
使用关键字static修饰的属性、方法, 被称为静态属性、静态方法。
没有使用关键字static修饰的属性、方法,被称为非静态属性、非静态方法,又被称为实例属性、实例方法。
空间分配
静态的成员是属于类的,在类第一次被加载到内存中的时候,就已经分配空间了。
非静态的成员属于对象的,在实例化对象的时候分配空间。
访问
静态成员需要使用类访问,非静态成员需要使用对象访问。
静态方法中可以直接访问本类中的静态成员,不能直接访问本类中的非静态成员。
非静态方法中可以直接访问本类中的静态成员,也可以直接访问类中的非静态成员。
成员变量的理解
成员变量的特点(这里指非静态成员)
1.在创建对象的时候会赋默认值
2.可以在类中定义变量的时候直接赋值
3.非静态成员可以在除了static修饰的方法外任何地方赋值
成员变量和局部变量的区别:
1.作用域:成员变量时整个对象,局部变量是从定义开始到所在的函数/if/for结束
2.默认值:成员变量会有默认值,局部变量没有默认值,想要使用必须先赋值
3.释放机制:成员变量更对象保持一致,通过垃圾回收机制回收,局部变量使用完立即释放
4.存放的位置:成员变量存放在堆区中的对象中,局部变量放在栈区中的方法中。
static
static 定义
是一个关键字,被static修饰的成员变成了静态的,具有保值功能。
温馨提醒
如果某些属性是属于不同的对象,每一个对象的值不同,可以设计为非静态。例如人的名字。
如果某些属性是可以被所有的对象共享的,每一个对象看到的值都是相同的,可以设计为静态。例如对象的数量。
示例:
//说明static
class Student{
int age;//非静态成员变量
static int height;//静态成员变量
//静态方法
public static void jump(){
System.out.println("jump");
}
}
public class Demo2 {
public static void main(String[] args) {
Student s = new Student();
s.age = 10;//引用调用非静态的成员变量
//s.height = 23;//引用调用静态的成员变量
//Student.age = 20;//类名不能调用非静态成员
Student.height = 20;//类名只能直接调用静态成员
Student.jump();//类名调用静态方法
}
}

图示说明:
1.java内存分成分成堆区,栈区,方法区,本地方法区,寄存器,图中画出了堆区,栈区,方法区的内存使用情况
2.在方法区内部有一块儿特殊的区域-静态方法区,专门用来盛放static修饰的成员,可以延长成员的存活时间与字节码一致
3.字节码文件对象(Demo2.class,student.class),是在程序执行时,由JVM负责将字节码文件生成的字节码文件对象.内部包含类的所有二进制形式的内容.每个类都有唯一的一个字节码文件对象,负责当前类所有实例对象的创建工作(new方法执行具体的开辟空间,构造方法执行具体的属性初始化),字节码文件对象的生存周期与类一致,是整个程序.
过程说明:
1.将Demo2.class对象加载进方法区
2.将静态方法-main()方法保存在静态方法区一份
3.将Student.class对象加载进方法区
4.将静态成员height,jump()保存在静态方法区一份,同时height初始化成0
5.main()方法入栈
6.执行main()中的代码,创建局部变量s
7.在栈中创建Student对象,给非静态成员变量age初始化成0,并将地址返回,保存在引用s中
8.给age赋值成10
9.给height赋值成20
10.jump()方法入栈
为什么可以直接通过类名调用静态的成员?
当成员被static修饰之后就变成了静态的,会在class生成的同时放在静态方法区中一份,而静态方法区的特点是内容会随着程序的结束而释放,这里的成员已经不属于某一个实例对象,生命周期与字节码文件保持一致,大于某个实例对象,实例对象的创建与否不能影响他们的调用,可以直接使用类名调用,在用类名调用时,本质上是在使用字节码文件对象直接实现调用,这样即可以节省内存,又能提高效率
为什么不能使用类名调用非静态成员?
使用类名调用,本质上是在使用字节码文件对象直接实现调用,字节码文件对象的出现时间要早于某个实例对象,而非静态成员的生命周期是与实例对象保持一致,所以当有字节码文件对象时,不一定有实例对象,非静态成员.所以不能调用.
static的作用
1.用于保值
2.用于创建工具类
工具类内部都是使用的静态方法,这样就不需要在调用方法时再创建工具类对象,节省内存,提高效率.
比如Arrays工具类。
类与类之间产生关系
类是一种自定义的数据类型
类, 其实是一种自定义的引用数据类型, 这种类型可以作用于属性、方法参数、返回值…,
之前怎么使用的基本数据类型, 就可以怎样使用这种类型。注意:一个类型一旦创建出来,就是一个独立的数据类型,在他可见的范围内都是可以使用的,包括自己的内部.
传参:
组合:谁拥有谁
继承:谁是谁
传参效率高
因为传参让两个类之间的内聚性最高,耦合性最低。
内聚性:两个类之间的关系越松散,内聚性越高。
耦合性:两个类之间的关系越紧密,耦合性越高
开发强调的低耦合高内聚,利于模块化开发。
this关键字
概念
是一种引用数据类型,本身是一个关键字,用在类的实例方法或者构造方法中,代表的是当前的对象,保存的是当前对象的地址
场景:当我们想在当前类的内部拿到当前对象的引用时,可以使用this
this的功能总结:
1.用来区分成员变量和局部变量
2.可以在构造方法内部调用其他重载的构造方法,提高代码的复用性,简化代码(具体实现见构造方法小节)
this关键字的省略
当需要访问的属性与局部变量没有重名的时候, this关键字可以写, 也可以不写。
当需要访问的属性与局部变量重名的时候, this关键字必须写, 不可以省略。
构造方法
构造方法其实就是一个方法,用于实例化对象,在实例化对象的时候调用。
和普通方法 的区别
构造方法的名字必须与类名一致。
构造方法没有返回值,返回值类型部分不用写。
意义
一般情况下,使用构造方法,是为了在实例化对象的同时,给一些属性进行初始化赋值。
构造方法注意事项
如果一个类中没有写构造方法, 系统会自动提供一个public权限的无参构造方法, 以便
实例化对象。
如果一个类中写构造方法了, 此时系统将不再提供任何的默认的构造方法。
多个构造方法之间是重载的关系
this在构造方法中的使用
1.不能自己调用自己—死循环
2.不能相互调用----死循环
3.this充当构造方法时,必须放在第一行
4.this在作为方法的时候,只能充当构造方法,不能作为其他方法
5.this的使用范围就是当前类的内部
6.只有在非静态方法中,才可以使用this.
代码段
构造代码段
直接在类中写的代码段, 就是构造代码段。
构造代码段中的代码, 在每次实例化对象的时候执行,执行顺序优先于构造方法.。 一般在构造方法中, 对对象的某些属性进行初始化的赋值。
构造代码段, 功能与无参构造方法是有重复的, 实际使用中, 以构造方法的使用较多。
静态代码段
直接在类中写的代码段, 用static修饰, 就是静态代码段
静态代码段, 当类第一次加载到内存中的时候执行, 一般进行属性的初始化赋值, 或者进行 资源加载,执行顺序优先于main 。
类加载时机:
实例化对象
访问静态成员
Class.forName方法
包的使用
**包的命名规范:**com.公司名字.功能名字
正常创建工程,都是先建包,在创建.java文件
包本质上就是文件夹
封装性
基础
**定义:**我们可以通过对具体属性的封装实现.把对成员变量的访问进行私有化,让他只能在类内部可见,通过公共的方法间接实现访问.
**优点:**提高了代码的安全性,复用性和可读性.
**脏数据:**我们把程序中出现的不符合逻辑的数据称为脏数据
脏数据分析
原因:让用户直接将数据传给了成员变量 解决:1.不让他直接传值----将成员变量私有化,写 一个公共的方法 2.对数据进行过滤,将过滤后的数据交给成员变量
getter,seetter方法
因为往往我们会有大量的属性需要进行赋值取值操作,所以就形成了一个规范
赋值的规范:setter方法
构成:修饰词 返回值 方法名 (参数列表){
方法体中的代码
return 返回值
}
修饰词:一定是public
返回值:不需要,这里写void
方法名:set+属性的名字,名字的首字母大写
参数列表:一般只有一个,写法:与属性同名
代码:this.属性的名字 = 参数
return:不需要
取值的规范:getter
构成:修饰词 返回值 方法名 (参数列表){
方法体中的代码
return 返回值
}
修饰词:public
返回值:类型与属性一致
方法名:get+属性的名字,首字母大写
参数列表:不需要
代码:没有
return 属性的名字/this.属性的名字
return 返回值
}
修饰词:一定是public
返回值:不需要,这里写void
方法名:set+属性的名字,名字的首字母大写
参数列表:一般只有一个,写法:与属性同名
代码:this.属性的名字 = 参数
return:不需要
取值的规范:getter
构成:修饰词 返回值 方法名 (参数列表){
方法体中的代码
return 返回值
}
修饰词:public
返回值:类型与属性一致
方法名:get+属性的名字,首字母大写
参数列表:不需要
代码:没有
return 属性的名字/this.属性的名字
995

被折叠的 条评论
为什么被折叠?



