下面的东西是在一天内用了三个编辑器写的,所以风格有点不太统一

  1. 一:下午完成

  2. 主要看了java的类型系统,具体如下。

  3. 1)接口

  4. 作为又一个引用类型,接口可以说是一种特殊的类,可以有属性和行为(字段和方法),但是都是受限的。

  5. 不过java8里面倒是加了新功能,可以使用默认方法。

  6. 对于接口中的强制方法(抽象方法),子类必须全部实现。

  7. 对于默认方法觉得有必要举个例子。

  8. java.util.List接口中有一个sort()默认方法,定义如下。

  9. interface list<E>{

  10. publi default void sort(Comparator <? super E> c ){//其实这个方法有些不太理解

  11. Collections.<E>sort(this,c);

  12. }

  13. }

  14. 还有一种是全空的标记接口,不需要在子类中实现任何方法,主要是方便将类的实例作为接口的有效实例,比如java.io.serializable接口,就是声明这个类的实例可以安全序列化(貌似是一种转换机制)。

  15. 2)java泛型

  16. 容器类型一般叫做泛型:

  17. interface Box<T>{

  18. void box (T t);

  19. T unbox();

  20. }

  21. 使用泛型可以增强程序的安全性——编译时会检查类型错误

  22. <T> 还有个名字叫参数类型,参数类型始终是引用类型,它的值不能使用基本类型。

  23. 在java中使用菱形句法可以省略重复的类型值:List<CerteredCircle> shapes = new ArrayList<>();

  24. 非泛型的List一般叫做原始类型(就是比较low了)

  25. 参数化类型也不能实例化,比如ArrayList<T>,但是编译时也需要了解这是什么类型,怎么办呢?使用通配<?>

  26. ArrayList<?> mysteryList = unknowList():

  27. Object o = mysteryList.get(0);

  28. java语言是禁止实例化负载为未知类型的容器类型,比如List<?> unknows = new ArrayList<?>();

  29. 还有合法的List<?> objets = new ArrayList<String>();

  30. 这表明,List<String>是List<?>的子类型。但是List<?>都不是List<T>子类型。

  31. 还有就是类型变体(有点抽象),举个例子就是List<cat>是List<? extends pet>子类型,因为List是Cat对象的制造者。

  32. 可以理解为PECS原则(制造者使用extends,使用者使用super)

  33. 作为java泛型的使用者,我们需要理解类型擦除(有点难理解)的基本知识,特别是运行时对泛型的处理方式。

  34. 这里再说一下编译时和运行时的一些差别,就是对比javac和JVM的区别。

  35. List<String> l = new ArrayList<>();

  36. System.out.println(l);

  37. 究竟有什么不同呢?可以想一下 l 的类型,结果是编译和运行两个阶段是不一样的。javac把l 看作List-of-String类型,会依照这个检查句法错误。

  38. 而jvm 呢,把l看成是ArrayList类型的对象,还因为要擦除类型,所以运行时l是原始类型(,,自己都有点糊涂了)

  39. 3)枚举和注解

  40. 这个还是举个例子更清楚:

  41. 枚举:

  42. public enum RegularPolygon{

  43. TRIANGLE(3),SQUARE(4);

  44. private Shape shape;

  45. public Shape getShape(){

  46. rerurn shape;

  47. }

  48. private RegularPolygon(int sides){

  49. switch(sides){
    case 3:

  50. shape = new Triangle(1,1,1,60,60,60);//边长和角度

  51. break;

  52. case 4:

  53. shape = new Rectangle(1,1);

  54. break;

  55. }

  56. }

  57. }

  58. 需要说明的是枚举实例是由java运行时创建的,在外部不能实例化,所以将构造方法声明为私有方法。

  59. 注解:(是一种特殊的接口)

  60. 常用的有@Override,@Deprecated,@SuppressWarnings,@SafeVarargs(变长参数方法提供警告静默),@FunctionInterface。

  61. 还有自定义注解,就是使用元注解@Target,@Retention。

  62. 看一个示例

  63. @Target(ElementType.METHOD)

  64. @Retention(RetentionPolicy.RUNTIME)

  65. public @interface Nickname{

  66. String[] value() default {} ;

  67. }

  68. 二:晚上计划

  69. 将剩余的两个知识点看完,嵌套类型和lambda表达式

  70. 三:遇到问题

  71. 有些知识点即使看过了还是不能充分理解,大概这就是看书的局限性吧

  72. 四:收获感悟

  73. 对于java8的lambda表达式,自己一直都是只闻其名,没有真正了解和使用过,这次要弥补这个缺憾。

  74. 分割线---------------------------------------------------------------------------------------------

    一:晚上完成

  75. 4)嵌套类型
    1.  先说一下自己对国外的翻译书籍《java技术手册》和国内著名博客的粗浅理解

    A 首先国外的书讲的知识点是精辟到位的,不止是为了方便读者理解而书写的,更多的是为了阐明某个知识点,但是这样会导致读起来左拐右拐的,有深有浅,对于初学者来说是不太好理解的,需要你有一定的知识积累,才能不受那些专业词汇的煎熬。

  76. B 而国内的博客文章就是春风化雨了,在国人普遍逻辑上尽可能以一种方便理解的视角去解读知识点,让你很快的就熟悉并掌握,不多涉及底层。
  77. C 只能说两者各有特点吧,与我而言,还是看博客更爽一点,等理解了再去翻看国外的技术书籍估计会有另外的收获
  78. 大神就是大神,代码境界真的是甩我几条街,我就不献丑了,也是为了大家能看懂。
  79. 再说说顶层类型有哪些(类、接口、枚举),它们都是包的直接成员。
    1. 引入嵌套的目的:深入访问另一个类型的内部实现;在特定情况下使用某个类型。

      有四种类型(不能简单的说是内部类或是匿名类,因为不能说静态成员类型是内部类),静态成员类型、非静态成员类型、局部类、匿名类。

    /**
    * 四种不同类型的内部类
    * @author Administrator
    *
    */
    public class OuterOfInnerClass {
    int out_x = 0;

    public void method() {
    Inner1 inner1 = new Inner1();
    final int a = -1;
    //在方法体内部定义的内部类,只允许使用抽象或终态
    /**
    * 局部内部类
    *
    */
    class Inner2 {
    public void method() {
    out_x = 3;
    System.out.println(a);
    }
    }
    Inner2 inner2 = new Inner2();
    }
    /**
    *成员内部类 Inner Class
    *
    */
    public class Inner1 {

    }
    /**
    * 静态内部类 Static Nested Class
    *
    */
    public static class Inner3 {
    int a = new OuterOfInnerClass().out_x;
    public void aa() {

    }
    }

    public ParentAbstract rr() {
    /**
    * 匿名内部类
    */
    return new ParentAbstract() {
    void save() {
    }
    };
    }
    public void testInner1() {
    int b = 1;
    OuterOfInnerClass oo = new OuterOfInnerClass();

    OuterOfInnerClass.Inner1 inner1 = oo.new Inner1();
    }

    }

    abstract class ParentAbstract {
    abstract void save();
    }  

5):lambda表达式
听说,lambda表达式的很多功能都能使用嵌套类通过回调和处理程序等模式实现(我是没有见过)
有些人喜欢把lambda表达式当成“匿名方法”(是吗?)
做一个简单的对比吧。
A 使用匿名类定义一个FilenameFilter类,列出后缀是.java的文件
File dir = new File("/src");
String[] filelist = dir.list(new FilenameFilter(){
public boolean accept(File f, String s)
  return s.endWith(".java");
}
} );
B 使用lambda表达式,上述代码可以简化为:
File dir = new File("/src");
String [] filelist = dir.list((f,s) -> {return s.endwith(".java");});
天呐,这真是太方便了!!!
C 因为可以把lambda表达式看成是没有名称的方法,所以可以这样使用:(Myobject myObj) -> myObj.toString()
java8提供了一种句法可以更方便
MyObject::toString 哈哈,真的是简洁
D 函数式编程有一个共识:把函数当成值,存入变量
对于java开发者刚开始接触的话建议使用这三个基本习语map() filter() reduce()
但是还是要记得java没有结构类型,没有“真正的”函数类型
二:明天计划
只是看书的话某些语法知识点还是理解的不透彻,还是找点做项目实战吧
三:遇到问题
希望可以见到更多使用内部类的代码,看看真正这种东西是用在那些地方的
四:总结思考
感觉这样翻看知识点效率有点低,没有针对性,还是 “做中学” 吧

java类型系统知识点总结的更多相关文章

  1. Java 面试知识点解析(四)——版本特性篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  2. 初学Java 精简知识点总结

    面对Java丰富的知识资料,很多初学者难免觉得迷惘,该学什么,怎么去学?下面给大家讲Java基础知识做了精简总结,来帮助你梳理学习思路,赶快看看吧! 方法/步骤1 对象的初始化(1) 非静态对象的初始 ...

  3. Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

    1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...

  4. Java核心知识点学习----使用Condition控制线程通信

    一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...

  5. Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

  6. Java基础知识点

    以下10点为JAVA 基础知识,后面将足以总结和完善以备面试 数据类型 (包装类,字符串,数组) 异常处理 Java IO和NIO 数据结构 (集合和容器 ) 多线程(并发) 网络通信(协议) 面向对 ...

  7. JAVA常用知识点及面试题总结

    1. String.StringBuffer.StringBuilder三者区别? (1)三者在执行速率上的比较: String<StringBuffer<StringBuilder 原因 ...

  8. Java 面试知识点解析(一)——基础知识篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  9. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

随机推荐

  1. ubuntu14.04安装 chrome

    安装谷歌浏览器,只需要三行代码: 打开终端,输入 cd /tmp 对于谷歌Chrome32位版本,使用如下链接: wget https://dl.google.com/linux/direct/goo ...

  2. flask的session解读及flask_login登录过程研究

    #!/usr/bin/env python # -*- coding: utf-8 -*- from itsdangerous import URLSafeTimedSerializer from f ...

  3. DELLR720 独立显卡DVI转VGA问题

    第一种情况:DELLR720默认不接独立显卡,直接用板载VGA输出,不需要调system blos 第二种情况:DELLR720接独立显卡,需要DVI输出,需要更改系统blos system blos ...

  4. 机器学习第4课:多变量线性回归(Linear Regression with Multiple Variables)

    4.1  多维特征 目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征, 例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,...,xn).

  5. 修改kafka broker.id

    kafka.common.InconsistentBrokerIdException: Configured broker.id 1 doesn't match stored broker.id 0 ...

  6. .Net普通三层->工厂模式->线程内唯一+单元工作模式->WebService分布式三层

    在软件世界分层的思想无处不在 主要是为了提高软件系统的维护性,扩展性,复用性和解耦等 软件的三层构架是一种最基本的分层思想的体现 结构图大体如下: 如此一来,开发人员可以只关注其中一层,而无需关心下一 ...

  7. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  8. 【转载】Loadrunner实现Android / IOS 手机APP压力测试

    随着手机APP用户量的增大,大的手机APP一般都需要进行压力测试,这几天用了loadrunner 12进行了手机APP的压力测试,整理了下,大家可以参考参考怎样给Andorid / IOS手机APP进 ...

  9. redis有序集合的一个应用

    一.需求 记录用户uid和上次操作时间;并清除5分钟以前的数据.用redis的一个key实现.本打算用hash,但hash类型在过期5分钟以前的数据时颇为麻烦. 二.代码实现 class LastLo ...

  10. zabbix web monitoring 监控网页

    配置 Web 场景 配置 web 场景: 转到: 配置 (Configuration)–>主机 (或者 模板 ) 点击主机 (host)/ 模板 (template) 行中的 Web 点击右上角 ...