Java 复习笔记day1- 加深理解

2019-02-27  本文已影响0人  Athenaearl

主要用于对于自己以前不太熟悉的知识加深印象

1. extends 和 implements 的区别:
从程序的角度来说:
extends 和 implements 之间的区别好像也只有 extends 是单根继承 而 implements 是可以有多个的实现类
而从语义上来讲:
extends: 表达的是 “是什么”。如果 A 继承于 B 那么表达的是 B 是一个更大的类型,也就是 A 是 B。举例来说: 比如 bird 类继承于 animal 表达的语意是 bird 是 animal
implements: 表达的是能力。如果 A 有 B 的接口,表达的是 A 可以做 B 的事情。举例来说:bird 类 继承于 flyable 表达的语意是 bird 有 fly 的能力

2. 容器和数组:
数组一般用于定长的情况

3. 静态方法的适合使用的情况:

4. 方法传参
不同于C , java 传递的是引用,而非仅仅传值

5. .equals() 和 == !=
在默认的情况下,.equals() 比较的是引用而非值,因此如果我们自己构建了一个类, 并且没有override equals 方法,那么就会发现尽管生成了两个存放值一样的对象,使用 equals方法 结果仍然是false。
但是,.equals() 被大多数的Java的类 override 了,用于判断其值是否一致
而 == 和 != 本身就是用于比较值是否相等的

6. java 中仍然存在短路语句

7. break continue goto
goto语句由于会使得程序难以理解因此不推荐使用
但是我们会有这种情况,多重循环中的内层循环中达到某一个条件时候跳出所有的循环,这种情况常见,但是没有goto语句在C等语言中不好处理,因此,java 的解决方法是,在外层循环上一行加一个标签,比如label1:,使用时候 break label1

8. JavaBean
一种遵循的写法,将变量都设置成private,接触该变量的方式是暴露给外界的方法:setter getter

9. 重载
构造器和方法都可以重载,名称相同,返回值相同(理论上是可以用返回值来重载的但是并不推荐),参数列表不同
一般用于对不同的事物做类似但方法不同的操作。
比如: 吃饼干,吃水果,。。。 动作都是 吃,但是对象不同,吃法不同,因此要重载

10. 构造器的重载
要知道在Java中如果一个类没有构造器是不可以生成对象的。在我们没有显式的创建构造器时候,java会自动生成一个默认构造器,其传入参数为空。但是如果我们显式的创建了构造器,那么默认构造器就不会生成。
因此,我们会发现,如果创建一个参数列表非空的构造器,而没有创建参数列表为空的构造器,那么className temp = new className() 不能生成对象

11. this 的使用
最简单的是 用this表示是当前的对象
还有就是 在构造器中想要调用自己这个类的别的构造器时候: this(参数列表)

12. 可变参数列表
约束 返回值 函数名(Object... args)
代表 args 是一个Object类型数组
但是传入参数时候不用写成 new Object[]{.., ..,...} 的形式
只需要正常传参数就好
当然 不一定非要是 Object 类型 String Character ... 都是可以的
但是: 要注意的是,由于可变参数列表的出现,方法重载很难让编译器分清究竟哪一个是调用的方法,解决方法是,在可变参数列表前加入非可变参数

13. enum
用法:

public class Demo{
    private enum job{
        Doctor, nurse, teacher
    }
    public static void main(String[] args) {
        job person1 = job.Doctor;
    }
}

笔者之前从来不用enum 但是enum还是有很好的用处:
它结合switch语句可以使得程序具有更好的自注释特性

enum 应该是和 class interface 同级的
其生成类 job
job 生成实例 person1

14. 包的权限控制
包的权限只有两种选择: public 和 包访问权限
public 就是 别的包可以引这个包里的这个类
包访问权限 就是 只有本包可以引用这个类

15. 单例设计模式
如果在设计一个类时候,不希望使用者直接获得该类的实例
可以将构造器设置为私有的,然后通过内部的静态方法调用构造器返回出去
如果希望在生成的过程中前前后后一直是一个实例,那么可以是在这个静态方法中设置一个私有静态变量,调用构造器,返回该静态变量的值

public class Demo{
    private static Demo temp = new Demo();
    private int a = 0;
    public void setA(int value){
        a = value;
    }
    public int getA(){
        return a;
    }
    private Demo(){
    }
    public static Demo createDemoInstance(){
        return temp;
    }
}

class test{
    public static void main(String[] args) {
        Demo temp1 = Demo.createDemoInstance();
        Demo temp2 = Demo.createDemoInstance();
        System.out.println(temp1.equals(temp2));
    }
}

结果:

true

16.在每一个主要的类中加一个main方法
在没有完成整个项目之前也不需要删除,便于单元测试

17. 在子类实例化一个对象的时候,它的父类先实例化一个对象

class Animals{
    private Animals(){
    }
}
class birds extends Animals{

}

发生报错,因为父类无法实例化对象

18. final 的作用
final的含义:限制变量不变

19. interface 和 extends

public class Demo{
    public void act(Runable animals1, Animals animals2){
        animals1.run();
        animals2.feed();
    }

    public static void main(String[] args) {
        Runable animals1 = new Bird();
        Animals animals2 = new Bird();
        Demo demo = new Demo();
        demo.act(animals1, animals2);

    }
}

interface Runable{
    public void run();
}
class Animals{
    public void feed(){
        System.out.println("Animal feed");
    }
}
class Bird extends Animals implements Runable{
    @Override
    public void run() {
        System.out.println("bird can run");
    }

    @Override
    public void feed() {
        System.out.println("bird feed");
    }
}
class Bear extends Animals implements Runable{
    @Override
    public void run() {
        System.out.println("bear can run");
    }

    @Override
    public void feed() {
        System.out.println("bear feed");
    }
}

结果:

bird can run
bird feed

尽管传入的是接口类 或者 父类,但是 编译器仍然能够分清它是什么具体实现类
interface 类中的方法声明不需要限制 public 因为它本身就是public的

20. 工厂模式
抽象产品类(定义所有产品都需要有的接口)
多个实现产品类继承于该抽象类
抽象工厂类(定义所有工厂需要有的动作,不具体到实现产品类)
实现工厂类

21. 接口中存放的域是 static 和 final 的
22. 内部类
笔者没怎么用过内部类,但是,内部类有很多的优势:
可以将一些有关系的类连接到一起
可以将代码写的更加优雅

部分细节

Random rand = new Random(12);//放入种子(即一个数),没放就是根据当前时间来生成
for(int i = 0;i<10;i++)
     System.out.println(rand.nextInt(100));//生成0到100的随机数
上一篇 下一篇

猜你喜欢

热点阅读