• 杂项
  • 继承
  • 抽象类和接口
  • 构造函数
  • 静态
  • 异常
  • 后续陆续添加

杂项

1. 实例变量<=>全局变量<=>有默认值
          局部变量<=>没有默认值
2. Java通过值传递,也就是拷贝传递,传递的是值的拷贝,不是原本的值
3. 参数是对象的时候,传递的对象本身就是个引用(值,指针,遥控器),指向的是内部堆上生成的对象本身
4. 字段的封装是为了在访问字段的时候加一层过滤网(set方法,get方法)。过滤网上可以加过滤条件
5. 对于值,==比较的是字节组合(int 3=byte 3)
6. 对于引用,==比较的是是否指向同一个对象
7. 对于方法的参数,低精度的参数可以传递到高精度的形参中,反过来不行
8. 写代码之前先写测试,好的单元测试能够帮助自己提高代码的可维护性和代码质量。PS:大的项目需要,几十行的demo不需要。
9. break 直接跳出当前循环;continue跳出本层循环,继续循环;

继承

1. 子类是extends父类出来的。
2. 子类会继承父类所有的public类型的实例变量和方法,但不会继承父类所有的private类型的变量和方法。
3. 继承下来的方法可能会被覆盖掉,但是实例变量不会被覆盖掉。
4. 使用IS-A测试来验证继承结构的合理性。IS-A关系是单方向的,河马是动物,但是动物不一定是河马。
5. 当某个方法在子类中被覆盖过,调用这个方法时会调用到覆盖过的版本
6. 如果类Y是extends类X,且类Y是类Z的父类,则类Z应该能通过IS-A X的测试。
7. 可以通过继承的方式来修改不能改变的类
8. 引用类型可以是实际对象类型的父类(Animal dog=new Dog();)PS:dog调用的方法是Dog的方法,父类的引用变量不能调用子类有,父类没有的方法。
9. 参数是父类对象,赋值子类对象,调用的是该子类的方法
10. Final 修饰的类不能被继承
11. 子类初始化的时候会初始化父类的构造函数
12. 编译器是根据引用类型来判断有哪些方法可以调用,而不是根据指向的对象来判断。
13. Instanceof 判断右边类是不是左边类的实例 if( o instanceof Dog)

抽象类和接口

1. 抽象类是为了防止类被初始化。
2. 抽象类除了被继承之外,是没有用途,没有值,没有目的的。
3. 抽象方法没有实体,不能在非抽象类里拥有抽象方法,可以有返回值,不能为私有的。
4. 抽象方法必须要被实现,(继承的抽象类实现了这个抽象方法后,具体类就不用实现了)
5. Java不支持使用多继承,(接口存在的意义,会有致命方块问题(子类不知道该调用父类的哪一个方法))。
6. Class可以实现多个接口。
7. 由4->接口定义的方法都要被实现。因为这些方法都是pubic和abstract的
8. 抽象类可以带有抽象的和非抽象的方法。
9. 如果类有抽象方法,那么类必定标识为抽象的
10. 要从子类调用父类的方法可以使用super关键字来引用

构造函数

方法(包括局部变量)放在栈上,对象(包括实例变量)放在堆上,如果实例变量是对某个对象的引用,也在堆上
Duck myDuck=new Duck();对象在实例化的时候调用对象的构造函数
构造函数:

1. 没有返回值,没有返回类型
            2. 对象初始化的时候会被执行(事实上执行构造函数来让对象初始化)
            3. 函数名和类名相同
            4. 构造函数可以用来执行一些对象在初始化需要做的事(例如初始化实例变量)
            5. 构造函数不能被继承
            6. 构造函数可以有参数,可以被重载。
            7. 重载的构造函数必须有不同的参数
            8. 只有在没有构造函数的时候,编译器会创建一个默认的构造函数
            9. 最好有默认的无参构造函数可以被调用

实例变量具有默认值0/0.0/false,引用变量的默认值是null
重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。
在创建新对象的时候,所有的构造函数都会被执行(先执行父类的,再执行子类的)
在new一个对象的时候:

1. 获取所有父类的实例变量。
2. 执行父类的构造函数(抽象类也会被执行构造函数)

super关键字必须放在子类构造函数的第一行(现有父亲再有儿子,所以必须要先执行父类的构造函数。)
this关键字用来从某个构造函数里调用同一个类的其他的构造函数。只能用在构造函数中
每个构造函数可以选择调用super()或者this()但是不能同时调用。
变量只要在栈中就算是活着,不在栈顶的时候指的是变量不在范围内
有三种情况可以释放对象的引用:

1. 引用永久性的离开他的范围。
2. 引用被赋值到其他的对象上
3. 引用被设定为null

静态

static标记不需要类实例的方法(可以直接用类名来调用方法,不能用对象引用变量。)
带有静态方法类通常不打算被初始化
如果类只有静态的方法,可以将构造函数私有化来避免类被初始化。
静态的方法不能调用非静态的变量,静态的方法也不能调用非静态的方法。
静态变量(static修饰)的值对于所有的类实例都相同(静态变量相对于类唯一,不管生成多少的类实例且所有类的实例共享一份静态变量。)
静态项目的初始化:

1. 静态变量会在该类的任何对象创建之前就完成初始化。
2. 静态变量会在该类的任何静态方法执行之前就进行初始化。

被标记为private的方法只能由同一个类来调用。
常数变量的名称应该都是大写字母,并使用下划线链接
final的变量代表你不能改变他的值。
final的method方法代表你不能覆盖掉该method。
final的类代表你不能继承该类(就是不能创建他的子类)。
final+static可以用来表示常量。
final的静态变量值必须在声明或者静态初始化程序中赋值(可以把这些常量组成一个类来调用)
在Java5.0之前主数据类型的装箱和拆箱要手动进行,在之后的版本中不需要主动进行

异常

异常是Exception类型的对象,编译器不会注意RuntimeException类型的异常。RuntimeException不需要被声明或者被包在try/catch的块中(也可以这么做)
方法可以用throw关键字抛出异常对象:throw new FileIsTooSmallException();
可能会抛出异常的方法必须声明为throw Exception。
try失败,抛出异常,流程转移到catch块,再到finally块。
try成功,跳过catch,流程到finally
如果try或者catch里有return指令,finally还是会被执行,流程会跳到finally再回到return指令
多个异常用throw抛出多个异常,中间用逗号隔开,处理语句用多个catch处理,多个catch排列是从小排列到大。表现在继承树上就是由下到上
不想处理异常的时候可以把异常duck掉(其实就是调用包含异常的方法的时候抛出同类型的异常)