美文网首页
Java 复习笔记day1- 加深理解

Java 复习笔记day1- 加深理解

作者: Athenaearl | 来源:发表于2019-02-27 22:13 被阅读0次

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

    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. 静态方法的适合使用的情况:

    • 本身来说静态方法在java中是不推荐使用的:
      首先,它在程序初始化运行时候就会加载到内存中,后期只要调用,调的都是同一个方法(同理于静态变量),一直都不会被释放,占用内存。
      其次,在高并发问题中也存在问题。
    • 但是不代表没有它适用的场合:
      在大量的重复使用一个方法时候。如果它是一个非静态方法,正常操作就是会实例化很多的对象,从而调用这个方法。要知道实例化的过程是分配内存的过程,非常消耗时间,因此在这种情况下可以考虑使用静态方法。
      比如实战过程中假设有server包下的AppServer类,显然这个类下的方法是要非常经常调用的,但是有可能这个类下有大量的方法,存为静态过于消耗内存,因此会有Spring框架的出现

    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的含义:限制变量不变

    • 作用于 基本数据类型,使数值恒定不变

    • 作用于 引用类型,使引用不变,也就是说,这个引用不能再指向另一个对象

    • 同时被static 和 final 限制的变量,很好理解代表 编译时常量 ,存储在一块不能改变的存储空间,这个时候一般将变量大写

    • 作用于 函数声明中参数(非基本类型),代表这个参数引用不能指向其他的对象

    • 作用于 函数声明中参数(基本类型), 代表这个参数是只读的,不可修改

    • 作用于 方法,这个方法不可以被override

    • 作用于 类,代表这个类不可以有子类

    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的随机数
    

    相关文章

      网友评论

          本文标题:Java 复习笔记day1- 加深理解

          本文链接:https://www.haomeiwen.com/subject/xbqfuqtx.html