Java从零单排 -- 小细节

254 阅读4分钟

结合前面的几篇文章,增加几个简单的知识点。

访问权限 修饰符

官方链接 oracle accesscontrol 经典 控制权限表格 package 包 就是包含java文件夹

  • private 关键字意味着只有自己才能访问自己的成员变量、方法,其他类服务方法
  • public 公开的,所以的类都可以直接方法本类的成员变量、方法
  • protected 关键字为我们引入了一种名为“继承”的概念,它以现有的类为基础,并在其中加入新的成员,同时不会对现有的类产生影响——我们将这种现有的类称为“基础类”或者“基本类”(Base Class)。亦可改变那个类现有成员的行为。对于从一个现有类的继承,我们说自己的新类“扩展”(extends)了那个现有的类
  • default 只有同一包下才能访问。

初始化

  • 类构造器:每一个类都会有默认的构造器,一旦创建一个对象,就会分配相应的存储空间,对象才得到正确的初始化。默认构造器的名字必须与类名完全相同,在利用自变量创建带参数的构造器,就会覆盖默认的构造器。
  • final 关键字,被final修饰的变量,它永远不会改变
  • static 被static 修饰的字段、方法都会变为静态,调用时可以不用创建类直接调用
例如 : Boolean flag = Boolean.TRUE;
等价与  Boolean flag = new Boolean(true);

泛型

站内有一篇介绍的很好的文章 深入理解Java泛型 这里简单讲解下:

  • 泛型接口:
//用List接口作为示例
public interface List<E> extends Collection<E> {}
定义一个不具体接受类型的接口
  • 泛型类:在编译期间,无法知道接受类的类型时
//简化ArrayList类
public class ArrayList<E> implements List<E>{}
当我们编写一个ArrayList时,不知道ArrayList要容纳什么类型时,我们可以定义一个符号作为泛型,这样在new ArrayList时就可以指定具体的类型
例如:
List<String> list = new ArrayList<String>();
//容纳String的ArrayList集合
  • 泛型方法:
  //不知道具体返回类型时,用泛型替代,前提要先定义好类泛型
  public E get(int index) {
            rangeCheck(index);
            checkForComodification();
            return ArrayList.this.elementData(offset + index);
        }

封装、继承、多态

  • 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。

  • 继承是为了重用父类代码。两个类若存在IS-A的关系就可以使用继承。,同时继承也为实现多态做了铺垫。那么什么是多态呢

  • 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

public class Dog {
    public void go(){
        System.out.println("狗跑起来了");
    }
}

public class HaQiShi extends Dog{
    /**
     * @desc 子类重载父类方法
     *        父类中不存在该方法,向上转型后,父类是不能引用该方法的
     * @param a
     * @return void
     */
      public void go(){
        System.out.println("哈奇士跑起来了");
    }
}

public class TaiDi extends Dog{
    /**
     * @desc 子类重载父类方法
     *        父类中不存在该方法,向上转型后,父类是不能引用该方法的
     * @param a
     * @return void
     */
      public void go(){
        System.out.println("泰迪跑起来了");
    }
}

public class Test {
    public static void main(String[] args) {
        Dog a;
        //定义一个逻辑,当money大于2000块时,你就可以买一个泰迪回去溜,不然你只能溜哈奇士了
        int money = 1000;
        if(money>2000 ){
          a = new TaiDi();
        }else{
          a = new HaQiShi();
        }
       
        a.go();
    }
}
-------------------------------------------------
Output:
哈奇士跑起来了

方法重写,方法重载

  • 重写就是覆盖父类的方法,自己重新处理
  • 重载就是一个同一个方法名,同一返回值,只是参数不一样
//只接受int类型的参数
pubilc void go(int cout){}
//只接受int类型的参数和String类型的参数
pubilc void go(int cout,String Name){}
//只接受int类型的参数和boolean类型的参数
pubilc void go(int cout,boolean flag){}