一、面向对象是什么?
什么是面向对象?先说说面向过程,顾名思义,面向过程就是注重一件事情的具体实现过程,首先该去怎么做,接下来怎么做,最后..........,这样的编程过于繁琐,头顶仅存的几根秀发又多了几分压力。而面向对象则通过发出命令让别人去做,你怎么做我不关心,我要的是这件事情的结果,举个喝水的例子:面向过程: 拿水杯 ——> 接水 ——> 喝水
面向对象: "张三,去帮我接杯水" ——> 喝水
二、面向对象都有些啥?
1.对象
描述客观事物的实体,是有特定属性和行为(方法)的基本运行单位。对象可以是一个实体、一个名词、一个可以想象为有自己标识的任何东西,万物皆对象。
2.类
描述了对象的属性和对象的行为,类是对象模板(类是对对象的抽象,对象是对类的实例化)
3.常用类
Object类
Object类是Java类库所有类的根类,所有的Java类都是从Object派生,都具有与Object类相似的行为特征。
常用方法:
(1). toString():返回一个文本形式表示的当前对象信息的字符串。
(2). equals():比较两个对象是否是同一对象,结果返回布尔值。
(3). hashCode():返回该对象的哈希代码值。
(4). getClass():获得当前对象所属类信息,返回Class对象。
(5). clone():对象克隆,返回该复制对象。
其中注意equals()方法和clone()方法在面试中比较容易遇到:
请问equals()和“==”的区别?
1. “==”针对基本数据类型而言,比较两个的值是否相等,对于引用数据类型,它是比较两个对象的地址是否相等。
2. “equals()”只针对于引用数据类型,没有重写的equals方法也是用“==”来实现的,比较的是两个对象所指向的内存空间的值,如果重写hashcode和equals方法,则比较的是内容。
请问深拷贝与浅拷贝的区别?
深拷贝和先拷贝都是实现对象的复制,但基于拷贝对象后,对拷贝后的对象进行改变会不会影响到原对象区分了深拷贝和浅拷贝。
1. 浅拷贝:B复制A,A变,B变。对于引用数据,变量名存储在栈内存,值存储在堆内存中,对象通过栈内指向存堆内存中的地址将两者关联,所以原对象和拷贝后的对象实际是指向同一个值,其中一者的改变自然会影响到另一对象。
2. 深拷贝:B复制A,A变,B不变。对于基本数据,变量名和值都存储在栈内存中,当拷贝时,会开辟一个新的内存地址进行,拷贝后的对象的改变不会影响到原对象。
用一句话概括:浅拷贝是拷贝原对象地址,深拷贝开辟空间用来存放原对象存储的值进行备份
[实现原理请参考博客](https://www.cnblogs.com/echolun/p/7889848.htm)
String类
传送门:
初识String类
4.构造方法
定义:构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域,构造方法分为有参构造方法和无参构造方法。
特点:
- 构造方法不能被继承,但可以被重载。
- 如果类中没有定义构造方法。系统会自动添加无参构造方法来完成对象的初始化。
- 父类所有的构造方法都会默认访问父类的无参构造方法,子类会继承父类的数据,可能会使用,所以在子类初始化前,一定会先完成父类数据的初始化。
5.封装
传送门:
JAVA三大特点之封装
6.继承
传送门:
JAVA三大特点之继承
7.多态
传送门:
JAVA三大特点之多态
8.抽象类
当多个类中出现相同功能,但是功能主体不同,这时可以进行向上抽取。在面向对象中,所有的对象都是通过类来描述的,但是并不是所有的类都用来描绘对象。当一个类的属性不足以描绘一个对象的时候,这个类就是抽象类,抽象类必须遵循以下原则:
- 抽象方法必须为public或projected
- 抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理: 父类名称 变量名 = new 子类名称()
- 抽象类必须有子类,使用extends继承。
- 抽象类中的抽象方法要被使用,必须由子类重写所有的抽象方法后,建立子类对象调用
/* 定义抽象类*/
abstract class person {
public void run(){//普通方法,
System.out.println("跑步");
}
public abstract void speak();//抽象方法,没有方法体
}
/* 使用抽象类必须要重写父类的抽象方法*/
@Test //注意老狗在这里使用的的单元测试注解,大家测试需要自己建立主加载函数,不了解的请勿效仿
public void testSix() {
person per = new person() {
//必须重写抽象类中的抽象方法
@Override
public void speak() {
System.out.println("讲话");
}
};
//使用抽象类中的方法
per.run();
per.speak();
}
9.接口
接口为了额外扩展功能,接口本身是无法直接实例化的,需要按照多态的形式来实例化,接口的子类可以是抽象类。使用interface定义接口,implements实现接口,格式:
/* 定义接口*/
interface Human{//定义一个人类的接口,注意里面的方法为抽象方法,我在这里添加了abstract
public abstract void speak();
}
/* 具体类实现接口*/
class Students implements Human {//实现接口类必须重写接口里面的抽象方法
@Override
public void speak() {
System.out.println("students is speaking");
}
}
/* 抽象类实现接口*/
abstract class person implements Human{
//这里实现了接口,但是类里面不能有内容,回顾抽象类中的特点:如果一个抽象类没有抽象方法,意义在于不让创建对象
}
特点:
- 接口不能实例化,要使用则按照多态的方式来实现,接口的成员变量只能是常量,并且是静态的,默认修饰符为public static final ,接口没有构造方法,且方法必须是抽象方法。
- 与继承的特点不同,一个类可以实现多个接口,一个接口可以继承多个接口,子类实现接口按照抽象类的使用必须重写接口里面的方法。
- 接口的成员方法默认使用abstract关键字修饰,JDK1.8以后系统自己加上,用户不用添加,但是其还是为abstract的。
抽象类和接口的区别:
- 抽象类:
成员变量:可以是常量,也可以变量
构造方法:有
成员方法:可以是抽象,也可以是非抽象方法 - 接口:
成员变量:只能是常量
成员方法:只能抽象
接口与接口: 继承,单继承,多继承
类与接口: 实现,单实现,多实现
类与类: 继承,单继承,多层继承 - 设计理念区别:
抽象类 is a 什么是什么的关系 继承体系共性
接口: like a 关系 继承体系的扩展
学无止境。老狗在此欢迎各位大神指出鄙人之不足,提出你们宝贵意见。
- 转载请注明出处