java基础学习总结(自用备忘录)

DOS命令窗口
  • dir 查看当前目录下有啥东西
path环境变量
  • path环境变量的作用就是给windows操作系统指路的,告诉windows操作系统去哪里找这个命令文件。

  • path环境变量中有很多很多的路径,路径和路径之间用半角分号分隔。 path=A;B;C;D…( path是环境变量的名字。 A;B;C;D…是环境变量path的值。)

  • 出现“命令找不到错误了”,这个时候能够想起来配置环境变量path。

  • path环境变量中的路径可以指定多个

Java语言的特性
  • . 简单性
    在Java语言当中真正操作内存的是:JVM(Java虚拟机),所有的java程序都是运行在Java虚拟机当中的。而Java虚拟机执行过程中再去操作内存。
    Java语言屏蔽了指针概念,程序员不能直接操作指针,或者说程序员
    不能直接操作内存。
    优点:不容易导致内存泄漏。
    缺点:效率问题,包括驾驭感比较差。

  • java是堪称完全面向对象的。

  • 健壮性
    自动垃圾回收机制(GC机制)。java不容易导致内存的泄漏。
    JVM(C++语言写的一个虚拟的计算机)负责调度GC机制。程序员不需要干涉。

  • java完全/完美支持多线程并发。

  • 可移植性/跨平台
    java语言只要编写一次,可以做到到处运行。(平台改变了,程序不需要改。)

    JVM这种机制实现了跨平台,那么这种机制优点和缺点分别是什么?
    优点:一次编写到处运行,可以跨平台。
    缺点:麻烦。对于运行java程序来说必须先有一个JVM。
    就像你要想在网页上看视频,你必须先安装一个flash是一样的。

JDK、JRE、JVM三者之间的关系?
  • JDK:Java开发工具箱

  • JRE:java运行环境

  • JVM:java虚拟机

    JDK包括JRE,JRE包括JVM。
    JVM是不能独立安装的。RE和JDK都是可以独立安装的。

对Java的加载与执行的理解(理论比较重要)
  • java程序从编写到最终运行经历了非常重要的两个阶段:
    1、编译阶段(java程序员直接编写的java代码(普通文本,java源代码xxx.java)是无法执行被JVM识别的。JVM能够识别“字节码”(xxx.class)。 java代码这种普通文本变成字节码的过程,被称为:编译。 JDK的bin目录下有: javac.exe 负责编译
    java.exe 负责运行 javac命令
    2.运行阶段(最终运行的是class文件。java命令

  • 编译阶段和运行阶段可以在不同的操作系统上完成吗?
    一次编写到处运行。1个java源文件是可以编译生成多个class文件的。

  • 字节码文件是二进制文件吗?
    字节码文件不是二进制文件。如果是二进制的话,就不需要JVM了。因为操作系统可以直接执行二进制。

  • java程序从开发到最终运行经历了什么?

  1. 编译期:(可以在windows上)
    第一步:在硬盘的某个位置(随意),新建一个xxx.java文件
    第二步:使用记事本或者其它文本编辑器例如EditPlus打开xxx.java文件
    第三步:在xxx.java文件中编写“符合java语法规则的”源代码。
    第四步:保存(一定要将xxx.java文件保存一下)
    第五步:使用编译器(javac【JDK安装后自带】)对xxx.java文件进行编译。
    第六步:如果xxx.java文件中编写的源代码是符合语法规则的,编译会通过,
    如果xxx.java文件中编写的源代码违背了语法规则,那么编译器会报错,编译器
    报错之后class文件是不会生成的,只有编译通过了才会生成class字节码文件。
    并且一个java源文件是可以生成多个class文件的。(编译实质上是检查语法)

  2. 运行期(JRE在起作用):(可以在windows上,也可以在其他的OS上。)
    第七步:如果是在Linux上运行,需要将windows上生成的class文件拷贝过去
    不需要拷贝源代码,真正运行的是字节码。(但是源代码也不要删除,有用)
    第八步:使用JDK自带的一个命令/工具:java(负责运行的命令/工具)执行字节码
    第九步:往下的步骤就全部交给JVM了,就不需要程序员干涉了。
    JVM会将字节码文件装载进去,然后JVM对字节码进行解释(解释器负责将字节码
    解释为1010101010…等的二进制)
    第十步:JVM会将生成的二进制码交给OS操作系统,操作系统会执行二进制码和
    硬件进行交互。

    	小插曲:xxx.java源文件经过编译之后生成了A.class、B.class、C.class等文件,
    那么我们称A是一个类、B是一个类、C是一个类。其中A、B、C是类的名字。
    
编译阶段 javac命令
 javac java源文件的路径
  • 编译报错的时候不会生成class字节码文件!

  • 把java源文件直接拖进到DOS命令窗口,那么DOS命令窗口就有这个路径了。

  • 怎么在DOS命令窗口中快速定位到某个路径呢?
    打开计算机–>打开一些文件夹–>在地址栏上直接输入cmd回车,这样直接就过去了。

  • javac <选项> <源文件>
    使用 --help 可列出可能的选项

运行阶段 java命令
 java 类名
  • 运行的前提是:class文件(字节码)生成了。没有字节码文件程序是无法运行的。如果文件名是Test.class,那么:Test就是一个类名。

  • 运行java程序需要哪些步骤呢?

     	第一步(必须这样做,这是必须的,先记住):
     		先使用cd命令切换到Test.class文件所在的路径。
    
     	第二步:执行java Test
    
“java HelloWorld”的执行过程以及原理。
D:\course\JavaProjects\02-JavaSE\chapter01>java HelloWorld
敲完回车,都发生了什么?????
	
	第一步:会先启动JVM(java虚拟机)

	第二步:JVM启动之后,JVM会去启动“类加载器classloader”
	类加载器的作用:加载类的。本质上类加载器负责去硬盘上找“类”对应的“字节码”文件。
	假设是“java HelloWorld”,那么类加载器会去硬盘上搜索:HelloWorld.class文件。

	第三步:
		类加载器如果在硬盘上找不到对应的字节码文件,会报错,报什么错?
			错误: 找不到或无法加载主类
		类加载器如果在硬盘上找到了对应的字节码文件,类加载器会将该字节码	文件装载到JVM当中,JVM启动“解释器”将字节码解释为“101010000...”这种	二进制码,操作系统执行二进制码和硬件交互。
	默认情况下类加载器(classloader)会从当前路径下找。	我们可以设置一个环境变量,叫做:classpath,给“类加载器”指路。

classpath环境变量不属于windows操作系统,classpath环境变量隶属于java。 classpath环境变量是java特有的。
classpath=A路径;B路径;C路径…
classpath是一个变量名
A路径;B路径;C路径…是变量值

我们把classpath配置一下,这个环境变量在windows中没有,需要新建!!!!
	计算机-->右键-->属性-->高级系统设置-->环境变量-->新建...

注意:变量名不能随意写:大小写无所谓,但必须叫做:classpath
	CLASSPATH
	ClassPath
	Classpath
	classpath
	都行。

我目前是随意配置的:(重启CMD)
	classpath=D:\course
	非常重要的一个特点,必须记住:
		配置了classpath=D:\course之后,类加载器只会去D:\course目录下找“xxx.class”文件
		不再从当前路径下找了。
  • classpath环境变量的作用是什么?
    是给类加载器指路的。
    在没有配置环境变量classpath的时候,默认从当前路径下加载。
    如果配置了环境变量classpath的话,就只能从指定的路径下加载了。
    path java_home classpath,这3个环境变量path需要配置,后面两个暂时不配置。
    在高版本的JDK当中,有一个新特性,可以直接一步到位: java x/y/z/xxx.java
    (ava后面直接加java源文件的路径。)
    这个特性是为了简化开发而提出,但实际上底层的实现原理还是和以前一样的,
    以上命令在执行过程中,还是会先进行编译,然后再运行。并且以上的运行方式,
    编译生成的class文件在硬盘上不存在,看不到。
解释说明
// 单行注释

/*
	多行注释
*/

/**
* javadoc注释:这里的注释信息可以自动被javadoc.exe命令解析提取并生成到帮助文档当中。
*/
标识符

1、标识符可以标识什么,什么是标识符,怎么理解这个概念!
2、标识符的命名规则、规范

关键字

java语言中的所有关键字都是全部小写。
注意:java语言中是严格区分大小写的。public和Public不一样。
Class和class不一样。static和Static也不一样。

		关键字:
		this
		public 
		static
		void 
		class
		byte
		short
		int
		long 
		float
		double
		boolean
		char
		true
		false
		if
		while
		for
		private
		protected
		........
变量
  1. 字面量==数据

    10 100 123 :整型
    1.34 3.14 2.0:浮点型
    true false :布尔型
    'a' '国':字符型
    "a" "abc"  "国" "中国":字符串型
    
  2. 变量
    变量就是一个存数据盒子。(盒子大小谁来决定啊?数据类型)
    在内存中的最基本的存储单元。存数据用的,而且这个数据是可变的,所以叫做变量。

java中的变量必须先声明,再赋值才能访问(必须手动赋值。)
int k; System.out.println(k); 这样是不行的。
int a, b, c = 100;(c变量赋值100,a,b变量只声明了没有赋值。)
int a = 10, b = 20, c = 100;

	声明和赋值可以分开,也可以一起做!!!
			int i; // 先声明
			i = 100;// 再赋值
			int k = 200; // 声明的同时赋值

在“同一个域”当中,变量名不能重名,没有final修饰时可以重新赋值!!!

		{
			int i = 100;
			//double i = 2.0; // 重名了编译器会报错,不允许。
			i = 300; // 可以重新赋值。
			int i = 3;//不能重复声明
		}

一个大括号代表一个域。
变量可以重新赋值,但在同一个域当中,不能重复声明。

			{A域
					{B域
						{C域
						}
					}
				}
			A域包括B域,B域包括C域。
  • 变量的作用域
    出了大括号就不认识了。别的先别管。
{
	int i = 100;
	{
		在这里可以访问i
	}
}
	{
		在这里是无法访问i变量。
	}
	成员变量:
  • 变量的分类

    在方法体当中声明的变量叫做局部变量。在方法体外以及类体内声明的变量叫做成员变量。

  • 成员变量

a、成员变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型);
b、在定义成员变量时可以对其初始化,如果不初始化,java会使用默认的值对其初始化(引用类型为null,布尔类型为false,其余基本类型的初始值都为0);

分类:(1)类属性(以static修饰):类属性从这个类的准备阶段开始存在,直到系统完全销毁这个类,类属性的作用域与这个类的生存周期相同;类属性可以理解为类成员变量,与类共存亡;只要类存在,程序就可以访问该类的类属性,在程序中可以通过如下格式:类.类属性。一个类属性的内存空间只有一个,多个该类的对象共享该类属性的内存;当其中一个实例对其修改时,就会改变,static修饰的存放在data segment;

(2)实例属性(不以static修饰):实例属性从这个类的实例被创建开始起存在,直到系统完全销毁这个实例,实例属性的作用域与该实例的生存周期相同;实例属性可以理解为实例的成员变量,它作为实例的一个成员,与实例共存亡;只要实例存在,程序就可以访问该实例属性,在程序中可以通过如下格式: 实例.实例属性。当创建实例的时候,在堆里面会对成员变量进行初始化;每个对象通过对应的类实例化后会有一个实例属性。

提示:一个类在使用之前要经过类加载、类验证、类准备、类解析、类初始化等几个阶段。

  • 局部变量

(1)局部变量可以使用java语言中的任何一种数据类型;
(2)除了形参外,局部变量都必须进行显式初始化,如果不初始化,编译不会通过;

分类:(1)形参(方法签名中定义的变量):作用域在在整个方法内;当类或对象调用某个方法时,系统会在该方法栈区为所有形参分配内存空间,并将实参的值赋给对应形参,这样就完成了形参的初始化;

(2) 方法局部变量(在方法内定义):作用域从定义该局部变量的地方开始生效,到该方法结束时消失;

(3)代码块局部变量(在代码块内定义):作用域从定义该变量的地方开始生效,到该代码块结束时失效;

方法重载overload
  1. 什么情况下我们考虑使用方法重载机制?
    当功能相似的时候,建议将方法名定义为一致的,
    这样代码美观,又方便编程。

    注意:如果功能不相似,坚决要让方法名不一致。
    
  2. 代码满足什么条件的时候构成了方法重载?
    条件1:在同一个类当中
    条件2:方法名相同
    条件3:形式参数列表不同(类型、个数、顺序)

    注意:
    	方法重载和返回值类型无关,和修饰符列表无关。
    
方法递归
  1. 需要理解什么是方法递归?
    方法自身调用自身。

  2. 使用递归的时候,必须添加结束条件,没有结束条件,会发生栈内存溢出错误。
    StackOverflowError
    原因:一直压栈,没有弹栈,栈内存不够用。

  3. 会画出递归方法的内存结构图。
    递归的过程当中可以将图画出来。

  4. 能够使用循环代替递归的尽量使用循环,循环的执行耗费内存少一些,
    递归耗费内存相对多一些,另外递归使用不当很容易内存溢出,JVM停止工作。
    当然,只有极少数情况下,只能用递归,其它代码解决不了问题。

  5. 当递归有结束条件,并且结束条件合法的时候,就一定不会内存溢出吗?
    也不一定。可能递归的太深了。

  6. 分享了一些递归方面的经验
    在实际的开发中遇到递归导致的栈内存溢出错误是怎么办?
    第一步:先检查结束条件是否正确。
    第二步:如果正确,可以调整JVM的栈内存大小。(java -X)

面向对象包括三大特征
  • 封装
    第一步:属性私有化(使用private关键字进行修饰。)
    第二步:对外提供简单的操作入口。set和get方法都是实例方法,实例方法的调用必须先new对象。不能带static。
  • 继承
  • 多态

有了封装,才有继承,有了继承,才能说多态。

静态代码块
  • 类加载时执行
实例语句块
  • 在构造方法执行之前,自动执行“实例语句块”中的代码。实际上这也是SUN公司为java程序员准备一个特殊的时机,叫做对象构建时机。
类体
类体{
			实例变量;
			实例方法;

			静态变量;
			静态方法;

			构造方法;

			静态代码块;
			实例语句块;

			方法(){
				// 局部变量
				int i = 100;
			}
		}
this
  • this是一个关键字,是一个变量,是一个引用,保存内存地址指向自身。

  • this存储在堆内存当中对象的内部。

  • this可以使用在实例方法中,也可以使用在构造方法中。

  • this出现在实例方法中其实代表的是当前对象。

  • this不能使用在静态方法中。

  • this. 大部分情况下可以省略,但是用来区分局部变量和实例变量的时候不能省略。

  • this() 这种语法只能出现在构造方法第一行,表示当前构造方法调用本类其他的
    构造方法,目的是代码复用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值