【java学习】java知识点总结

1,概念

1)java三大器:监视器、过滤器、拦截器

2)JVM学习

3)函数式编程(functional programming)

是结构化编程的一种。将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。
java8引入了函数式编程概念。

java8新特性:java.util.stream

②与OOP对比

对象与对象之间的关系是面向对象编程首要考虑的问题,而在函数式编程中,所有的数据都是不可变的,不同的函数之间通过数据流来交换信息。

③优点

在函数式编程中,由于数据全部都是不可变的,所以没有并发编程的问题,是多线程安全的。
代码可读性更强。

④缺点

由于所有的数据都是不可变的,所以所有的变量在程序运行期间都是一直存在的,非常占用运行资源。
虽然现代的函数式编程语言使用了很多技巧比如惰性计算等来优化运行速度,但是始终无法与面向对象的程序相比,当然面向对象程序的速度也不够快。

4)面向对象编程(Object-oriented programming,缩写:OOP)

具有对象概念的程序编程范型,同时也是一种程序开发的方法。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。

①优点

系统更灵活、更容易扩展,而且成本较低。

②缺点

面向对象编程以数据为核心,所以在多线程并发编程中,多个线程同时操作数据的时候可能会导致数据修改的不确定性。
面向对象虽然开发效率高但是代码的运行效率比起面向过程要低很多。

面向对象三大特性:封装,继承,多态

5)构造方法和构造代码块

①构造块

直接在类中定义且没有加static关键字的代码块称为{}构造代码块。
构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。

②构造方法

主要作用:

完成对象的初始化工作,把定义对象时的参数传给对象的域。

特点:

i>与类同名
ii>没有返回类型
iii>构造方法可以重载,以参数的个数,类型,顺序。
iv>一个类可以定义多个构造方法
v>如果一个源文件中有多个类,每个类都可以有自己的构造器
vi>调用子类构造器之前,会先调用父类构造器,当子类构造器中没有使用”super(参数或无参数)”指定调用父类构造器时,是默认调用父类的无参构造器,如果父类中包含有参构造器,却没有无参构造器,则在子类构造器中一定要使用“super(参数)”指定调用父类的有参构造器,不然就会报错。

class Base{
    public Base(String s){
        System.out.print("B");
    }
}
public class Derived extends Base{
    public Derived (String s) {
         super("s");//没有这句会报错
        System.out.print("D");
    }
    public static void main(String[] args){
        new Derived("C");
    }
}

调用场景

a.调用构造方法
b.反射:java反射机制使用java.lang.Class或java.lang.reflect.Constructor的newInstance()方法

另外,调用序列化对象(Java.io.ObjectInputStream的readObject方法)、用对象的clone()方法创建一个对象,但不调用构造方法。

③继承中的构造函数及方法执行顺序

初始化过程:
1. 初始化父类中的静态成员变量和静态代码块 ;
2. 初始化子类中的静态成员变量和静态代码块 ;
3.初始化父类的普通成员变量和代码块,再执行父类的构造方法;
4.初始化子类的普通成员变量和代码块,再执行子类的构造方法;

class X{
    Y y=new Y();
    public X(){
        System.out.print("X");
    }
}
class Y{
    public Y(){
        System.out.print("Y");
    }
}
public class Z extends X{
    Y y=new Y();
    public Z(){
        System.out.print("Z");
    }
    public static void main(String[] args) {
        new Z();
    }
}

输出结果为:YXYZ

6)修饰符

7)数据类型

2,java常用包

1)java.awt

AWT(Abstract Window Toolkit,抽象窗口工具包)是JAVA的language核心语言包;如String、Math、Integer、System、Thread,提供常用的功能。特殊之处是不需要导入,是作为默认导入的包。

早期编写图形界面应用程序的包。

AWT和Swing的实现原理不同。
AWT实现原理:
图形函数与操作系统提供的图形函数一一对应。也就是说,当我们利用 AWT构件图形用户界面的时候,实际上是在利用操作系统的图形库。
不同的操作系统其图形库的功能可能不一样。为了实现Java语言所宣称的”一次编译,到处运行”的概念,AWT不得不通过牺牲功能来实现平台无关性。因此,AWT 的图形功能是各操作系统图形功能的“交集”。
因为AWT是依靠本地方法来实现功能的,所以AWT控件称为“重量级控件”。
–java.awt.color
支持颜色空间和外形
–java.awt.datatransfer
与系统的剪贴板交换数据 java.awt.dnd 支持拖拉操作
–java.awt.event
处理事件
–java.awt.font
描述多种字体类型
–java.awt.geom 允许你使用几何形状
–java.awt.im 允许编辑组件中日文,中文,韩文的的输入
–java.awt.im.spi 支持二选一的输入设备 (在java 2, v1.3中加入)
–java.awt.image 处理图像
–java.awt.image.renderable 支持独立显示图像
–java.awt.print 支持一般的打印功能

2)javax.swing

是为解决 AWT 存在的问题而新开发的图形界面包。Swing是对AWT的改良和扩展。

①Swing实现原理:

提供了AWT 的所有功能,还用纯粹的Java代码对AWT的功能进行了大幅度的扩充,在各平台通用。
例如:并不是所有的操作系统都提供了对树形控件的支持, Swing则利用了AWT中所提供的基本作图方法模拟了一个树形控件。
因为Swing不使用本地方法,故Swing控件称为“轻量级控件”。

②AWT和Swing之间的区别:

i>AWT 是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT的Java程序,其运行速度比较慢。
ii>AWT的控件在不同的平台可能表现不同,而Swing在所有平台表现一致。

3)java.util

java的utility工具包,如:定义系统特性、使用与日期日历相关的函数等。
–java.util.jar 生成和打开JAR文件
–java.util.zip 读写压缩或解压缩文件

4)java.applet

是创建APPLET的必须包。支持小应用程序的结构

5)java.net

有关网络操作的包。

6)java.io

java的输入输出流的包。

7)java.sql

是java的数据库操作包

8)java.beans

允许你建立软件组件

9)java.beans.beancontext

为bean 提供可执行环境

10)java.lang

提供核心功能
–java.lang.ref 使能与垃圾回收交互
–java.lang.reflect 运行时分析代码

11)java.math

处理大整数和十进制数

12)java.rmi

支持远程方法调用
–java.rmi.activation 激活永久对象
–java.rmi.dgc 管理分布垃圾回收
–java.rmi.registry 映射名称到远程对象引用
–java.rmi.server 支持远程方法调用

13)java.security

处理证书,密钥,摘要,签名和其他安全功能
–java.security.acl 管理访问控制列表
–java.security.cert 分析和管理证书
–java.security.interfaces 为DSA(数字签名算法)定义接口
–java.security.spec 设定密钥和算法参数

14)java.text

格式化,查询和处理文本

3,数据库使用

数据库的连接与使用

4,java并发

1)多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

多线程有3种实现方法,点击查看

同步的实现方法有两种,分别是synchronized,wait与notify 。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

2)java的守护线程和非守护线程。

java线程分为2种:

①守护线程Daemon

用来服务用户线程的,比如说GC线程、内存管理等线程、数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。

②用户线程User(非守护线程)

包括常规的用户线程或诸如用于处理GUI事件的事件调度线程,Java虚拟机(JVM)在它所有非守护线程已经离开后自动离开。

3)java锁

4)

6,

7,接口

1)概念

①抽象方法:

只声明,没用具体实现。用abstract关键字进行修饰。
修饰类型必须为public或者protected。缺省情况下为public。

②抽象类:

为继承而存在,其抽象方法由子类来实现(若子类不是抽象类,必须实现抽象方法;若子类为抽象类,可不实现)。
可以拥有成员变量和普通的成员方法,但不能用来创建对象。

③接口:

是对行为的抽象,参考第14-(4)。
如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

接口可以用abstract修饰。

一个类可以implements多个接口,是多继承的一种实现。

2)接口回调

①概念:

可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。

②实现:

最少也是需要三个类共同来完成这个回调机制。典型的例子是android按钮点击监听事件的接口回调。
a.创建一个接口A,规定执行的操作。
b.创建一个功能类B,比如这个类可以显示一个对话框、可以滑动菜单、可以下载数据等等。
c.在功能类B里面声明接口A的对象,创建要执行的方法,在这个方法里面为声明的接口对象赋值(传参获得值)。
d.在其他的类中使用这个功能类就可以了。

public interface OnClickListener {  
   //a.创建一个接口A
    void onClick(View v);  
}  
//b.创建一个功能类B
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {  
   //c.声明接口A的对象
    protected OnClickListener mOnClickListener;  

     //c.创建要执行的方法,并为接口对象赋值
    public void setOnClickListener(OnClickListener l) {  
        if (!isClickable()) {  
            setClickable(true);  
        }  
        mOnClickListener = l;  
    }  
}

③接口回调和向上转型的区别:

接口回调和上转型是设计模式的解耦核心。两者实质相同。区别在于:
如果a是类A的一个引用,那么,a可以指向类A的一个实例。或者说指向类A的一个子类,这是向上转型的情形。
如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。这是接口回调的情形。

8,框架

1)集合框架

2)JSON框架

3)Struts框架

①概念

JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。

Struts框架是MVC设计模式的一个优秀实现。

②工作流程

在web应用启动时就会加载初始化ActionServlet,ActionServlet从
struts-config.xml文件中读取配置信息,把它们存放到各种配置对象
当ActionServlet接收到一个客户请求时,将执行如下流程.
-(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;
-(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
-(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;
-(4)如果ActionForm的validate()方法返回或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功;
-(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的 Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;
-(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;
-(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;
为什么要用:

③基于Struts开发的应用由3类组件构成

控制器组件、模型组件、视图组件

4)

9,机制

1)垃圾回收机制(GC)

2)反射机制

①概念

指java程序在运行时可以访问、检测和修改其自身的状态或行为的一种能力。通过反射机制,可以在运行时加载一个只知道名称的类,获得它的完整构造、生成它的实例、对它的属性赋值、调用它的方法。

②实现

a.获取类:
通过已知名称的类的getClass()方法获取Class类对象。

//第一种方式:  
Classc1 = Class.forName("Employee");  
//第二种方式:  
//java中每个类型都有class 属性.  
Classc2 = Employee.class;  

//第三种方式:  
//java语言中任何一个java对象都有getClass 方法  
Employeee = new Employee();  
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee) 

b.创建对象:
获取类以后我们来创建它的对象,利用newInstance.

Class c =Class.forName("Employee");  

//创建此Class 对象所表示的类的一个新实例  
Objecto = c.newInstance(); //调用了Employee的无参数构造方法. 

c.获取属性:
分为所有的属性和指定的属性:

/**的所有属性*/
//获取整个类 
            Class c = Class.forName("java.lang.Integer");  
              //获取所有的属性?  
            Field[] fs = c.getDeclaredFields();  

                   //定义可变长的字符串,用来存储属性  
            StringBuffer sb = new StringBuffer();  
            //通过追加的方法,将每个属性拼接到此字符串中  
            //最外边的public定义  
            sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");  
            //里边的每一个属性  
            for(Field field:fs){  
                sb.append("\t");//空格  
                sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等  
                sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字  
                sb.append(field.getName()+";\n");//属性的名字+回车  
            }  

            sb.append("}");  

            System.out.println(sb);  
/**获取特定的属性*/
//获取类  
    Class c = Class.forName("User");  
    //获取id属性  
    Field idF = c.getDeclaredField("id");  
    //实例化这个类赋给o  
    Object o = c.newInstance();  
    //打破封装  
    idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。  
    //给o对象的id属性赋值"110"  
    idF.set(o, "110"); //set  
    //get  
    System.out.println(idF.get(o)); 

③方法

getDeclaredMethods() //获取所有的方法
getReturnType()  //获得方法的放回类型
getParameterTypes() //获得方法的传入参数类型
getDeclaredMethod("方法名",参数类型.class,……)  //获得特定的方法

getDeclaredConstructors()  //获取所有的构造方法
getDeclaredConstructor(参数类型.class,……)  //获取特定的构造方法

getSuperclass()  //获取某类的父类
getInterfaces()  //获取某类实现的接口

④优缺点

使代码更加灵活,但运用它会使软件的性能降低,复杂度增加,增加安全隐患。

10,4种引用:强引用、软引用、弱引用、虚引用。

1)强引用(StrongReference)

指程序代码中普遍存在的,类似 Object a = new Object() 这类的引用。
GC:只要引用还存在,垃圾收集器永远不会回收掉该引用对象所占内存

2)软引用(WeakReference)

用来描述一些还有用,但并非必需的对象。
GC:在内存不足时GC。

3)弱引用(SoftReference):

用来描述非必需对象。
GC:GC工作时,无论当前内存时候足够,都将其回收。

4)虚引用(PhantomReference):

它是最弱的一种引用关系。不会对对象生存时间构成影响,也无法通过虚引用来取得对象实例。
GC:被GC时收到一个系统通知。

11,零碎

1)不固定参数个数

public void addCondition(String condition, Object... params){}

12,语法

1)for

for(表达式1;表达式2;表达式3){
}
先执行表达式1–>然后执行表达式2,如果为false,结束循环,否则执行循环体–>执行表达式3

2)输入输出

①控制台输入

Scanner in=new Scanner(System.in);
int op=in.nextInt();

②文件读取写入

Stream流

3)不同类型的转换

不同类型的转换

4)异常

13,java历史

java语言从C++改进重新设计的。

1)J2SDK

J2SDK是java的开发环境包,包含JDK(开发工具包)和JRE(运行时环境包)。

2)java API

指应用程序接口。是一些预先定义的类库,目的是提供应用程序与开发人员基于某软件或硬件可以访问一组例程的能力。

3)Appletviewer

是一种执行HTML文件上java小程序的java浏览器。一个java类如果满足:1、继承applet;2、这个类没有main函数,那么这个类就靠Appletviewer.exe 解释执行。

14,序列化

15,Lambda函数

1)概念

java 8新特性,它支持Java也能进行简单的“函数式编程”。
lambda表达式是匿名方法,它提供了轻量级的语法。

2)实现

lambda表达式的语法由参数列表、箭头符号->和函数体组成。函数体既可以是一个表达式,也可以是一个语句块:

表达式:表达式会被执行然后返回执行结果。
语句块:语句块中的语句会被依次执行,就像方法中的语句一样:
return语句会把控制权交给匿名方法的调用者。
break和continue只能在循环中使用。
如果函数体有返回值,那么函数体内部的每一条路径都必须返回值。

(int x, int y) -> x + y  //接收x和y这两个整形参数并返回它们的和
() -> 42  //不接收参数,返回整数'42'
(String s) -> { System.out.println(s); }  //接收一个字符串并把它打印到控制台,不返回值

用在嵌套中,作为方法的参数。

FileFilter java = (File f) -> f.getName().endsWith("*.java");

String user = doPrivileged(() -> System.getProperty("user.name"));//作为参数

new Thread(() -> {
  connectToService();
  sendNotification();
}).start();

3)方法引用

方法引用的唯一用途是支持Lambda简写。方法引用有4类,前两类比较常用。

①引用静态方法

ContainingClass::staticMethodName 

例子:String::valueOf,对应的Lambda:(s) -> String.valueOf(s)
比较容易理解,和静态方法调用相比,只是把.换为::

②引用特定对象的实例方法

containingObject::instanceMethodName 

例子: x::toString,对应的Lambda:() -> this.toString()
与引用静态方法相比,都换为实例的而已

③引用特定类型的任意对象的实例方法

ContainingType::methodName 

例子: String::toString,对应的Lambda:(s) -> s.toString()
难以理解、也难以维护。建议还是不要用该种方法引用。
实例方法要通过对象来调用,方法引用对应Lambda,Lambda的第一个参数会成为调用实例方法的对象。

④引用构造函数


ClassName::new

例子: String::new,对应的Lambda: () -> new String()
构造函数本质上是静态方法,只是方法名字比较特殊。

16,配置文件

1)概念

配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量设置。

2)读取配置文件

Java读取Properties文件的六种方法

java.util.ResourceBundle

ResourceBundle类通常是用于针对不同的语言来使用的属性文件。
而如果你的应用程序中的属性文件只是一些配置,并不是针对多国语言的目的。那么使用Properties类就可以了。

ResourceBundle是实现国际化应用常用的手段。

java.util.properties

17,

猜你喜欢

转载自blog.csdn.net/sunshinetan/article/details/70806232