java面向对象

面向对象

面向对象的特点

​ 是一种符合人们思考习惯的思想
​ 可以将复杂的事情简单化
​ 将程序员从执行者转换成了指挥者
完成需求时:
​ 先要去找具有所需的功能的对象来用。
​ 如果该对象不存在,那么创建一个具有所需功能的对象。

类与对象分析

在面向对象的编程思想中, 着眼点在于找到一个能够帮助解决问题的实体, 然后委托这个实
体解决问题。
在这里, 这个具有特定的功能, 能够解决特定问题的实体, 就是一个对象
由若干个具有相同的特征和行为的对象的组成的集合, 就是一个

类是对象的集合, 对象是类的个体。

面向对象与面向过程的区别

面向对象基于面向过程

面向对象与面向过程都是思想

面向对象比面向过程高级

面向对象更符合人们的思考习惯

面向对象使人们变成指挥则

面向过程比面向对象更底层,执行效率更高

只能用对象干活吗?

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.属性的名字
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值