Java基础

本文深入讲解Java中的递归、程序执行流程、数据类型、异常处理、多线程等核心概念,帮助读者理解Java编程的基本原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、递归概念
简单的递归

Public class Test{
	Public static void Main(String [] args)
	{
		System.out.println(method(5));
	}
	
	Public int method(int n)
	{
		If(n==1)
			Return 1;
		Else
			Return n*method(n-1);
	}
}

2、结束程序
  直接return 或者 return -1 自己提示

3、标识符
  Java对各种变量、方法和类等要素明时使用额字符序列成为标识符。凡是自己可以起名字的地方豆角标识符,都遵守标识符的规则。

4、程序执行过程
(1)Load到内存区
(2)找到main方法开始执行

5、Java基本数据类型
  4类8种

  1. 逻辑型——boolean
  2. 文本型——char
  3. 整数型——byte,short,int,long
  4. 浮点数型——float,double

6、引用数据类型

  • 类——class
  • 接口——interface
  • 数组

7、基础类型转换

  • 布尔类型不可以转换为其它的数据类型
  • 容量小的类型自动转换为容量大的数据类型
  • 容量大的数据库类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出;使用时要格外注意.
  • 有多重类型的数据混合运算时,系统首相自动的将所有数据转换成容量最大的哪一种数据类型,然后在进行计算。

8、break和continue
(1)break遇见用于终止某个语句块的执行。用在循环语句体重,可以强行退出循环;
(2)continue语句用在循环语句体重,用于终止某次循环过程,跳过循环体中continue语句下面未执行的循环,开始下一次循环过程。

9、打包命令
  在要打包的最上级目录 ——控制台:jar -cvf name.jar .
这里写图片描述

10、类的继承与权限控制

  • 继承:extends
  • 一个子类只能有一个基类,一个基类可以派生出多个子类。
    这里写图片描述

11、构造方法
(1)子类的构造的过程中必须调用其基类的构造方法。
(2)子类可以在自己的构造方法中使用super(argument_listt)调用基类的构造方法。
使用this(argument_list)调用蓓蕾的另外的构造方法
如果调用super,必须写在子类构造方法的第一行
(3)如果子类的构造方法中没有显示地调用基类构造方法,则系统默认调用基类无参数的构造方法。
(4)如果子类构造方法中既没有显示调用基类构造方法,而基类中有没有无参的构造方法,则编译出错。

12、equals

  • Instanceof 比较符 :判断一个类是否是一个类型
  • If(obj instanceof cat) 如果obj对象是一个cat类,则返回真。
  • 一般该方法会被重写,具体的还要看重写的方式写的是什么。

13、对象转型(casting)
(1)一个基类的引用类型变量可以“指向”其子类的对象。
(2)一个基类的引用不可以访问其子类对象新增加的成员(属性和方法)。
(3)可以使用 引用 变量 instanceof类名 来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。
(4)子类的对象可以当做基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting)。

14、动态绑定或多态
  动态绑定是指“在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。”
存在的3个条件:

  1. 要有继承
  2. 要有重写
  3. 父类引用指向子类对象

15、抽象类
(1)用abstract关键字来修饰一个类时,这个类叫做抽象类;用abstract来修饰一个方式时,该方法叫做抽象方法。
(2)含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。
(3)抽象类不能实例化
(4)抽象方法只需声明,而不需实现。

16、Final关键字
(1)final的变量的值不能够被改变
(2)final 的方法不能够被重写
(3)final的类不能够被继承

17、接口
  • 多个无关的类可以实现同一接口
  • 一个类可以实现多个无关的接口
  • 与继承关系类似,接口与实现类之间存在多态性
  接口(interface)是抽象方法和常量值的定义的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和 方法的定义,而没有变量和方法的实现。

特性:
	a. 接口考科一多重实现
	b. 接口中声明的属性默认为public static final的;也只能是public static final的
	c. 接口中只能定义抽象方法,而且这些方法默认为public的,也只能是public的
	d. 接口可以继承其它的接口,并添加新的属性和抽象方法

使用implements来实现,实现多个接口,使用“,”隔开

18、异常处理
  打印异常的堆栈信息:e.printStackTrace()

  异常类的分类:
这里写图片描述

  1. Error:称为错误,有Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。
  2. Exception:所有异常类的父类,期子类对应了各种各样可能出现的异常事件,一般需要用户显式的声明或捕获。
  3. Runtime Exception:一类特殊的异常,如被0除、数组下表超范围等,其产生比较频繁,处理麻烦,如果显示的声明或捕获将会对程序可读性和运行效率影响很大。因此有系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。
  4. finally语句:
      finally语句为异常处理提供一个统一的出口,是的在控制流程转到程序的其它部分以前,能够对程序的状态作统一的管理。无论try所指定的程序块中是否抛出例外,finally所指定的代码都要被执行。通常在finall语句中可以进行资源的清除工作。如:关闭打开的文件、删除临时文件

  使用自定义异常
    a. 通过集成java.lang.Exception类(或者RuntimeException)声明自己的异常类
    b. 在方法适当的位置生成自定义异常的实例,并用throw语句抛出。
    c. 在方法的声明部分用throws语句声明该方法可能抛出的异常。

19、数组的使用(引用类型)
  数组声明:

Type var[];  或  type []  var;

  Java语句中声明数组时不能指定其长度,使用关键字new创建数组对象。
    数组名=new 数组元素的类型 [ 数组元素的个数 ]
  数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化。

  数据的拷贝:使用java.lang.System类的静态方法

Public statci void arraycopy ( object src, int srcPos, object dest, int destPos, int length )

  可以用与数组src从第srcPos项元素开始的length个元素拷贝到目标数组从destPost项开始的length个位置。如果原数据书面超过目标数组便捷会抛出“IndexOutOfBoundsException”异常。

20、StringBuffer类
  代表可变的字符序列

21、容器

容器API

  1. Collection接口—定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式。
  2. Set中的数据对象没有顺序且不可以重复。
  3. List中的数据对象有顺序且可以重复。
  4. Map接口定义了存储“键(key)—值(value)映射对”的方法。

  容器类对象在调用remove、contains等方法是需要比较对象是否相等,这回涉及到对象类型的equals方法和hashCode方法;对于自定义的类型,需要重写equals和hashCode方法以实现自定义的对象相等规则。
  重写equals方法必须重写hashCode方法。当对象被作为“索引”的时候,会使用到hashCode方法。

Iterator接口:
a. 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。
b. Iterator对象称作迭代器,用以方便的实现对容器内元素的便利操作。
c. Iterator接口定义了如下方法:
	i. Boolean hasNext();   //判断游标右边是否有元素
	ii. Object next();            //返回游标右边的元素并将游标移到到下一个位置
	iii. Void remove();          //删除游标左面的元素,在执行完next之后该操作只能执行一次

这里写图片描述

22、泛型
  起因: JDK1.4以前类型不明确

  1. 装入集合的类型都被当做Object对待,从而失去自己的实际类型。
  2. 从集合中取出时往往需要转型,效率低,容易产生错误。

  解决办法:
    在定义集合的时候同时定义集合中对象的类型
    (1)可以在定义Collection的时候指定
    (2)也可以在循环时用Iterator指定
  好处:
    增强程序的可读性和稳定性

23、IO输入输出流
  在Java程序中,对于数据的输入/输出操作以“流”(stream)方式进行;J2SDK提供了各种各样的“流”类,用以获取不同种类的数据;程序中通过标准的方法输入或输出数据。
这里写图片描述

ObjectIO
  序列化

Interface Serializable  可以序列化的接口    (标记接口)
transient 关键字,透明的,作用:使该成员不以考虑 

24、多线程
  进程是一个静态的概念,是指放在内存中未被执行的程序。

  1. 开始一个并行线程的方法
    (1)实现Runnable接口,使用Thread对象创建一个线程
    (2)继承Thread对象
      能使用接口,就不用继承。

  2. 开启一个并行的新线程,需要实现Runnable接口,或继承Thread

Thread t1=new Thread(具体对象);
T1.start();

//调用一个线程,但不是同时运行
T1.run();

 3. 线程同步问题
  解决方案:使资源独占。

synchronized关键字 :锁定当前对象

这里写图片描述
 4. 死锁问题
  加大锁的粒度来解决。

wait方法   来自object类
This.wait();
	
This.notify();   唤醒等待在某一个对象上的线程    
this.notifyAll();  唤醒所有等待的线程。

  Wait 和sleep 区别:
  ①、wait时别的线程可以访问锁定对象,不能自动唤醒,需要别的线程来唤醒。(调用wait方法的时候必须锁定该对象)
  ②、Sleep时别的线程也不可以访问锁定对象,结束后会自动唤醒。

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值