类和对象

面向过程和面向对象的联系和区别

联系:两种都是在分析、设计和开发软件时可以用到的不同思想

区别:

1、面向过程思想思考问题时,我们首先思考如何按步骤实现?并将步骤对应成方法,一步一步解决,最终完成。适合简单任务,不需要过多协作的情况

2、面向对象思想:用于需要协作的复杂问题

类和对象

类是对象的模板,包含成员变量(属性)和方法(成员方法)

对象又叫做类的实例

成员变量用于定义类或对象所包含的数据或一些静态属性,在定义时可以初始化,若未被初始化,Java会使用默认值为其初始化

成员方法用于定义类或对象的行为特征或实现功能

虚拟机内存分析

1、Java虚拟机的内存分为三个部分栈、堆和方法区

栈的特点

1、栈是描述方法执行的内存模型,每个方法被调用都会被创建一个栈帧(存储局部变量、方法出口、操作数等)

2、JVM中每个线程创建一个栈

3、栈是私有的,不能被线程共享

堆的特点

1、堆用来存放创建好的对象、数组

2、堆只有一个,被所有线程共享

3、堆是一个不连续的存储空间,分配灵活,速度慢

方法(静态)区特点

1、方法区只有一个,被所有线程共享

2、方法区实际也是栈,用来存放类、常量等相关信息

3、用来存放程序中永远不变或唯一的内容(如类信息、静态变量、字符串常量等)

构造器(构造方法)

用于初始化对象

要点

1、通过new方法调用

2、构造器虽然有返回值,但是不能定义返回值类型(返回值肯定是本类),也不能在方法体中使用return返回某个值

3、如果我们没有定义一个构造器,编译器会自动定义一个无参的构造函数,(若已经定义一个有参构造方法,创建对象时需调用无参构造方法,编译器也不会自动添加,须自己定义)如果已定义则编译器不会自动添加

4、构造器的方法名必须和类名相同

垃圾回收机制

1、内存管理

Java内存管理很大程度上是对象的管理,其中包括对象空间的分配和释放

对象空间的分配:用new关键字创建对象即可

对象空间的回收:将对象赋值null即可,垃圾回收机器将负责回收所有不可达的对象的内存空间

垃圾回收过程

1、发现无用对象

2、回收无用对象所占的内存空间

垃圾回收算法

1、引用计数法2、引用可达法

通用分代垃圾回收机制

分代垃圾回收机制,基于这样一个事实:不同的对象有不同的生命周期,因此,不同生命周期的对象可以采用不同的垃圾回收算法,以便提高回收率。将对象分为三种状态:年轻态、年老态、持久态。JVM将栈内存划分成Eden、Survivor、Tenured/Old空间

年轻态

刚创建的对象都存放在里面,用于存放生命周期短的对象

持久代

用于存放静态文件,如类、方法等,对垃圾回收没有显著影响

过程:新创建的对象绝大多数都存放在Eden中——>当Eden满了(达到一定比例)以后,不能创建新对象,则触发垃圾回收机制(Minor GC)清理Eden中无用的对象,并利用复制算法将剩余对象复制到Survivor1中,同时清空Eden区。——>当Eden区再此满了以后,将S1中无用对象清除,将有用对象复制到Survivor2区中,并清空S1,Eden区重复上次操作——>重复多次(默认15),Survivor中没有被清空的对象,则会复制到Tenured/Old区中,当Old区满了以后,会触发一次full GC(成本较高,会对系统性能产生影响),清除年轻代和年老代。

最容易造成内存泄漏的场景

1、创建大量无用对象

2、静态集合类的使用

3、各种连接对象(IO流、数据库连接对象、网络连接对象)未关闭

4、释放对象时,没有删除相应的监听器

对象创建过程和this关键字

1、对象创建过程

1、为对象分配内存空间,将成员变量初始化为0或空

2、执行属性值的显式初始化

3、执行构造方法

4、返回对象地址给相关变量

this作用

1、在调用构造方法前对象已构造好了,所以可以在constructor中使用this

2、在普通方法中用this

3、this不能用于静态(static)方法中

4、this可用在构造方法中

如:Point(double x,double y){
this.x=x;
this.y=y;

}

Point(double x,double y,double z){
this(x,y);//只能写在第一句
this.z=z;
}

static关键字

在类中,用static声明的成员变量为静态成员变量,也称为类变量,生命周期和类相同,在整个应用程序执行期间都有效

不能在静态方法中调用非静态成员,否则编译会报错

静态初始化块

用于类的初始化,不能直接访问非静态成员

参数的传值机制

Java中,方法传递参数遵循值传递,即传递的是值的副本,即改变参数值不会改变原件

在基本数据类型中,传递的是值的副本,不会影响原件,但在引用数据类型中,传递的是对象的地址,因此,副本和原件指向同一个对象,改变副本的地址指向对象的值,会改变原件地址指向对象的值。

包的两个使用要点

1、通常是类的第一句非注释性语句

2、包名:域名倒着写,加上模块名,便于对类的管理

写项目时要加包,不要使用默认包

导入包

1、Java会默认导入lang包中的所有类,因此这些类我们可以直接使用。

2、如果要使用两个同名的类,只能用包名.类名来显示调用相关类

如java.util.Date date=new java.util.Date();

静态导入是JDK1.5新增的功能,用于导入指定类中的静态属性,这样可以直接使用静态属性

继承

1、Java中,类只有单继承,接口可以有多继承

2、子类可以得到父类的全部属性和方法(除了构造方法),但不见得都可以直接访问(比如私有的方法和属性)

3、当类没有extends时,父类是java.lang.Object

4、可以使用ctrl+t方便查看类的继承层次结构

对象 instanceof 类(父类)名:检查对象是否是类(父类)的对象,返回值为boolean类型

方法重写(override)

即子类重写父类方法,可以用自身行为替换父类行为

要点

1、子类方法名字和参数列表等于父类

2、子类方法返回值类型和声明异常类型子类小于等于父类

3、子类方法访问权限大于等于父类

Object类的用法_toString的重写

Object类是所有java类的根基类,每个对象都具有它的方法和属性

==和equals

==:代表比较双方是否相同,若是基本数据类型则代表值相同;若是引用数据类型,则代表地址相同

Object类的boolean equals(Object obj)

提供定义对象内容相等的逻辑

super关键字

super是直接父类的引用,可以通过super调用被子类覆盖的父类的方法或属性

在构造方法的第一行代码如果没有显示的super(...)或this(....),那么Java会默认调用super(),即调用父类的无参构造方法,这里的super可以省略

使用super调用普通方法,语句没有位置限定,可以在子类中随便调用

静态初始化块的调用顺序和super一样

编程中封装的具体优点

1、提高代码安全性

2、提高代码复用性

3、“高内聚”:封装细节,便于修改内部代码,提高可维护性

3、“低耦合”:简化外部调用,便于外部调用,提高扩展性和协作

封装的实现——使用访问控制符

private、default、protected、public

private:表示私有,只有同一个类能访问

default:表示默认,只有自己类和同一个包的可以访问

protected:表示自己类、同一个包的类和其他包的子类可以访问

public:可被所有包的所有类访问

封装细节

类的属性

1、一般使用private修饰

2、提供对应的get/set方法来访问相关属性,这些方法通常是public修饰,以提供对属性的读取或赋值操作(注意对boolean变量的get方法是is开头,如isMan())

3、一般用于本类的辅助方法用private修饰,允许其它类调用的方法用public修饰

多态

多态指同一个方法调用,由于对象不同可能会有不同的行为。现实生活中,同一个方法,具体实现会完全不同

多态的要点

1、多台是方法的多态,与属性无关

2、多态存在有三个必要条件:继承、方法重写、父类引用指向子类对象

3、父类引用指向子类对象后,用该父类引用调用子类方法,多态就出现了

对象转型

1、向上转型

父类引用指向子类对象

向上转型后父类引用变量只能调用它编译类型的方法

如://d2.seeDoor();编译时d2为Animal类型,所以不能调用Dog中的方法,此时会报错

强制向下转型

父类引用装换成子类引用

注意:向下转型时,必须将父类引用转换成真实的子类类型(运行时类型),否则会出现转换异常

final关键字的作用

1、修饰变量:被它修饰的变量不可改变,一旦赋了值就不能被重新赋值

2、修饰方法:被它修饰的方法不能被子类重写,但可以重载

3、修饰类:被它修饰的类不能被继承

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值