2020-04-17 java学习记录
1.java内存划分
①栈:存放的都是方法中的局部变量,方法一定要在栈中运行。
局部变量:方法的参数,方法中的局部变量
作用域:一旦超出作用域,立刻从栈内存中消失
②堆:new出来的对象都存在堆中
③方法区:存储.class信息,方法信息
2.对象与类,
封装:将数据和行为组合在一个包里,并对对象的使用者隐藏具体的实现方式。
类之间的关系:
· 依赖
· 聚合
· 继承
①依赖就是一个类的方法操纵另一个类,我们就说一个类依赖另一个类;在设计时应尽量减少依赖关系,即减少类之间的耦合。
②聚合
类A的对象包含类B的对象
④对象构造:
- 重载:
多个方法有相同的名字,不同的参数则出现重载。(注意,返回类型不做考虑)。
使用null引用:
一个对象变量包含一个对象引用,活着包含null,如果对null应用了方法会产生严重的错误,因此在定义一个类时首先清楚哪些字段可能为null。
**在java 8+中 objects类提供了一个便捷的方法用来捕获空指针异常
public Employee(String n,double s){
name=Objects.requireNonNull(n,"unknown");
....
}
当产生空指针异常时,会抛出定制的NullPointerException.
注意:
不要编写返回可变对象引用的访问器方法,例如:
class Employee{
private Date hireDay;
public Date getHireDay(){
return hireDay;
}
}
LocalDate类没有更改器方法,但Date类有setTime,即Date对象是可变的,这破坏了封装性。因为如果在外面的一个Employee对象调用getHireDay方法,返回给Date d,这样两个变量引用同一个对象,一旦d调用setTime方法就该变了Employee对象的私有状态,这是不被允许的。
解决方案
class Employee{
public Date getHireDay(){
return (Date)hireDay.clone();
}
}
总结
如果需要返回一个可变数据段的引用则应该使用clone();
final字段
① 定义了final的字段必须在构造1对象时初始化,即在每一个构造器执行之后,final字段已经被设置了值,并且不能在修改
②final修饰符对于基本类型,不可变类字段尤其有用(不可变类是类中所有方法都不能改变对象状态),然而对于可变类可能会引起混乱。例如:
private final StringBuilder evaluations;
evaluations=new StringBuilder();
evaluations.append(...);
final修饰符只是表示对象引用不会指向另一个对象,并不代表这个对象的状态不能改变!!所以注意
3.Random用法,看三太子敖丙微信文章
4.static
①静态字段:
定义一个static字段,则每个类只有一个这样的字段,不属于对 象,属 于类,凡是本类对象,都共享一份。
②静态常量:
static final 由于每个对象都可以修改公共字段,因此当不想这样时可以加上final关键字,System类中的out对象就是这样一个静态常量对象
public class System{
public static final PrintStream out=...;
}
③静态方法
1.静态方法没有this隐式参数
2.静态方法可以访问静态变量与字段,但不能访问非静态字段,因为其不能在对象上操作(非静态字段是属于对象的)
④工厂方法
⑥静态代码块(学习jdbc时有很大用处)
①第一次使用本类时,静态代码块执行唯一的一次,且静态内容总是优先于非静态内容,即静态代码块比构造方法先执行。
②用途:用于一次性初始化静态成员变量
public class Test{
static{
...
}
}
5.方法参数
有两种类型的方法参数
基本数据类型
对象引用
我们知道一个方法是不可能修改基本数据类型的参数其为按值传递,那对象引用作为参数会怎样呢?
当对象引用作为参数时他的执行过程为:
1.x初始化为参数的副本,即同为一个对象的引用
2.x可以在方法中修改该对象的状态
3.方法结束后,x不再使用,但对象参数的状态已经改变。
但这并不代表对象引用参数时引用传递,实际上还是按值传递,因为方法不能让对象参数引用一个新的对象。
总结:
1.方法不能修改基本数据类型的参数
2.方法可以改变对象参数的状态
3.方法不能使对象参数引用一个新的对象