【JAVA】基础概念

1.java重载和重写以及隐藏

重载(overload):是一个类中多态性的一种表现,只要方法名 一致 ,但要求每个方法具有不同的参数的类型或参数的个数,方法的返回类型、修饰符可以相同,也可不同。这里需要注意的是,函数重载不能基于返回值类型
重写(overriding):
1.“两小” :子类方法的返回值类型、抛出的异常 均应小于等于父类方法的
2.“两同”:子类方法的方法名、参数列表均应该与父类方法相同
3.“一大”:子类方法的访问权限应该大于等于父类方法的访问权限
隐藏:
隐藏是针对父类中的成员变量和静态方法而言 。当子类声明了与父类相同的变量名的变量时就实现了对父类成员变量的隐藏。当子类声明了与父类的静态成员方法中相同方法名,相同参数列表和相同返回类型的方法,则实现了对父类静态方法的隐藏

2.构造方法

  • ⑴必须与类名相同。
  • ⑵构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
  • ⑶构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
  • ⑷一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。
  • ⑸构造方法可以重载,以参数的个数,类型,顺序。
  • ⑹ 构造方法不能被static、final、synchronized、abstract、native修饰,但可以被public、private、protected修饰;
  • ⑺如果不写构造函数的就是使用一个默认的空的构造函数
  • ⑻不能被继承,只能被显式或隐式的调用。
  • ⑼父类如果没有无参的构造函数,子类就需要在自己的构造函数中显式调用父类的构造函数,否则会编译报错
    添加super(“XX”);
  • ⑽构造方法每次都是构造出新的对象,不存在多个线程同时读写同一对象中的属性的问题,所以不需要同步

3.访问修饰符

public可以被当前类,子类,包,其他包,访问,
protected 可以被当前类,子类,包访问
default可以被可以被当前类,包内访问;
private只能被当前类访问
这里要注意一点:private的属性和方法子类是可以继承的,但是不能调用!

4.接口,抽象类以及它们的区别

⑴抽象类
  • ①抽象类不能被实例化。
  • ②抽象方法必须由子类来进行重写,子类没有实现它的抽象方法那么子类也是抽象类。
  • ③只要包含一个抽象方法就是抽象类。
  • ④抽象类中可以包含具体的方法,当然也可以不包含抽象方法。
  • ⑤子类中的抽象方法不能与父类的抽象方法同名。
  • ⑥abstract不能与final并列修饰同一个类。
  • ⑦abstract 不能与private、static、final或native并列修饰同一个方法。
⑵接口
  • ①一个类可以 实现 多个接口
  • ②接口中的常量和方法必须是public的访问权限,可以写出来或者不写,不写就是默认
  • ③在接口中只有方法的声明,没有方法体。
  • ④接口中所有的方法必须都是抽象的,接口中也可以定义数据成员,但必须是常量
  • ⑤接口中没有构造方法,也不能实例化接口的对象。
  • ⑥接口可以实现多继承
  • ⑦接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法,.则实现类定义为抽象类。
  • ⑧接口中不能包含静态方法
⑶联系
  • ①接口和抽象类都不能被实例化。
  • ②接口和抽象类都可以包含抽象方法。
⑷区别
  • ①一个子类只能继承一个抽象类,但能实现多个接口
  • ②抽象类可以有构造方法,接口没有构造方法
  • ③抽象类可以有普通成员变量,接口没有普通成员变量
  • ④抽象类和接口都可有静态成员变量,抽象类中静态成员变量访问类型任意,接口只能public static final(默认)
  • ⑤抽象类可以没有抽象方法,抽象类可以有普通方法,接口中在JAVA8之前都是抽象方法,但是接口在JAVA8之后有了默认方法
  • ⑥抽象类可以有静态方法,接口不能有静态方法
  • ⑦抽象类中的方法可以是public、protected;接口方法只有public,JDK9接口可以定义私有方法,但不能是抽象的。

5.关键字和保留字

⑴Java 关键字列表 (依字母排序 共50组):

abstract, assert, boolean, break, byte, case, catch, char, class, const(保留关键字), continue, default, do, double, else, enum, extends, final, finally, float, for, goto(保留关键字), if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while

⑵保留字列表 (依字母排序 共14组),Java保留字是指现有Java版本尚未使用,但以后版本可能会作为关键字使用:

byValue, cast, false, future, generic, inner, operator, outer, rest, true, var, goto (保留关键字) , const (保留关键字) , null

6.析构函数

与 构造函数 相反,当对象结束其 生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)

7.JAVA标识符

Java语言中,对于变量,常量,函数,语句块也有名字,我们统统称之为Java标识符。
标识符可以包括这4种字符:字母、下划线、$、数字;开头不能是数字;不能是关键字
简单的可以记为:数字划钱
注意:不能有空格!

8.JAVA中lang sql util包

  • java.lang 提供利用 Java 编程语言进行程序设计的基础类
  • java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。
  • java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。

9.super和this关键字

this表示当前对象,也就是当前类对象,super表示当前类的父类。
举例:你定义一个新的类:A,这个A继承了类B,也就是说B是A的父类。那么如果A中 有个方法:aa();B中也有个方法: aa();
那么在A 中用this.aa()调用的就是A中定义的方法,而super.aa()调用的就是A的父类B中定义的方法aa();

注意:

  • ①this和super需要放在构造方法的第一行
  • ②都是对象,所以均不可以在static环境中使用
  • ③不能同时出现在同一个构造函数里
    Super中的参数表示的就是调用父类相同形参的构造方法

10.JDK中的包和他们的基本功能

JDK常用的包主要有以下几种

  • ①java.lang:语言包 自动引入的
  • ②java.util:实用包 实用包提供了各种实用功能的类,主要包括日期类、数据结构类和随机数类等
  • ③java.awt:抽象窗口工具包 要用于编写GUI程序,包括按钮、标签等常用组件以及相应的事件类
  • ④javax.swing:轻量级的窗口工具包,这是目前使用最广泛的GUI程序设计包
  • ⑤java.io:输入输出包 java.io提供了系统输入输出类和接口,只要包括输入流类InputStream和输出流OutputStream就可以实现文件的输入输出、管道的数据传输以及网络数据传输的功能
  • ⑥java.NET:网络函数包 java.Net提供了实现网络应用程序的类,主要包括用于实现Socket通信的Socket类,此外还提供了便于处理URL的类
  • ⑦java.applet:编制applet用到的包(目前编制applet程序时,更多的是使用swing中的JApplet类)。 java.applet是专为创建Applet程序提供的包,它包含了基本的applet类和通信类,目前基本上被JApplet类所代替。

11.object类的基本方法

  • ⑴clone方法
    保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
  • ⑵getClass方法
    final方法,获得运行时类型。
  • ⑶toString方法
    返回该对象的字符串表示
  • ⑷finalize方法
    该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
  • ⑸equals方法
    该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
  • ⑹hashCode方法
    该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
    一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
  • ⑺wait方法
    wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
    调用该方法后当前线程进入睡眠状态,直到以下事件发生。
    ①其他线程调用了该对象的notify方法。
    ②其他线程调用了该对象的notifyAll方法。
    ③其他线程调用了interrupt中断该线程。
    ④时间间隔到了。
    此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
  • ⑻notify方法
    该方法唤醒在该对象上等待的某个线程。
  • ⑼notifyAll方法
    该方法唤醒在该对象上等待的所有线程。

12.final关键字

final修饰类、方法、属性!不能修饰抽象类,因为抽象类一般都是需要被继承的,final修饰后就不能继承了。
final修饰的方法不能被重写(覆盖)而不是重载!
final修饰属性,此属性就是一个常量,不能被再次赋值!

13.J2EE常用名词

web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使 JSP,SERVLET直接更容器中的环境变量接**互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

14.加载驱动的三种方式

  • ⑴.Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);
  • ⑵. DriverManager.registerDriver(new com.mysql.jdbc.Driver());
  • ⑶.System.setProperty(“jdbc.drivers”, “com.mysql.jdbc.Driver”);

15.java编译后缀

java中源文件的后缀为.java,
经过javac.exe编译后生成字节码文件,后缀为.class,
再经过java.exe编译为可执行文件,后缀为.exe。
Java程序经编译后会产生byte code

16.静态方法(类方法),静态变量,静态代码块

⑴静态方法中不能引用非静态方法和非静态属性—理由很简单,因为静态方法直接可以不经过实例化就可以使用。但是非静态方法必须借助一个实例才能使用。静态方法中没有this指针
静态方法可以重载
static的方法在装载class得时候首先完成,比 构造方法早,此时非static得和方法还没有完成初始化,所以不能调用。
方法是static静态方法,直接使用"类.方法"即可,因为静态方法使用不依赖对象是否被创建。
⑵静态代码块优先于主方法,且只执行一次
⑶只有类才存在静态的变量 ,非静态成员函数中可以调用静态成员,方法只能对静态变量的操作 不能在方法内试图定义静态变量
⑷执行顺序:

其中涉及:静态初始化代码块、构造代码块、构造方法
当涉及到继承时,按照如下顺序执行:
1、执行父类的静态代码块 
static {
        System.out.println("static A");
    }
输出:static A
2、执行子类的静态代码块
static {
        System.out.println("static B");
    }
输出:static B
3、执行父类的构造代码块
{
        System.out.println("I’m A class");
    }
输出:I'm A class
4、执行父类的构造函数
public HelloA() {
    }
输出:无
5、执行子类的构造代码块
{
        System.out.println("I’m B class");
    }
输出:I'm B class
6、执行子类的构造函数
public HelloB() {
    }
输出:无

17.java表达式转型规则

Java表达式转型规则由低到高转换:
byte→short(char)→int→long→float→double

  • ⑴所有的byte,short,char型的值将被提升为int型;
  • ⑵如果有一个操作数是long型,计算结果是long型;
  • ⑶如果有一个操作数是float型,计算结果是float型;
  • ⑷如果有一个操作数是double型,计算结果是double型;
  • ⑸被final修饰的变量不会自动改变类型,当2个final修饰相操作时,结果会根据左边变量的类型而转化。

记住:

  • ⑴所占位数少的可以转换为所占位数多的类型,比如byte转char,char转int等;
  • ⑵而所占位数多的转为所占位数少的默认情况下不能实现转换,需要强制类型转换,这样可能会丢失一部分原始数据;
  • ⑶此外,boolean类型数据和其他七种不能互相转换。
    看一种会产生信息丢失的情况:
    int a=(int)8846.0 double转int会信息丢失
    例题:
    下列代码片段中,存在编辑错误的语句是(134)
byte b1=1,b2=2,b3,b6,b8;
final byte b4=4,b5=6,b7;
b3=(b1+b2);  //b3=(b1+b2);自动转为int,所以正确写法为b3=(byte)(b1+b2);或者将b3定义为int;
b6=b4+b5;    //b6=b4+b5;b4、b5为final类型,不会自动提升,所以和的类型视左边变量类型而定,即b6可以是任意数值类型
b8=(b1+b4);  //b8=(b1+b4);虽然b4不会自动提升,但b1仍会自动提升,所以结果需要强转,b8=(byte)(b1+b4);
b7=(b2+b5);  //b7=(b2+b5); 同上。同时注意b7是final修饰,即只可赋值一次,便不可再改变

18.基本数据类型和引用数据类型

基本类型(属于原生类)只能保存一些常量数据,引用类型除了可以保存数据,还能提供操作这些数据的功能;
为了操作基本类型的数据,java也对它们进行了封装, 得到八个类,就是java中的基本类型的封装类;他们分别是:
八种基本类型: byte short int long float double char boolean
对应的包装类 : Byte Short Integer Long Float Double Character Boolean
引用类型包括类、接口和数组类型以及特殊的null类型。
引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值

19.JDK JRE JVM的区别

JDK:JAVA语言开发工具包,在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre。
JRE:包含JVM标准实现和JAVA核心类库,JRE是JAVA运行环境而不是开发环境,不包含任何开发工具(如编译器和调试器)
JVM:JAVA虚拟机,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
在这里插入图片描述
JDK是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。JRE是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是整个java实现跨平台的最核心的部分,能够运行以Java语言写的程序。
当我们安装完JDK后会出现两个JRE,这是为什么呢?
一个jre是放在jdk文件夹下面的,这个是开发使用的jre.
一个是供系统其他java应用使用的jre使用的。如果我们不进行开发只运行JAVA程序的话,就不需要安装JDK

20.java变量初始值问题

成员变量有初始值,局部变量没有初始值,final修饰的变量一定要有初始值

21.java集合概览

在这里插入图片描述

21.过滤器 监听器 拦截器

  • 过滤器(Filter)
    属于Servlet,当你有一堆东西的时候,你只希望选择符合你要求的某一些东西,可以用过滤器。
  • 监听器
    当一个事件发生的时候,你希望获得这个事件发生的详细信息,而并不想干预这个事件本身的进程,这就要用到监听器。
  • 拦截器
    在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。

过滤器,监听器,拦截器的区别

  • 1.过滤器
    Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,依赖于servlet容器。
  • 2.监听器
    现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。
  • 3.拦截器
    拦截器是面向切面编程(AOP)的一种实现,是属于spring的。

22.深克隆和浅克隆

  • 通常只是对克隆的实例进行复制,但里面的其他子对象,都是共用的
  • 克隆的时候会复制它的子对象的引用,里面所有的变量和子对象都是又额外拷贝了一份

23.JAVA四种引用

  • 强引用
    强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。
  • 软引用
    内存不足回收。可以用来做缓存。
  • 弱引用
    无论内存是否充足,都会回收被弱引用关联的对象,弱引用能用来在回调函数中防止内存泄露。因为回调函数往往是匿名内部类,隐式保存有对外部类的引用,所以如果回调函数是在另一个线程里面被回调,而这时如果需要回收外部类,那么就会内存泄露,因为匿名内部类保存有对外部类的强引用。
  • 虚引用
    它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

24.JAVA序列化

JAVA序列化:把JAVA对象转化为字节序列
JAVA反序列化 :把字节序列转化为JAVA对象
序列化的作用:
⑴实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上
⑵利用序列化实现远程通信,即在网络上传送对象的字节序列
序列化注意事项:

  • transient 修饰的变量在反序列化后对应的值没了
  • static 序列化是不能序列化static变量的,static属于类,保存的是类的状态。
  • 要加上序列化ID

25.拆装箱

自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化,反之就是自动拆箱。

  • 同类型的进行比较,如Integer 与int,Long与long进行==比较时,会自动拆箱;不同类型之间进行比较,如果有一方为非包装类,则会自动拆箱。如果两方不同类型且都为包装类,则不会拆箱,且不能比较,编译会报错
  • 两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关
  • 两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
  • 基本型封装类型调用equals(),但是后面参数是基本类型,则后面参数会先装箱
 public static void main(String[] args) {
	 int a=257;                
	 Integer b=257;
	 System.out.println(a==b);          //同类型基本类型和封装类型比,转化为基本类型  true
	 System.out.println(b.equals(a));     // true
	 System.out.println(b.equals(257.0));  // false
}

26.数据类型及类型转化

⑴基本数据类型及对应的包装类
  • byte(Byte):8位,最大存储数据量是255,存放的数据范围是-128~127之间。
  • short(Short):16位,最大数据存储量是65536,数据范围是-32768~32767之间。
  • int(Integer):32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
  • long(Long):64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
  • float(Float):32位,浮点数,直接赋值时必须在数字后加上f或F。
  • double(Double):默认的浮点数,64位,赋值时可以加d或D也可以不加。
  • boolean(Boolean):只有true和false两个取值。
  • char(Character):16位,存储Unicode码,用单引号赋值,里面只能有一个字母。还有一种情况,char a=98,这个赋值时一个ASCII码,输出也是对应的值。
⑵自动类型转换,强制类型转换以及类型提升
  • 自动类型转换 目标类型大于原类型,int类型可以直接赋值给Double类型
  • 强制类型转换 目标类型小于原类型,数值并非四舍五入,而是直接将多余的小数位截断。
  • 类型提升 当一个java算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升
    • 所有byte型、short型和char型将被提升到int型。
    • 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型

例子1:

//定义一个short类型变量
short sValue = 5;
//表达式中的sValue将自动提升到int类型,则右边的表达式类型为int
//将一个int类型赋给short类型的变量将发生错误。
sValue = sValue - 2;

例子2:

byte b1=1,b2=2,b3,b6; 
final byte b4=4,b5=6; 
b6=b4+b5; 
b3=(b1+b2); 
System.out.println(b3+b6);

语句:b3=b1+b2编译出错
被final修饰的变量是常量,这里的b6=b4+b5可以看成是b6=10;在编译时就已经变为b6=10了
而b1和b2是byte类型,java中进行计算时候将他们提升为int类型,再进行计算,b1+b2计算后已经是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会通过,需要进行强制转换。

猜你喜欢

转载自blog.csdn.net/cheidou123/article/details/95041367
今日推荐