小白总结,希望各位大佬不吝赐教
面向对象的三个特征
封装 继承 多态
封装:隐藏对象的属性或者方法,对数据访问提供开放的方法,这样做可以对内部数据进行不同级别的保护,外部数据也能够精准获取内部开放数据
实体类中为什么要写set get方法
使用set方法能确保数据的准确性
比如说年龄1-100这就可以通过set来进行设置,然只调用属性并不能进行这种判断
继承:子类继承父类中的属性或者方法,是子类拥有父类的某些特征
Object基类,若没使用extends继承任何类,则默认继承Object
多态:事物的多种形态。前提:父类对象引用子类对象,子类对象重写了父类中的方法
比如:动物类animal都能睡觉猫头鹰站着睡,狗是躺着睡的。
访问修饰符public private producted 缺省
public:当前类,同包,子类,不同包
product:当前类,同包,子类
缺省:当前类,同包
private:当前类
重写与重载
重写的前提是在同一个类中
两个方法方法名相同,参数类型|数量|顺序不同
重载的前提是有继承关系的两个类
子类重新书写父类中的方法,参数类型&数量&顺序都相同,返回类型必须相同
构造器不能被重写,能被重载
我们不能通过返回类型来区分重载这是应为当我们在调用这个方法时编译器无法确认要调用哪个方法
基础数据类型:byte char short int long double float boolean
引用数据类型:数组,String ,枚举,对象
基础数据类型数据储存在栈上
引用数据类型数据储存在堆上,栈上只存内存地址
short计算
shrot s = 0;
shrot s = s+ 1 编译错误
s+=1 编译正常
1为整数(int)类型shrot+int被强转为int类型
s+=1看字节码文件i2s可知结果int类型被强转为shrot了相当于s =(shrot)(s+1);
包装类Integer
Integer a =128,b=128,c=127,d=127;
a==b //false
c==d //true
Integer中含有一个IntegerCache缓存,它里面有个数组,默认放了-127到128的Integer对象,IntegerCache会对传进去的数字进行判断,如果是在这个范围的则返回cache数组中相应的对象,这也是因为c==d为true的原因
通过JVM启动参数可以修改IntegerCache的最大值-XX.AutoBoxCacheMax=<size>
最有效率的计算
位运算符
2<<3 == 8
工作中不推荐,可读性不太强,很多指令编译器也能够自己做优化
两个对象的比较
==与equal
==:比较基础数据类型变量比较的是值,比较引用数据类型则是比较的内存地址
equals:Object中定义的方法,用来比较两个对象是否相等,Object中默认也是使用==进行比较,我们一般会重写equals方法,判断两个对象的值是否相同
hashcode()与equals()
hashcode是利用hash算法将对象的内存地址存在hash表中,,我现在要储存900条数据,现在有八个这样的同我们就会把每一条数据%8将其分配到8个桶。这样做有利于后期进行查找,在进行比较的时候我们就先比较是否在同一个桶中,若不在同一个桶中,我们就用equals方法进行比较
结论:
hashcode相等equals比较的对象一定相等
equals比较的对象相等hashcode不一定相等
具体介绍:https://www.cnblogs.com/whgk/p/6071617.html
引用类型String StringBuffer StringBuilder
String s = new String("xyz") ||String s ="xyz"的区别
new String("xyz")创建一个||两个对象,创建一个对象前提是常量池中已经有了"xyz"
创建两个对象是常量池没有"xyz"对象,它会在常量池中创建一个"xyz"对象&会在堆中创建一个内容与"xyz"相同的对象实例
String 创建的值不能修改,一旦对字符串进行修改则会在常量池创建一个新对象
StringBuffer 可以对字符串进行操作不会创建一个新对象,线程安全
StringBuilder 可以对字符串进行操作不会创建一个新对象,线程不安全,但是性能更高
String中常用的方法
判断两个字符串是否相等
equals比较两个字符串的值
compareToIgnoreCase按字典比较两个字符串忽略大小写进行比较
trim删除前后的空格返回一个新字符串
isEmpty判断是否为空
indexOf查找第一次出现的位置
subString截取字符串
toLowerCase转换为小写
toUpperCase转换为大写
Java中方法参数
Java中只存在值传递,对于对象的参数,值内容是对象的引用
反射
在运状态中,对于一个类,我们可以通过反射知道其中的方法或者属性,对于一个对象,我们可以获取对象的属性或者方法,也可以修改其中的属性,这种动态的获取信息叫做反射。
我们通过反射可以更灵活的编写代码,代码可以在运行时进行装配,无需组件之间进行源码链接,降低了代码的耦合性。
在进行jdbc操作时,我们常常通过Class.forName("com.mysql.cj.jdbc.Driver")加载驱动(获取给定字符串名称的类)
深拷贝与浅拷贝
浅拷贝:对于基础数据类型,复制数据的值。对于引用数据类型,复制对象的内存地址,新旧对象指向同一个内存地址
深拷贝:对于基础数据类型,复制数据的值。对于引用数据类型,开辟一个新的空间,新的内存空间复制一个一摸一样的对象,新旧对象指向不同的内存地址。
由此可以得出深拷贝比浅拷贝,速度慢,内存花销大。
Java静态static
成员变量与静态变量
储存区域 静态变量储存在方法区中,成员变量储存在堆内存中。
变量存亡 成员变量随着对象创建而存在,随着对象的回收而被释放。静态变量随着类加载而被加载,随着类消失而消失
所属对象 成员变量是属于对象称之为实例变量,静态变量属于类又称为类变量
调用方式 成员变量只能被对象调用,静态变量能被类名和对象调用
静态方法调用非静态方法
可以调用,前提要创建此方法所属的对象,通过对象去调用非静态方法
静态与非静态初始化执行顺序
继承关系
父类静态变量(静态代码块 先声明的执行)-->子类静态变量(子类静态代码块 先声明的执行)-->父类非静态代码块-->父类构造器-->子类非静态代码块-->子类构造方法
静态变量或者静态代码块实在类加载时就执行了,非静态的
构造器没有使用static关键字,实际上也是静态方法
抽象类与接口
抽象类使用abstract修饰接口使用interface修饰
抽象类是自下而上的抽象过程,提供了通用实现,对某一类事物的抽象。我们在实现类的时候,发现一些相同的实现,因此我们将这些相同的实现抽取出来成为抽象类,若存在一些差异,则通过抽象方法来实现。
接口是自上而下的抽象过程,接口规范了某些行为,是对某一个行为的抽象。这个行为我们具体实现,我们要自定义。
抽象类只支持单继承,接口能多实现,
抽象类中可以有成员变量和常量,抽象类中只能有常量
抽象类中用有非抽象方法,java 7之前方法只能是抽象的,java 8接口支持非抽象方法,java 9支持私有方法和私有静态方法
普通类像亲爹 他有什么,你就有什么
抽象类像叔伯 给你一部分,还能知道你做事
接口像干爹 给你指引方法,做成什么样子还得看自己
异常
Error和Exception
都有一个共同的父类throwable
Error表示系统级的错误和程序不必要处理的异常。内存溢出,线程死锁,虚拟机错误,这些都是Error异常。
Exception异常是能够通过程序去处理的异常,包括运行时异常,IO异常,SQL异常等
一般我们遇到的运行时异常:NullPointerException(空指针异常),ArrayIndexOutOfBoundsException(数组下标越界),ArithmeticException(算数异常),ClassCaseException(类型转换类型)
可查异常:编译器要求必须处理的异常IO异常,SQL异常,若不处理,编译就通过不了
不可查异常:编译器不要求强制处理的异常如运行时异常RuntimeException,运行时异常一般是逻辑发生错误,我们不需要将其抛出或者捕获,我们应该在逻辑上去避免这种错误
处理异常
throws抛出
try...catch...finally捕获
在return前会先执行finally语句
JDK1.8新特性
持续学习中...
标签:变量,对象,子类,数据类型,方法,面试,JavaSE,静态 From: https://www.cnblogs.com/new-to-java/p/16908567.html