个人笔记程序员技术干货

Java基础知识干货

2017-10-27  本文已影响40人  fanyank

这个是我个人阅读《Java核心技术》和《Java编程思想》总结出来的笔记,清晰明了,但是没有细致讲解,如果碰到疑惑的地方,可以另行查阅。

封装

对象变量和对象

Date deadline;   //没用引用任何对象
deadline = new Date();  //使用新构造的对象初始化变量
Date birthday = deadline; //引用一个已经存在的变量
变量和对象

更改器方法和访问器方法

隐式参数与显式参数

public void raiseSalary(double byPercent) {
  double raise = this.salary * byPercent / 100;
  this.salary += raise;
}

函数的参数为 显式参数,this 为 隐式参数

final实例域

final 修饰符大都应用于基本类型域,或不可变类的域(类中的每个方法都不会改变其对象,这种类就是不可变的类,如String),对于可变的类,所传达的意思为该变量不会再引用其他对象,但这个对象仍然可变(如StringBuilder)

方法参数

继承

  1. 子类继承父类的成员变量
    当子类继承了某个类之后,便可以使用父类中的成员变量,但并不是完全继承父类的成员变量
  1. 子类继承父类的方法
    同样的,子类也不是完全继承父类的所有方法

注意:隐藏和覆盖是不同的。隐藏是针对成员变量和静态方法的,而覆盖是针对普通方法的。

引用自http://www.cnblogs.com/dolphin0520/p/3803432.html

重载

无参构造器

只有当一个类没有任何构造器时,系统才会给一个默认的无参构造器,该构造器将实例域设置为默认值(null,false,0)

如果在源文件中没有 package 语句,这个源文件中的类将被放置在一个默认包中,默认包是一个没有名字的包

this和super

  1. this有两个用途:
  1. super有两个用途

什么是多态

一个对象变量可以被指示为多种实际类型的现象被称为 多态

class Base{
  int count=2;
  public void display() {
    System.out.println(this.count);
  }
 }

public class Derived extends Base{
int count=20;

@Override
public void display() {
  System.out.println(this.count);
}

public static void main(String[] args) {
    Base base = new Derived();
    System.out.println(base.count);      //2
    base.display();                      //20

  }
}

要弄清楚这个过程,首先需要知道什么叫做绑定
将一个方法调用和一个方法主体关联起来叫做 绑定,程序执行前进行绑定,叫做前期绑定(C语言只有一个方法调用,就是前期绑定),上述程序之所以让人迷惑,就是因为前期绑定,为了解决这种冲突,引出了后期绑定。
后期绑定的含义就是运行时根据对象的类型进行绑定,后期绑定也叫做动态绑定,如果一种语言想实现动态绑定,那么就必须有某种机制。以便在运行时判断对象的类型。
Java的做法是除了 static和final,其他所有的方法全部都是动态绑定。

如你所见,base变量在运行期间是Derived类的行为,但是访问base域时却是Base的域,这是因为动态绑定的存在,使得原本Base类的普通方法(非private,static::注:非private是因为private被自动认为是final方法)被覆盖掉,所以表现出来的行为就是Derived类的行为。

什么是动态绑定

见上

在覆盖一个方法时,子类方法不能低于父类方法的可见性

抽象类和抽象方法

  1. 子类仍然标记为抽象类
  2. 子类不被标记为抽象类,但是需要 定义全部的抽象方法

在Java中,只有基本类型不是对象,所有的数组类型(包括基本类型数组)都扩展了Object类

hashcode

包装器对象

==和equals

需要注意各种包装器中valueOf()方法的实现,其中Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的,Double、Float的valueOf()方法的实现是类似的。

Integer、Short、Byte、Character、Long这几个类的valueOf方法实现如下,该种实现会使数值在[-128,127]之间的对象指向同一块内存区域。

public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
}

Double、Float的valueOf()方法的实现如下,每次都会返回一个新对象。

public static Double valueOf(double d) {
       return new Double(d);
}

那么布尔类型的valueOf()实现是怎样的呢?

public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
}

这就意味着下面这段代码输出为true,true。

public class Main {
    public static void main(String[] args) {
        Boolean i1 = false;
        Boolean i2 = false;
        Boolean i3 = true;
        Boolean i4 = true;

        System.out.println(i1==i2);
        System.out.println(i3==i4);
    }
}

获取Class对象

1. Random generator = new Random();
   Class cl = generator.getClass();

2. String className = "java.util.Random";
   Class cl = Class.forName(className);

3. Class cl = Random.class;

获取对象的实例

Object m = Class.forName(s).newInstance();

垃圾回收

接口中的自动声明

每个类只能有一个超类,但是却可以实现多个接口

接口的默认实现

public interface Comparable<T> {
  default int compareTo(T other) {
    return 0;
  }
}

解决接口冲突

实现Comparator接口来进行排序

Comparator接口中比较器声明如下:

public interface Comparator<T> {
  int compare(T first,T second);
}

实现按长度比较字符串,可以定义一个Comparator<String>类

class LengthComparator implments Comparator<String> {
  public int compare(String s1,String s2) {
    return s1.length() - s2.length();
  }
}

实际调用:

//1.普通调用
Comparator<String> comp = new LengthComparator();
if(comp.compare(word[i],word[j]) > 0) {
  ...
}

//2.比较器调用
Arrays.sort(arr,new LengthComparator());

使用lambda表达式

上述例子可以修改如下:

Arrays.sort(arr,(s1,s2) -> s1.length() - s2.length());

lambda表达式的作用域

lambda表达式有三个组成部分:

  1. 要确保该值只能被引用,而不会被改变
  2. 该值在lambda外部必须是最终变量
  3. lambda表达式的体与嵌套块有相同的作用域,要避免命名冲突
//该例子存在命名冲突
Path first = Path.get("/usr/bin");
Comparator<String> comp = (first,second) -> first.length() - second.length();
  1. 在lambda表达式中使用this关键字时,this所指与平常无异(即this为创建lambda表达式方法的对象)

什么是函数式接口

对于只有一个抽象方法的接口,需要这种接口对象时,就可以提供一个lambda表达式,这种接口成为 函数式接口

Java基础知识干货2传送门->http://www.jianshu.com/p/9bb6827a768c

上一篇 下一篇

猜你喜欢

热点阅读