入门Java笔记打卡1~(对象和类的设置都为语法的誊写作草稿,无含义)
public class FirstClass{
public static void main(string[]args){
System.out.printlen("1");
System.out.printlen("2");
}
}
每一条语句都必须以分号 ; 结尾
Java中的方法,就是其他编程语言中的函数
程序的入口是main方法
没有main方法,Java程序是无法启动的
方法必须包含在class内部,先有class,再有方法
public class和文件名必须保持一致
关于左大括号的位置
//官方推荐写法
public static void main(Srting[] args){
}
//不推荐写法
public static void main(Srting[] args)
{
}
如果一个Java项目中有2个不同的class,它们都有自己的main方法,那岂不是有2个Java程序入口?
答:只能选择其中一个入口开始执行程序
Java的注释有3种书写格式:
单行注释: //
多行注释: /* */ 不可嵌套
文档注释(一种特殊的多行注释)
/**
* 计算2个整数的和
* @param a 第1个整数
* @param b 第2个整数
* @return 两个整数的和
*/
public static int add(int a,int b){
return a + b;
}
//在Eclipse中先写出方法来再 /** + 回车即可快速生成
Java的数据类型主要分为2大类
基本类型
java中的char是2个字节!
应用类型
引用类型的值是对对象的引用(相当于c语言中的指针)
E和e代表10
string在java属于引用类型
public class Main {
public static void main(String[] args) {
String str1 = "ABCD";
String str2 = ""; //空串
String str3 = null; //空值
//String属于引用,负责指向一块存值的区域
//str2指向的是一个区域,存的是空字符串
//str3是没有指向任何存值区域
}
}
◼ \b(退格, \u0008)
◼ \t(制表符, \u0009)
◼ \n(换行, \u000a)
◼ \f(换页, \u000c)
◼ \r(回车, \u000d)
◼ "(双引号, \u0022)
◼ '(单引号, \u0027)
◼ \(反斜杠, \u005c)
打印快捷键 syso + ALT+/
可以给数字增加下划线增强可读性
任何变量在使用之前都必须要先初始化(赋值)
局部变量:需要程序员手动初始化
非局部变量(实例变量、类变量):编译器会自动给未初始化的变量设置一个初始值
public class SecondClass {
/*成员变量/实例变量*/
private int age;
private static int age2;//类变量
//这些变量编译器会自动初始化
public static void main(String[] args) {
int age;
age = 20;
System.out.println(age);
}
}
◼ 上面一行的优先级比下面一行高
◼ 同一行的优先级一样
◼ 当多个优先级一样的运算符一起使用时
按照结合性进行运算
✓ 只有赋值运算符的结合性是从右至左
✓ 其他运算符的结合性都是从左至右
◼ 为了保证运算符按照预期执行,尽量多使用小括号
比如 5 * ((a + b) / c)
◼算数表达式的结果必须被使用
public class Firstclas {
public static void main(String[] args) {
boolean flag1 = true;
boolean flag2 = false;
int age = 10;
if(age>0) {
//if条件句内必须是boolean类型,类似于age>0的比较的返回值属于该类型
}
}
}
加号就可替代
public class Firstclas {
public static void main(String[] args) {
String name = "爱超";
int age = 19;
float height = 183.5f;
System.out.println("My name is "+ name
+ ", My age is " + age
+ ", Height is " + height
+ "cm");
}
}
◼ >> 与 >>>
>>(有符号右移):最左用符号位补齐
>>>(无符号右移):最左用 0 补齐
◼ &、 |、 ^ 也能用在 boolean 类型上
对比 &&、 ||, &、 | 少了短路功能
&&和||会直接根据前者的情况提前终止判断后者得出结果
而&和|还得同时两个都得查一遍,没有短路的功能
数据范围小的转为数据范围大的,可以自动转换
✓ byte 转 short、 int、 long、 float、 double
✓ short 转 int、 long、 float、 double
✓ char 转 int、 long、 float、 double
✓ int 转 long、 float、 double
✓ long 转 float、 double
✓ float 转 double
数据范围大的转为数据范围小的(22种),可能会丢失精度和范围,需要强制转换
✓ short 转 byte、 char
✓ char 转 byte、 short
✓ int 转 byte、 short、 char
✓ long 转 byte、 short、 char、 int
✓ float 转 byte、 short、 char、 int、 long
✓ double 转 byte、 short、 char、 int、 long、 float
boolean类型是不好类型转换的
◼ 一元数字提升: 将 byte、 short、 char 类型的一元数字自动提升为 int 类型(拓宽基本类型转换)
◼ 下面的情况会执行一元数字提升
public class Firstclas {
public static void main(String[] args) {
byte b1 = 10;
byte b2 = 20;
int sum = b1 + b2; // +是二元操作符,b1,b2不是一元数字
b++;
++b;//可以符合条件
System.out.println(sum);
}
}
数组的索引、创建数组时的数组长度
public class Firstclas {
public static void main(String[] args) {
int[]array = {11,22,33,44};
double index = 10;
array[(int)index] = 20;
//不用(int)转换会报错
//byte index = 10;
//array[index] = 20; 不会报错,因为byte在一元数字规则中作为数组索引提升为int
}
}
一元运算符 +、 ++
一元运算符 –、 - -
public class Firstclas {
public static void main(String[] args) {
int age = 10;
System.out.println(+age);
System.out.println(-age);
}
}
public class Firstclas {
public static void main(String[] args) {
char c = 'A';//存储的是它的ASCII值65
System.out.println(c);//c
System.out.println(+c);//65
//+c被运算后提升为整型
}
}
+c1 提升为int,因为int转char为窄化,需要强制类型转换
c3 = 65 ,65是字面量来定义一个全新的变量,不能认为它是整型
按位取反(~)
位移(<<、 >>、 >>>)
◼ 二元数字提升: 提升一个或者两个数字(拓宽基本类型转换)
如果任意一个数字是 double 类型,那么另一个就会被转换为 double 类型
否则,如果任意一个数字是 float 类型,那么另一个就会被转换为 float 类型
否则,如果任意一个数字是 long 类型,那么另一个就会被转换为 long 类型
否则,两个数字都被转换为 int 类型
◼ 下面的情况会执行二元数字提升
乘(*)、除(/)、取余(%)
加法(+)、减法(–)
比较(<、 <=、 >、 >=)
判等(==、 !=)
位运算(&、 ^、 |)
三目( ? : )
//v3报错的原因是v1+v2变为int,不可赋给byte
//v4,v5报错的原因同上
byte v1 = 1;
v1 = v1 + 2;
//error,1 + 2转为整型,不可赋给byte
v1 += 2;
//ok (复合赋值运算自带类型转换)
public class Firstclas {
public static void main(String[] args) {
byte v1 = 10;
short v2 = 20;
byte v3 = (byte)(v1 > 2 ? v1 : v2);
//可以理解成三目运算符最终返回一个int,再byte强制转换
}
}
java:
在java8中,goto,const未被使用,但也属于关键字
true false null是字面量不是关键字
◼ 标识符:变量名、方法名、类名等,命名规则如下
① 不限长度的 Java 字母、 Java 数字序列,但必须以 Java 字母开头(区分大小写)
② 不能使用关键字
③ 不能使用字面量 true、 false、 null
◼ Java 字母
Character.isJavaIdentifierStart() 方法返回 true 的字符
包括 ASCII 中的 A~Z、 a~z,美元符($),下划线(_),中文,韩文,日文等字符,+号不算是java字母
◼ Java 字母 或者 Java 数字
Character.isJavaIdentifierPart() 方法返回 true 的字符
Java 数字 包括 ASCII 中的 0~9
命名建议:
◼ 变量名、方法名:小驼峰,比如 myNameAndAge
◼ 类名:大驼峰,比如 MyNameAndAge
◼ 常量:比如 MY_NAME_AND_AGE
int arr1;
int[] arr2 = {};//空数组
int arr3[] = {};//空数组
//定义的时候指定数组元素
int[] arr4 = new int[] {1,2,3,4};
int[] arr5 = {1,2,3,4};
//定义的时候指定数组的长度
int[] arr6 = new int[4];
arr6[0] = 1;
arr6[1] = 2;
arr6[2] = 3;
arr6[3] = 4;
//多维数组
int [][][]arr7;
int[]arr8[][];
◼ 注意:在Java中,字符数组 != 字符串
✓ 字符数组: char[]
✓ 字符串: String
◼ 推荐使用 char[] arr 格式定义数组
◼ 不推荐使用 char arr[] 格式定义数组
public static void main(String[]args){
int[] array = new int[]{11,22,33};
System.out.println(array);
}
Java的数组元素属于引用类
数组元素存储在堆空间(Heap)
java存储的堆空间会自动申请初始化
public class Firstclass {
public static void main(String[] args) {
int[] arr = new int[4];//初始化4个0
String[] arr = new String[4];//自动初始化为4个NULL
}
}
int[]arr = {11,22,33,44};
for(int i = 0; i
public class Firstclass {
public static void main(String[] args) {
String[]arr = new String[4];
System.out.println(arr);//[Ljava.lang.String;@15db9742 前者进制,后者是哈希值(16进制)
System.out.println(new Object());//[Ljava.lang.String;@15db9742 前者进制,后者是哈希值(16进制)
System.out.println(arr.hashCode);//366712642
System.out.println(0x15db9742);//366712642
System.out.println(arr[0]);//初始值null
System.out.println(arr[1]);//初始值null
}
}
public class Main{
public static void main(String[]args){
int[] array = {array[n]};//随机访问,速度非常快,O(1)
//array[n] = 0x1110 + n * 类型占的字节数(int == 4)
}
}
Java中的方法,其实就是其他编程语言中的函数
方法的书写格式:
修饰符 返回值类型 方法名(参数列表){
方法体
}
2个数之和
public class method {
public static void main(String[] args) {
System.out.println(sum(10,20));
}
public static int sum(int n1,int n2){
return n1 + n2;
}
}
public class class1{
public static void main(String[]args){
System.out.println(sum new int[]{10,20,30,40,50});
}
public static int sum(int []numbers)//可以传入多个值
}
//更好的方式
public class class1{
public static void main(String[]args){
System.out.println(sum(10,20,30,40,50));
}
public static int sum(int... numbers)//可以传任意数目的值,取决于sum中传递的参的个数
return 0;
}
[说明是数组类型,I说明是int类型,@后面是哈希值
Object[] array = {};
//[Ljava.lang.Object;@15db9742
public class method {
public static void main(String[] args) {
System.out.println(sum(10,20,30));
}
public static int sum(int ...numbers){
System.out.println(numbers.length);
return 0;
}
}
//0
//3
public class method {
public static void main(String[] args) {
if(args == null) return;//判断,防止因为传null就会报错,程序异常,程序退出
int []array1 = null;
int []array2 = {};
System.out.println(array1.length);//该列会报错,array为null,java中不可以用空来访问东西的
System.out.println(args.length);
System.out.println(array2.length);
}
}
求和
public class method{
public static void main(String[]args){
System.out.println(sum(10,20,30));
}
public static int sum(int... numbers){
int result = 0;
for(int num : numbers){
result += num;
}
return result;
}
}
可变参数必须是方法中的最后一个参数
举例:JDK自带的 System.out.printf 方法
public class method{
public static void main(String[]args){
System.out.println(sum(10,20,30));
}
public static int sum(String name,int... numbers){
int result = 0;
for(int num : numbers){
result += num;
}
return result;
}
}
public class method{
public static void main(String[]args){
String name = "jack";
int age = 20;
System.out.println("My name is" + name + ",age is" + age);
System.out.println("My name is %s , age is %d",name,age);//另一种方法
}
return result;
}
}
%n 和 \n都是换行
public class method{
public static void main(String[] args){
/*
Java的类型有2种
1.基本类型:byte/char/short/int/long/float/double/boolean
2.引用类型:数组,对象
*/
int []n = {11,22,33};
test(n);
System.out.println(n[0]);
}
public static void test(int[]v){
v[0] = 44//将数组传到到test来通过下标0找地址来改变,可以改变n的值
v = 44; //值传递,不会改变n的值
}
}
public class method{
public static void main(String[] args){
/*
Java的类型有2种
1.基本类型:byte/char/short/int/long/float/double/boolean
2.引用类型:数组,对象
*/
int[] n = test();//引用的是数组的地址
for(int i = 0; i < n.length; i++){
System.out.println(n[i]);
}
}
public static void test(int[] v){
int[] v = {11,22,33};
return v;
}
}
◼ 基本类型作为参数是值传递
基本类型作为返回值,返回的是值
◼ 引用类型作为参数是引用传递(地址传递)
引用类型作为返回值,返回的是引用(地址)
方法签名由2个部分组成:方法名、参数类型
下面方法的方法签名是:
sum(int,long,double)
public static double sum(int i,long l,double d){
return i + l + d;
}
在同一个类中,不能定义2个方法签名一样的方法
◼ Java 的方法支持重载:方法名相同,方法签名不同
参数个数不同
参数类型不同
◼ 重载与返回值类型、参数名称无关
栈帧随着方法的调用而创建,随着方法结束而销毁,存储了方法的局部变量信息
public static void main(String[] args){
test1(10);
test2(20);
}
public static void test1(int v){}
public static void test2(int v){
test3(30);
}
public static void test3(int v){}
public static void main(String[] args){
sum(4);
}
public static int sum (int n){
if(n<=1) return n;
return n + sum(n-1);
}
//如果递归调用没有终止,将会一直消耗栈空间,导致栈内存溢出
//必须要有一个明确的结束递归的判断条件,也叫做边界条件,递归基
JavaSE的基础语法便记录于此,下一章节--面向对象