【随笔】

如果存在null对象,并且用该对象调用了任何方法或者做出什么操作,就抛出空指针异常 NullPointerException
基本数据类型,作为方法的形式参数传递的时候,是 值传递。(将实参的值:copy一份到形参中;在方法中对形参做任何的改变,都不改变其值)
引用数据类型,作为方法的形式参数传递的时候,是 引用传递。(实际参数 copy 一份地址值【对象的引用】给形式参数;实际参数改变)
验证程序:debug:step over:F8 跨过(子方法的具体调用过程)、 step into:F7 进入(子方法内的具体执行过程)、
force step into:Alt+Shift+F7 强制进入子方法内、 step out:shift+F8 跳出 从字方法内跳出
resume program:F9:从中断中恢复程序的继续执行、 stop 停止程序的执行
breakpoint 断点

面向对象:
成员变量:区分当前对象与其他对象不一样用的(你和他的身高不一样,年龄不一样。。。)
构造方法:给成员变量赋值用的。 特征:1.构造方法名与类名同名;2.没有返回值,没有void;3.构造方法也可以重载
匿名对象:new 类名() 只能用一次;仅作作为实际参数使用。 好处:缩短作用域范围,用完就销毁内存。
封装:把成员变量隐藏,提供公共的成员方法供大家使用
this:使用场景:1.局部变量和成员变量重名时;2.可以使用this,显示的指明成员变量
static:修饰成员表变量时,static 关键字,把成员变量的级别提升到类的级别。让所有的对象,公用一个成员变量
静态成员变量建议用类名来调用,不推荐用对象调用。
static关键字注意事项:
-静态方法中不能出现this和super,因为this和super是指当前对象,static是针对类而言;
-静态方法只能访问静态的成员变量和静态的成员方法。
代码块的使用:代码块,就是用{}包裹起来的代码
1.局部代码块
出现位置:方法中; 作用:缩短变量的生命周期,及早释放,提高利用率
2.构造代码块
出现位置:在类中,方法外;
作用:将重载构造方法中的公共部分,提取到构造代码块中,每个构造方法(实体内容)执行前,先执行构造代码块实体的内容
3.静态代码块
出现的位置:类中,方法外
作用:因为静态的成员,会随着类的加载而加载
静态代码块,常常被用来对类进行初始化,
在类的调用过过程中,静态代码块只执行一次。
继承:-父类空间优先于子类对象产生:每次创建子类对象时先初始化父类空间,再创建子类对象本身。
代码体现在子类的构造方法调用时,先调用父类的构造方法。
-子类不能访问(继承)父类的私有成员(成员变量和成员方法)
-子类无法继承父类的构造方法,但是可以通过super()间接的调用父类的构造方法 -在子类方法中访问一个变量(就近原则):首先在子类局部范围找;然后在子类成员范围找;
-最后在父类成员范围找(肯定不能找到父类局部范围);若还没找到,就继续想上找父类的父类。
-总结:在继承情况下,成员变量从父类继承过来时,age = this.age = super.age;
成员变量重名时,age:本地变量; this.age:子类的成员变量; super.age:父类的成员变量
子类重写父类方法时,访问权限不能比父类权限更低。
final:可以修饰类、成员变量、成员方法、本地变量、形式参数。
修饰类:类不能被继承(太监类),final类中的所有成员方法都会被隐式地指定为final方法;
修饰方法:方法不能被重写; 修饰成员变量:变量只能赋值一次;
修饰形式参数:A.基本数据类型(整数,字符串等):在方法内,不能再对形式参数做任何改变;
B.引用数据类型(数组,类,接口等):不能再次给形式参数赋值,但是因为是引用类型,可以修改引用所指的堆内存内容(如修改数组内容等)。

finally:是在异常处理时提供finally方法块来执行操作。不管有没有异常被抛出、捕获,finally块都会被执行,

所以在代码逻辑中有需要无论发生什么都必须执行的代码,就可以放在finally块中。

finalize:finalize是方法名。使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在object类中定义的,因此所有的类都继承了它。
子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

   如何给final的成员变量初始化?
   1.定义变量时直接赋初值;  2.在其构造方法中,对变量进行初始化。

多态: 满足三个条件:1.必须要有继承关系; 2.必须要有方法的重写; 3.必须要父类的引用指向子类对象。
如果子类和父类有 【重名】 的成员变量或成员方法或静态成员方法时:
-成员变量:编译看左边,运行看左边
1.父类有,子类有,编译看左边,运行看左边; 2.父类有,子类没有,编译看左边,运行看左边;
3.父类没有,子类有,想访问的话,先向下转型在访问成员变量。
-成员方法:编译看左边,运行看右边(遵循就近原则,先找子类,若没有再找父类)
1.父类有,子类有,编译看左边,运行看右边; 2.父类有,子类没有,向上找,编译看左边,运行看左边。
3.父类没有,子类有,因为编译看左边,因此编译错误。
-静态的成员方法(不存在重写): 编译看左边,运行看左边
1.父类有,子类有,编译看左边,运行看左边; 2.父类有,子类没有,编译看左边,运行看左边;
3.父类没有,子类有,编译不通过。
-多态的好处:实际开发中,将父类类型作为返回值或者形式参数,传递子类对象进去,进行方法的调用,体现出多态的扩展性与便利
abstract 抽象类:-可以有成员变量,可以有常量。
-可以有抽象方法(方便于子类来重写),也可以没有(提高代码复用性)。但是抽象方法所在的类一定是抽象类。
-可以有构造方法,但不能被实例化,它是用于子类实例化时通过super(XXX,YYY)来初始化父类的成员变量。
-被继承的时候,要么子类重写父类所有抽象方法,要么子类也是抽象方法。
-和abstract不能一起用的关键字:private、final、static、
接口:-存在是为了让子类(可以是抽象类)实现或子接口继承。 接口中没有构造方法;
-接口中定义成员变量只能用final关键字; (public final static) int i = 10;
-接口中可以有抽象方法,格式:(public abstract) void 方法名
-接口作为方法的形式参数:本质上传递的实际参数是 实现了该接口的实现类(子类)对象;
抽象类作为方法的形式参数:本质上传递的实际参数是 继承了该抽象类的子类对象。
-接口作为方法的返回值:本质上返回的是 实现了该接口的实现类(子类)对象;
抽象类作为方法的返回值:本质上返回的是 继承了该抽象类的子类对象。

接口与继承设计理念区别:——抽象类被继承 体现的是 “is a”的关系,体现共性;
——接口被实现,体现的是“like a”的关系,体现扩展性。
——继承:如果多个类的某个部分的功能相同,那么可以抽象出一个类出来,把他们的相同部分都放到父类里,让他们都继承这个类。
重点内容——实现:如果多个类处理的目标是一样的,但是处理的方法方式不同,那么就定义一个接口,也就是一个标准,让他们的实现这个接口,各自实现自己具体的处理方法来处理那个目标。
.

**对象的克隆:
条件:1,当前对象的类,必须实现一个标记型的接口Cloneable
2,当前对象的类,必须要重写object的clone()方法
不会克隆成员方法和引用数据类型
语法格式:对象.clone();来创建一个对象的克隆对象..Student student2 = (Student)student.clone();
克隆的条件:
* 1:实现一个接口 Cloneable
* 2:重写Object类的clone()方法**
*
浅克隆(shaow clone):对象的成员变量的类型为(基本数据了类型+String类型)而其他的引用类型和成员方法不克隆
①克隆的对象所在类必须实现Cloneable这个接口,②而且需要重写Object中clone方法,throws CloneNotSupportedException
深克隆(deep clone): 深克隆与浅克隆的区别就是,浅克隆不会克隆原对象中的引用类型,仅仅拷贝了引用类型的指向。深克隆则拷贝了所有。也就是说深克隆能够做到原对象和新对象之间完全没有影响。而深克隆的实现就是在引用类型所在的类实现Cloneable接口,并使用public访问修饰符重写clone方法。

/*Date birthday = null;
    String pattern = "yyyy-MM-dd hh:mm:ss";
    SimpleDateFormat sdf = new SimpleDateFormat(pattern);

   //将一个字符串的日期表示形式,转换为Date类的对象。
    birthday = sdf.parse("1997-06-23 11:06:25");
    Employee emp = new Employee("Tom",18,birthday);
    System.out.println(emp);
*/

parse(“yyyy-MM-dd hh:mm:ss SSS)
//把字符串的日期表现形式,转换成Date类的对象
format
//将Date类型的对象,转换为已经按pattern格式化过的字符串表现形式

runtime的单例模式

String类:字符串 ,字符序列,不可改变的
加“”的都在常量池中,new出来的都在堆中
value是 { }中的值
字符串拼接相当于new了一个新的。

StringBuffer类的特点:

1,StringBuffer 与String类似,是一个可变的字符串序列
2,StringBuffer 线程安全,操作慢
3,StringBuffer 的常见猜哦做append(),insert()
4,StringBuffer 内部维护了一个数组,把该i属猪叫做StringBuffer 的容量,而且该数组自动扩容
5,StringBuffer 与数组的区别:
数组的长度是固定的.,默认容量是16个字符
StringBuffer可以是扩容的. StringBuffer可以存储任意类型的数据
6,工作中,建议用StringBuffer(线程不安全但速度快)同等的类型
StringBuffer节约内存,String长度不可改变,浪费内存
capacite() 表示StringBufffer默认的容量为16
数组容量快用完是, 新数组的容量=新数组的容量*2+2
通过capacity()和可查看容量
StringBuffer类的常用方法:
append(//追加的内容) 可追加内容,直接写在()中,类似于String中的拼接符号”+”
insert(offset,str) 在offsert索引下插入str
deleteCahrAt(索引) 删除索引对应的元素,该字符串本身发生变化
deleteCharAt(索引1,索引2) 从索引1到索引2的元素都删掉,左闭右开
reverser() 反转(倒序),该字符串本身发生变化
substring()截取返回一个新的String类型的字符串,#原字符串本身不变#
运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

面试题)
装箱与拆箱:
装箱:(本质,编译器编译代码的时候自动的将基本数据类型调用Integer的valueOf()方法完成装箱操作)
Integer i=new Integer(value);
Integer i=Integer.valueOf(value);
(优化)Integer i=value;

拆箱:(本质,编译器编译代码的时候自动地将包装类的对象,调用intValue()方法返回基本数据类型)
(优化)int 1=Integer1;
//在任何的null的对象上面,调用任何的成员犯法,都会抛出空指针异常!所以在自动拆箱的时候常常会做对象的非空判断

Character 的方法是静态static的,可以直接有类名调用
Character.isDigit(char c) 判断c是否为数字

猜你喜欢

转载自blog.csdn.net/weixin_39530338/article/details/82106756