Package:
包就是文件夹,用来管理各种不同功能的java类,方便后期代码维护
包名规则: 公司域名反写+包的作用,需要全部英文小写,见名知意 比如 com.itheima.domain
(全类名 = 包名+类名)
导包——使用其他类时,需要使用全类名 com.itheima.domain.Student ——使用Student类
比如: com.itheima.domain.Student s = new com.itheima.domain.Student();
改进后:import com.itheima.domain.Student;
使用其他类的规则:
(1)使用同一个包中的类时,不需要导包
(2)使用java.lang包中的类时,不需要导包
(3)其他情况都需要导包
如果同时使用两个包中的同名类,需要用全类名com.itheima.domain.Student s = new com.itheima.domain.Student();
常量
常量: 实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性 相当于C语言的#define宏定义
常量命名规范:
(1)单个单词——全部大写
(2)多个单词——全部大写,单词之间用下划线隔开
细节:
(1)若final修饰的变量是-基本数据类型-,那么变量存储的数据值不能发生改变
(2)若final修饰的变量是-引用数据类型-,那么变量存储的地址值不能发生改变,对象内部的可以改变
final——最终的,不可被改变的 可以修饰方法、类、变量
修饰方法:表明该方法是最终方法,不能被重写 public final void show(){}
修饰类: 表明该类是最终类,不能被继承 public final class hello{}
修饰变量:此时的变量叫做常量,只能被赋值一次 final int a = 10; 此时a为常量只能赋值一次,无法被修改,
public static final double PI = 3.1415926535; //此时PI为常量,无法被更改值.
实际开发中,一般只用private和public
成员变量私有: private
方法公开: public
特例:如果方法中的代码是抽取其他方法中共性代码,这个方法一般也私有
代码块:
1.局部代码块——提前结束变量的生命周期(已淘汰)
2.构造代码块——写在成员位置的代码块(不够灵活,快淘汰)
作用:可以把多个构造方法中重复的代码抽取出来
执行时机:我们在创建本类对象的时候会先执行构造代码块再执行构造方法
3.静态代码块——static
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发,只执行一次
使用场景:在类加载的时候,做一些数据初始化的时候使用
//public表示公开的
//class表示定义一个类
//helloworld表示类名
public class HelloWorld { //表示定义一个公开的类,名称为helloworld,由于是公开的类,所以源文件名必须与类名相同
//类体部分 不允许直接编写java语句(除声明变量和定义方法)
//static表示静态的
//void表示空,方法执行结束无返回值
//main表示方法名是main
//(String[] args)是一个main方法的形式参数列表
//String[]是一种引用数据类型 args是一个局部变量的变量名
//主方法是固定编写,只有args是随意的
public static void main(String[] args) { //定义一个公开的静态的主方法(程序入口)
//args是一个变量名
/**
* javadoc注释; 注释里面的内容会被javadoc.exe工具解析并提取生成帮助文档。
*
*/
/*
* public class 和 class 的区别:
* 一个java源文件中可以定义多个class文件
* 一个java源文件当中不一定有public class不是必须的
* 一个class会定义生成一个XXX.class字节码文件
* 一个java源文件当中定义公开的类的话,public class只能有一个,并且该类名称必须和java源文件名称一致
* 每一个class当中都可以编写main方法,都可以设定程序的入口,想执行B.class中的main方法:即java B
* 注意:当在命令窗口执行java hello,那么要求hello.class当中必须有主方法,没有主方法运行错误
*
*
* 标识符——凡是有权利自己命名的单词都是标识符
* 标识符可以标识的元素有:类名,方法名,变量名,接口名,常量名
*
* 标识符命名规则——合法的标识符只能由数字、字母、下划线、美元符号$组成,不能有其他特殊符号
* 不能数字开头
* 严格区分大小写
* 关键字不能做标识符
* 理论上无长度限制
* 标识符命名规范: 类名、接口名——首字母大写,后面每个单词首字母大写
* 变量名、方法名——首字母小写,后面每个单词首字母大写
* 常量名——全部大写
*
* 字面值:10/100/true/false/abc/A 都属于字面值
* ——整数型字面值
* ——浮点型字面值
* ——布尔型字面值
* ——字符串型字面值
* ——字符型字面值
* java语言中所有字符串型字面值必须使用双引号括起来(半角)
* java语言中所有字符型字面值必须使用单引号括起来(半角)
* */
System.out.print("abc\n");//字符串型字面值
System.out.print(100);//整数型字面值
System.out.print(false);//布尔型字面值
System.out.print(3.14);//浮点型字面值
System.out.print('A');//字符型字面值
System.out.print("\n");
/*
* 变量的声明和定义: ——(变量的概念使内存空间得到重复的使用)
* 数据类型 变量名 = 字面值;
* int age = 23;
*
* 访问一个变量包括两种访问形式; 1.读取变量中保存的具体数据 get/获取
* 2.修改变量中保存的具体数据 get/设置
* 变量在一行上可以声明多个:
* int a,b,c = 100; //a,b未初始化,c赋值为100 报错
*
*/
int a,b,c = 300;
a=100;
b=200;
System.out.print(a);
System.out.print(b);
System.out.print(c+"\n"); // 此处+号是连接的意思
接收用户键盘输入:
1.创建键盘扫描器对象:
java.util.Scanner s = new java.util.Scanner(System.in);
2.调用Scanner对象的next()方法开始接受用户键盘输入,程序执行到此会停下来等待用户输入,
用户输入时并敲下回车键时,键入的信息会自动赋值给userInputContent变量
String userInputContent = s.next(); //以字符串形式接受
int num = s.nextInt(); //以整型int形式接受数字
3.将内存中数据输出到控制台:
System.out.println("您输入了:"+userInputContent);
方法的定义
语法结构:
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
};
关于修饰符列表:
1.是可选项,不是必须的
2.目前统一写成:public static
3.方法的修饰符列表当中有static关键字的话,怎么调用此方法:
调用:
类名.方法名(实际参数列表);
关于返回值类型:
1.方法结束之后大多数是需要返回最终执行的结果,执行结果可能是一个具体存在的数据,而这个具体存在的数据就是返回值
2.返回值类型:返回值是一个具体存在的数据,数据都是有类型的,此处需要指定返回值的具体类型
3.返回值类型可以是java中任意一种类型,包括基本数据类型和所有的引用数据类型。
4.也可能方法执行结束之后不返回任何数据,返回值类型位置必须编写viod关键字,void表示无返回值;
5.返回值
(1)返回值若不是void,表示这个方法结束之后必须返回一个具体的数值。
(2)若返回值不是void,方法体中必须添加"return 值"语句
(3)返回值类型为void,方法体不能编写"return 值"语句,但可以编写"return;"语句
(4)只要带有return关键字的语句执行,return语句所在的方法结束
关于方法名:
1.合法标识符
2.最好见名知意
3.最好是动词
4.首字母要求小写,后面每个单词首字母大写
关于形式参数列表(形参):
1.形参是局部变量:
int a; double b; float c; string s;
2.形参的个数可以是0-N个;
3.多个形参之间用逗号","隔开;
4.形参中起决定性作用的是形参的数据类型,形参的名字只是一个标识符
关于实际参数(实参):1.方法调用的时候,实际给这个方法传递的真实数据称为实际参数(实参)
2.实参列表和形参列表必须满足:数量相同,类型对应相同
关于方法执行过程中,内存是如何变化的:
1.方法只定义,不调用,是不会执行的,并且JVM中也不会给该方法分配“运行所属”的内存空间的,只有调用时,才会动态分配所属的内存空间
2.在JVM内存划分上内存有这样三块主要的内存空间:
-方法区内存
-堆内存
-栈内存
3.-方法代码片段属于.class字节码文件的一部分,字节码文件在类加载的时候,将其放到了方法区当中,
所以JVM中的三块主要的内存空间中方法区内存最先有数据,存放了代码片段
代码片段虽然在方法区内存当中只有一份,但是可以被重复调用,每一次调用这个方法的时候,需要给该
方法分配独立的活动场所,在栈内存中分配。{栈内存中分配方法运行的所属内存空间}
4.方法在调用的时候,会给该方法分配内存空间,在栈中分配,此时发生压栈动作,方法执行结束之后,给该方法分配的内存空间全部释放,此时发生弹栈动作。
压栈:给方法分配内存
弹栈:释放该方法的内存空间
5.局部变量在”方法体“中声明,局部变量运行阶段内存在栈中分配
方法重载overload
关于方法重载overload:参数的类型不同,对应调用的方法不同,此时区分方法不在依靠方法名,依靠参数的数据类型
1.功能相似的时候,尽可能让方法名相同
功能不同的时候,尽可能让方法名不同
2.满足方法重载条件:
在同一个类当中:
方法名相同;
参数列表不同;
参数数量不同;
参数顺序不同;
参数类型不同;
3.方法重载和什么有关系,和什么没关系
方法重载和方法名+参数列表有关系;
方法重载和返回值类型无关;
方法重载和修饰符列表无关;
//以下三个方法构成了方法重载机制
public static int summ(int aa,int bb) {
System.out.println("int");
return aa+bb;
}
public static long summ(long aa,long bb) {
System.out.println("long");
return aa+bb;
}
public static double summ(double aa,double bb) {
System.out.println("double");
return aa+bb;
}
方法递归:
1.递归必须有结束条件,没有结束条件一定会发生栈内存溢出错误
2.递归即使有结束条件,即使结束条件是正确的,也可能会发生栈内存溢出错误,因为递归的太深。
public static int sumn(int n) { //递归算法求1-N的和
if(n == 1) {
return 1;
}
return n+sumn(n-1);
}
//n + sumn(n-1)
//4 + sumn(3)
//4 + 3 + sumn(2)
//4 + 3 + 2 + sumn(1)
//4 + 3 + 2 + 1