1 、面向对象
“面向对象”:将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。举例说明:洗衣服,洗衣服我需要用水泡衣服,搓衣服,拧干等操作。我买个洗衣机,洗衣机把这些动作功能都封装到洗衣机里面,通过洗衣机完成这些操作,洗衣机就是我的对象。
1.2 、面向过程:
“面向过程”:也可称之为“面向记录”编程思想,就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。所以面向过程的编程方式关注点不在“事物”上,而是做这件事分几步,先做什么,后做什么。例如:早晨起来:起床、穿衣、洗漱、上班,只要按照这个步骤来,就能实现“一天”的功能,整个这个过程中关注的是一步一步怎么做,并没有关注“人”这个事物。
1.3、封装,继承,多态
封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是:代码重用。而多态则是为了实现另一个目的——接口重用!
多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
1.4、继承:
继承就是子类继承父类的特征和行为,使得子类对象具有父类的特征,或子类从父类继承方法,使得子类具有父类相同的行为。
1.5 、封装:
封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型;
意义:
1. 保护数据成员,不让类以外的程序直接访问或修改,只能通过提供的公共的接口访问
2. 方法的细节对用户是隐藏的,只要接口不变,内容的修改不会影响到外部的调用者
3. 当对象含有完整的属性和与之对应的方法时称为封装。
4. 从对象外面不能直接访问对象的属性,只能通过和该属性对应的方法访问。
5. 对象的方法可以接收对象外面的消息。
1.6、 多态:
在Java中有两种类型的多态性:编译时的多态性和运行时的多态性。我们可以通过方法覆盖和方法重载在Java中执行多态性。
多态允许不同类的对象对同一消息作出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式。
方法的重载涉及同一个类中的方法,要求方法名相同,但是参数列表不同,即参数类型、参数个数、参数顺序至少有一项页不相同。另外,重载的方法的返回值可以不同,方法的修饰符也可以不同。
1.7、抽象类,接口
抽象类(abstract)(abstract class Animal{})(含有抽象方法的类):是它的所有子类的公共属性的集合,是包含一个或多个抽象方法(public abstract void play();),
也可以包含一般方法。必须继承使用,必须有子类,抽象方法只能在抽象类中,对类的进一步抽象,子类必须重写父类的抽象方法。
接口:是一系列方法(函数)的声明,是一些方法特征的集合,没有方法的具体实现,包含抽象方法。
接口的功能有:接口可以实现不同类的相同行为,例如:鸟类和飞机都具有飞行功能。
1.8、关键字:
static:static表示“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。修饰的变量为全局变量,方法为全局方法;
1.被static所修饰的变量或者方法会储存在数据共享区;
2.被static修饰后的成员变量只有一份!
3.当成员被static修饰之后,就多了一种访问方式,除了可以被对象调用之外,还可以直接
被类名调用,(类名.静态成员);
static的特点:
1、随着类的加载而被加载;
2、优先于对象存在;
3、被所有对象共享;
4、可以通过类名调用。
1.9、String、stringBuild、StringBuffer
String是字符串常量,而StringBuffer和StringBuilder是字符串变量。由String创建的字符内容是不可改变的,而由StringBuffer和StringBuidler创建的字符内容是可以改变的。
StringBuffer是线程安全的,效率低;
StringBuilder是非线程安全的,效率相对StringBuffer高;
StringBuilder是从JDK 5开始,为StringBuffer类补充的一个单线程的等价类。
我们在使用时应优先考虑使用StringBuilder,因为它支持StringBuffer的所有操作,但是因为它不执行同步,不会有线程安全带来额外的系统消耗,所以速度更快。
总结:
关于线程安全,我们要知道一个原理:线程安全的前提的是该类的方法中运用了大量的synchronized关键字去修饰方法;
这样一来,就不能同时进行多线程访问,必须要排队访问,所以线程安全的同时呢,也导致效率低下;
没有synchronized修饰的类,必然访问效率高,可以同时多线程访问;
String、StringBuilder、StringBuffer共同之处:
1、都是字符处理类。
2、来自java.lang包。
3、都实现了接口java.io.Serializable, CharSequence。
4、都是final class不能被继承。
1.10、final,finally,finalize区别?
final:关键字,修饰符,被final修饰的类不能被继承,被final修饰的成员变量只能在申明的时候给出初始值,final修饰的成员方法不能被重写;
也就是说被final修饰的成员变量和成员方法在使用过程中不能被修改
finally:是在异常处理的时候来提供finally块来执行任何清除操作的,不管异常有没有被抛出,捕获,它里面的代码都会执行,也就是说在代码逻辑中有需要无论发生什么都必须执行的代码就放在finall中;
finalize:方法名,这个方法是由垃圾回收器在确定这个对象没有被引用的时候调用的,他是在object中定义的,因此所有的类都继承了它;
1.11、重载,重写
重载:Overload是重载的意思,表示在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可
重写:Override是重写,它与返回值类型无关,只看参数列表(包括参数个数,参数类型,参数顺序),
两者不同主要体现在:目的不同、范围不同、参数不同、多态性不同、返回类型不同
1.12、深拷贝和浅拷贝:
对于数组来说
深拷贝就是相当于拷贝了数组的对象(基本数据类型),也就是数组当中的内容。
浅拷贝就是拷贝的是数组的地址(引用类型),浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化。
数组的拷贝:数组拷贝有深拷贝和浅拷贝
深拷贝:一般使用Arrays.copyOf() 方法,深拷贝修改新的数组不改变原数组。
浅拷贝:一般使用arr.clone() 方法,浅拷贝修改新数组和原数组。
1.13、Linux命令:
(1). 创建目录
mkdir dir
(2). 删除目录
rmdir dir 删除空目录 rm -rf dir递归删除dir目录中所有内容
(3). 重命名或剪切
mv dir /temp/dir 把dir目录剪切到temp目录下
(4). 查看目录
ls -la 列表形式显示文件夹里面的文件与目录的详细信息,包含隐藏文件
(5). 拷贝目录
cp -r /usr /test 将目录/usr下的所有文件及其子目录复制到目录/test中
1.14、mysql:
主键定义:
在数据库表中,如果有一组字段能够唯一确定一条记录,则可以把它们设计成表的主键字段。
外键定义:
通常用于在两个表之间建立关系。外键的主要用途是维持实体的两个独立实例之间的数据完整性。
1.15、多表查询:
inner join和left join区别为:返回不同、数量不同、记录属性不同。
一、返回不同
1、inner join(等值联接):inner join只返回两个表中联结字段相等的行。
2、left join:left join返回包括左表中的所有记录和右表中联结字段相等的记录。
3、right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
二、数量不同
1、inner join:inner join的数量小于等于左表和右表中的记录数量。
2、left join:left join的数量以左表中的记录数量相同。
3、right join:right join的数量以右表中的记录数量相同。
三、记录属性不同
1、inner join:inner join不足的记录属性会被直接舍弃。
2、left join:left join不足的记录属性用NULL填充.。(right join 一样)
1.16、SQ优化
1、explain 输出执行计划
在select语句前加上explain就可以了(MySQL 5.6开始,不仅仅支持select )能够简单分析sql的执行情况,是否走索引等。
2、in 和 not in 要慎用
3、少用select *
4、善用limit 1
5、 order by字段建索引
6、count(*)推荐使用
7、where 子句中避免is null /is not null
8、应尽量避免在 where!=或<> , 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
9、应尽量避免在 where 子句中使用 or
10、尽量用union all代替union
11、应尽量避免在where子句中对字段进行函数操作
12、可以选择 exists 代替 in
13、避免%xxx式查询
14、选择重复值较低的字段建索引
15、高效的分页
16、join使用问题:用连接查询代替子查询、join表不易超过3个、小表驱动大表、链接字段建索引。
17、关于索引本身