Java复习笔记——零碎知识点

不系统化记录整理
只记下自己不熟悉的小知识点

OOP 类与对象

内聚性好,松耦合
侧重于功能(面向对象侧重于流程)
是对象的抽象,对象是类的实例

  • 继承Heritage 代码重用可拓展
  • 多态 Polymorphism 统一接口
  • 封装 Encapsulation 模块化隐藏细节

引用类型

对象、数组都是引用数据类型。
引用类型变量在声明后必须通过实例化开辟数据空间,才能对变量所指 向的对象进行访问

City wf = new City(“Winterfell");
Int[] fibonacci = {1, 1, 2, 3, 5, 8}

for循环遍历

int[] numbers = {1, 2, 3, 4, 5};
for(int x : numbers){
  System.out.print(“value of x : “ + x + “\n");
}

创建对象

声明 对象名称、类型
实例化 用new
初始化 构造方法——一个类可以有多种

封装 Encapsulation

实现模块化 用getter setter
减少复杂度 减少代码的耦合

private: 只能被该类的对象访问。
default: 即不加任何访问修饰符,只允许在同一个包中进行访问。
protected: 只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
public: 不仅可以跨类访问,而且允许跨包(package)访问。



一个源文件中只能有一个public类;
源文件的名称应该和public类的类名保持一致;
如果一个类定义在某个包中,那么package语句应该在源文件的首行;

package animals; 
import java.io.*; 

继承 Heritage

泛化/特殊化
代码的重用,使系统变得容易扩展
子类继承了父类中所有非private成员方法(除了构造方法)和所有非private的成员变量。
强耦合关系,在一定程度上破坏了封装, 父类变化了,子类也随之变化;

子类初始化

当我们需要调用父类的构造方法时,只需使用super()即可
创建子类对象实例时,Java默认地 首先调用父类的无参数的构造方法, 生成父类的对象。接下来完成调用子 类的构造方法,生成子类的对象。
使用了super,那么在执行的时候就寻 找该构造方法,而不再寻找父类的无 参数构造方法。
super必须作为构造方法的第一条执 行语句

  • 覆盖 override
    同名又同参,又同返回值(一模一样)
    子类与父类中出现
  • 重载 overload ……返回类型可以相同也可以不同
    同名不同参
    可在同一个类中出现
final

final 关键字声明类可以把类定义为不能继承的,即最终类;
或者用于修饰方法,该方法不能被子类重写

上转型对象

上转型对象可以操作被子类继承和重写的方法,
但不能操作子类新增的成员变量和方法。
问一问自己是否需要从子类向父类进行向上转型。如果必须向上转型,则继承是必要的,但 是如果不需要,则应当好好考虑自己是否需要继承。

抽象类

具体类:可以被实例化的类
抽象类:不能被实例化的类
定义抽象类的基本目的是提供合适的超类, 使其他类可以继承它,以实现共享。

抽象方法只包含一个方法名,而没有方法体
public abstract class Form{   
  private int posX;   
  private int posY;      
  public void getInfo(){     
    System.out.println(“This is a 2D form.”);   
  }
  …   
  public abstract void draw(); 
}
  1. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  2. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子 类也是抽象类。

静态变量、方法 static

静态变量在程序初始化时被创建,可被该类所有的实例使用和修改;

public static 数据类型 变量名; 
 
public static 返回值数据类型 方法名[形式参数列表]{ 
 
} 

main()也是一个静态方法;

接口 interface

接口提供了一组功能的命名集合
接口定义了不同类交互的标准

[public] interface 接口名 [extends 其他的接口名列表] 
{
    [public static final] 数据类型 常量名 = 值;
    [public abstract] 返回类型 方法名(形参列表); 
}

变量—— 只能是public static final(用 private 修饰 会报编译错误) (类属性、不可被改变)
接口中的方法会被隐式的指定为 public abstract ——不能有静态方法
一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
一个类只能继承一个抽象类,而一个类却可以实现多个接口。
接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法。不必使用abstract关键字,自动认为是抽象。抽象类可以有给出的方法
接口不能包含成员变量,除了 static 和 final 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承。

[访问修饰符] class 类名 [extends 超类名] implements 接口名列表 {
        类体 
}

类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
instanceof

public interface Comparable<T> {
    public int compareTo(T o);
 }

public class Person implements Comparable<Person> {
  int age;  
  public int compareTo(Person p) {
      return this.age-p.getAge();
   }
 }
可以通过Collections.sort或Arrays.sort进行自动排序 

多态 Polymorphism

多态就是指一种名称定义不同的方法
向上转型!编译时检验父,实际运行时才有可能调用子,然后才发现问题出错。

数组&实例

Cat[] cats = new Cat[10];  
for(int i=0; i<cats.length; i++){   System.out.println(cats[i].getName()); }  
会报出NullPointerException !!

要每一个都实例 cats[i] = new Cat(“Kitty”, 100);

类的关系与UML图

类的关系

1+3+1
继承 Inheritance

  • 依赖Dependency
    方法中使用到、局部变量、对静态方法调用
  • 关联 Association
    ⼀个类作为另⼀个类的成员变量出现
  • 聚合 Aggregation
    是整体与部分之间是可分离的
    他们可以具有各⾃的⽣命周期
  • 组合 Composition
    整体与部分之间是不可分离的
    同⽣共死

多⽤组合、少⽤继承

UML

  • 静态模型
    • 用例图(Use Case Diagram):从用户角度描述系统功能。
    • 类图(Class Diagram):描述对象模型中类与类之间的关系。
    • 组件图(Component Diagram):描述系统中各个组件之间的依赖关系,还可以描述组件的源代码组织结构。
    • 部署图(Deployment Diagram):定义系统中软硬件的物理体系结构。
  • 动态模型
    • 时序图(Sequence Diagram):显示对象之间的动态协作关系,强调对象之间消息 发送的时间顺序。
    • 活动图(Activity Diagram):显示活动的顺序控制流。
    • 状态转换图(State Transition Diagram):描述对象所有可能的状态,以及导致状 态转换的条件
类图(Class Diagram)

上层:类名
中层:属性
下层:行为(方法)

继承(泛化)实线白箭头
关联 实线(小箭头)
聚合 实线白菱形
组合 实线黑菱形
依赖 虚线(小箭头)
实现(接口) 虚线白箭头

用例图(Use Case Diagram)
  1. 系统内部的功能
  2. 系统外部的参与者
  3. 以及它们之间的交互关系

用例的一般描述分为以下几个方面:
 简要说明
 主事件流和其他事件流
 前提条件
 事后条件

时序图 (Sequence Diagram )

水平维度:显示对象之间发送消息的时间顺序;
垂直维度:显示发送消息的时间顺序;

  • 对象生命线(垂直的虚线);
  • 对象激活框(细长矩形);
  • 消息(带箭头的水平线 + 消息名);
    • 调用:实线段,实心箭头
    • 返回:虚线段,枝状箭头
  • 顶部方框表示类的对象或类,有3种写法
    • 对象名和类名间用冒号隔开,如 c:Car
    • 省略对象名称,:Car
    • 只保留对象名,c


模型分析

标准库

基础类lang
工具类util

包名需全部小写

package myPath.myPackage;

com.example.mypackage


包名的声明必须出现在第一行;
子包需要显式引用 ; 父包不包含子包

引用:
import java.util.Date; 
java.util.Date……

特定类

java.lang.Object 类

所有类的祖先
仅有一个默认构造方法

public Object(){} // 方法体为空 

主要成员方法:

  • equals(Object obj) : 判断是否为同一对象
  • toString() : 返回对象的字符串表示,“类名@对象的十六进制哈希码”

包装类

基本类型->包装类
boolean->Boolean
int->Interger
float->Float
……

  1. 所有的包装类都是final类型,不能创建子类
  2. 包装类是不可变类,不可强制转换
Boolean bln = new Boolean(true); 
Double d = new Double(“123.45D”);
Integer i = Integer.valueOf(“123”); 
Double d = Double.parseDouble(“123”);

Math

Math是final类
有两个静态常量:E(自然对数)、PI(圆周率)
Math类不能被实例化

Scanner

Scanner reader = new Scanner(System.in);
reader.nextInt();

Random

java.util.Random

Random random = new Random(); 
random.nextInt(100)+1;
random.nextInt();
Math.random ()

日期类

java.util.Date

Date date = new Date() ;
date.getTime();
返回1970年1月1日零点距今毫秒数

java.util.Calendar

Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.YEAR, 2017); 

java.text.DateFormat

SimpleDateFormat dFormat = new SimpleDateFormat(“EEEE/MMMM/dd/yyyy”);
System.out.println(dFormat.format(date)); 

java.time
……略

Date d1 = dateFormat.parse(“2017-03-11”); 
Date d2 = dateFormat.parse(“2017-04-21”); 
long p = d2.getTime() - d1.getTime(); 

BigXXX类

如果整数的值比Long.MAX_VALUE还大,则需使用BigInteger

IO

大坑

字符串String

String str1 = new String("ABC"); 
String str2 = new String("ABC"); 
System.out.println(str1 == str2); // #false 地址不同
 
String str3 = "ABC"; 
String str4 = "ABC"; 
String str5 =  "AB" + "C";
System.out.println( str3 == str4 ); // #true
System.out.println(str3 == str5 ); // #true 
     
String a  = "ABC"; 
String b = "AB"; 
String c = b + "C";
System.out.println( a == c ); // #false 

int indexOf(int ch) ……
int lastIndexOf(int ch) ……
.charAt();
.substring(11,15);
String[] split(String regex, int limit);
String concat(String str) //拼接
String trim()
String toLowerCase()
String toUpperCase()
String replace(char oldChar, char newChar)
……

类型转换

String->Numbers

String strInteger = new String(“10”);
 int num1 = Integer.parseInt(strInteger);  
String strFloat = new String(“3.14”); 
float num2 = Float.parseFloat(strFloat);

Numbers->String

int num1 = 10; 
float num2 = 3.14f;  
String str1 = String.valueOf(num1);
String str2 = String.valueOf(num2);

StringBuilder ???

图形编程


略……见另一篇

布局器:

Flow layout
Box layout
Border layout
Grid layout

监听
public class Beeper implements ActionListener {
     ...
     // where initialization occurs:
     button.addActionListener(this);
    
      public void actionPerformed(ActionEvent e) {
         //Make a beep sound...
     }
 } 

MouseListener
2D graphics

paint() public void paint(Graphics g) { }
repaint()

异常处理

Exception是程序运行时发生的异常事件,会中断程序的正常流程,比如IO时找不到文 件,访问数组越界等等。
异常处理分离了一般代码和异常处理代码,更易阅读和维护。
① 检查性异常(checked exceptions):程序正确,由于外在环境条件不足引发。Java编译器强制要求处理这类异常。
② 运行时异常(RuntimeException):程序存在bug,需修改程序。
③ 运行时错误(Error):极少见情况,非程序本身问题。

try-catch-finally

try { 
  code with exception 
} catch (ExceptionType name){
 … 
} finally {
 … 
}

标明异常 throws

用 throws 关键字指出可能出现的异常类型,自己不进行处理,由该函数的调用者处理。
如果一个方法没有捕获一个检查性异常,那么该方法必须使用 throws 关键字来声明。

public void writeList() throws IOException { }

throw

集合框架

Collection
集合用于存储、提取、操作和传递集成化的数据

接口:代表着集合的抽象数据类型。多级的接口构成了集合框架的标准调用接口。
实现(类):是集合接口的具体实现,可重复使用的数据结构。
算法:用来执行一些有用的计算,这些算法的设计体现了多态。

接口

set

用于存放无重复的元素,类似数学意义上的集合
不保证存放顺序
Set<String> set = new HashSet<String>()
Set中保存的是对象的引用

List

List是一个有序的Collection
List为一个长度可变的数组,即动态数组 ArrayList、LinkedList

Queue

队列 first-in-first-out

Deque

双向队列

Map

按照无重复的键对象去检索值对象
Map.Entry对象代表Map中的一对键与值

Map<String,String> map = new HashMap<String,String>();
map.put(“1”,”Mon.”); 
map.put(“1”,”Monday”); 
map.put(“one”,”Monday”); 
Set<Map.Entry<String,String>> set = map.entrySet(); 
for(Map.Entry entry : set)
  System.out.println(entry.getKey()+”:”+entry.getValue());
枚举类型

public enum Gender{FEMALE, MALE}

迭代器 Iterator 接口或ListIterator接口
import java.util.*;
 
public class Test{
 public static void main(String[] args) {
     List<String> list=new ArrayList<String>();
     list.add("Hello");
     list.add("World");
     list.add("HAHAHAHA");
     //第一种遍历方法使用foreach遍历List
     for (String str : list) {            //也可以改写for(int i=0;i<list.size();i++)这种形式
        System.out.println(str);
     }
 
     //第二种遍历,把链表变为数组相关的内容进行遍历
     String[] strArray=new String[list.size()];
     list.toArray(strArray);
     for(int i=0;i<strArray.length;i++) //这里也可以改写为  foreach(String str:strArray)这种形式
     {
        System.out.println(strArray[i]);
     }
     
    //第三种遍历 使用迭代器进行相关遍历
     
     Iterator<String> ite=list.iterator();
     while(ite.hasNext())//判断下一个元素之后有值
     {
         System.out.println(ite.next());
     }
 }
}

Java 泛型

泛型方法

所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前

public class GenericMethodTest
{
   // 泛型方法 printArray                         
   public static < E > void printArray( E[] inputArray )
   {
      // 输出数组元素            
         for ( E element : inputArray ){        
            System.out.printf( "%s ", element );
         }
         System.out.println();
    }
 
    public static void main( String args[] )
    {
        // 创建不同类型数组: Integer, Double 和 Character
        Integer[] intArray = { 1, 2, 3, 4, 5 };
        Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
        Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
 
        System.out.println( "整型数组元素为:" );
        printArray( intArray  ); // 传递一个整型数组
 
        System.out.println( "\n双精度型数组元素为:" );
        printArray( doubleArray ); // 传递一个双精度型数组
 
        System.out.println( "\n字符型数组元素为:" );
        printArray( charArray ); // 传递一个字符型数组
    } 
}

<T extends Number>

  1. 继承
  2. 限制泛型类型

<? extends T>表示该通配符所代表的类型是T类型的子类。
<? super T>表示该通配符所代表的类型是T类型的父类。

public class MaximumTest
{
   // 比较三个值并返回最大值
   public static <T extends Comparable<T>> T maximum(T x, T y, T z)
   {                     
      T max = x; // 假设x是初始最大值
      if ( y.compareTo( max ) > 0 ){
         max = y; //y 更大
      }
      if ( z.compareTo( max ) > 0 ){
         max = z; // 现在 z 更大           
      }
      return max; // 返回最大对象
   }
   public static void main( String args[] )
   {
      System.out.printf( "%d, %d 和 %d 中最大的数为 %d\n\n",
                   3, 4, 5, maximum( 3, 4, 5 ) );
 
      System.out.printf( "%.1f, %.1f 和 %.1f 中最大的数为 %.1f\n\n",
                   6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );
 
      System.out.printf( "%s, %s 和 %s 中最大的数为 %s\n","pear",
         "apple", "orange", maximum( "pear", "apple", "orange" ) );
   }
}

泛型类

public class Box<T> {
   
  private T t;
 
  public void add(T t) {
    this.t = t;
  }
 
  public T get() {
    return t;
  }
 
  public static void main(String[] args) {
    Box<Integer> integerBox = new Box<Integer>();
    Box<String> stringBox = new Box<String>();
 
    integerBox.add(new Integer(10));
    stringBox.add(new String("菜鸟教程"));
 
    System.out.printf("整型值为 :%d\n\n", integerBox.get());
    System.out.printf("字符串为 :%s\n", stringBox.get());
  }
}

类型通配符

类型通配符一般是使用?代替具体的类型参数。例如 List<?> 在逻辑上是List<String>,List<Integer> 等所有List<具体类型实参>的父类。

<E extends Comparable<E>> 可比较大小

代码规范

import少用通配符:import java.util.*;
一个源文件包含:

  1. 许可证或版权信息
  2. package语句
  3. import语句
  4. 类定义
    以上每个部分之间用一个空行隔开。
    类名 / 接口名 变量名 UpperCamelCase
    方法名 lowerCamelCase
    常量名 CONSTANT_CASE 全部字母大写,用下划线分隔单词

@author 标明开发该类模块的作者
@version 标明该类模块的版本
@see 参考转向,也就是相关主题
@param 对方法中某参数的说明
@return 对方法返回值的说明
@exception 对方法可能抛出的异常进行说明

线程

进程 - 进行中的程序 拥有独立的内存空间
线程 - “轻量级”的进程 线程存在于进程之中
每个进程至少拥有一个线程,称为main thread, 主线程
生命周期:新建 就绪 运行 死亡 堵塞

implements Runnable 
(new Thread(new HelloRunnable())).start();

extends Thread 
(new HelloThread()).start();

数据库

sql结构化查询语言

SQL语句语法,略

JDBC

执行SQL 语句的Java AP

  1. 连接数据源,比如数据库
  2. 向数据库发送所要执行的增删改查语句
  3. 从数据库接收语句执行的结果
    DriverManager 链接数据库
    Connection createStatement
    executeQuery for SQL select
    executeUpdate for SQL INSERT UPDATE DELETE
    ResultSet 结果集
ODBC

微软(MS)提出的一套数据库连接标准
主要用于访问微软的数据

数据访问类 Data Access(DA)Class

好自为之,略……

设计模式

SOLID 原则

模型-视图-控制器 Model-View-Controller (MVC)

三层程序设计模型 Three-tier design model

表示层 (用户界面)

GUI class
显示数据,接收操作

业务逻辑层 (问题域层)

PD class
从用户界面接收请求,根据业务逻辑处理请求,从DA类获得数据/向DA类发 送数据,将处理结果送回表示层

数据访问层

DA class
建立与数据库的连接,完成增删改查,关闭连接。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容