Java基础笔记

这些都是java中的基础,难度不高,就是多练.

变量

  • 计算机采用变量来存储信息,变量类似一个盒子,盒子里面可以存储信息. 盒子有标签和内容, 变量也一样.
  • 定义变量的格式:
    • 数据类型 变量名 = 值;
      int num;
      int[] nums;
      String name;
      HashMap<String,String> map;
      Itheima it;

变量名标签

  • 变量名是一个单词或者是一组单词,用来描述一个数据的含义,方便人理解,变量名不能有空格.
  • 关键字
    • 概述: Java中具有特殊含义的单词,关键字都是小写的.
  • 标识符:
    • 概述: 就是用来给变量,类,接口,方法起名字用的.
    • 命名规则:
      • a. 不能和Java中的关键字重名.
      • b. 只能由数字,字母,_或者$组成,不能以数字开头.
      • c. 严格区分大小写.
      • d. 最好做到见名知意.
    • 命名规范:
      • 常量:所有字母都大写,字母之间用符号_隔开.
        • MAX_VALUE, MIN_VALUE
      • 变量,方法:从第二个单词开始,所有单词的首字母都大写,其他字母都小写.
        • getSum,maxValue
      • 类,接口:所有单词的首字母都大写,其他子母小写.
        • StudentMessage,HelloWorld,ForDemo
      • 包:所有字母都小写,包名之间用符号.隔开.
        • com.itheima.test, com.tankwar.app

变量可以修改数据

  • 变量的值可以覆盖.
  • 格式:
    • 变量名 = 值; //这行代码一般写在方法中.

数据类型

  • 数据有很多种不同的类型, 最常见的有数字类型和字符串类型.
  • 常见的数据类型:
    • int类型 (整型)
      • long (长整型)
    • double (浮点型,小数类型)
    • String (字符串类型)

整数和小数

  • 常见的数据类型:
    • 字符串类型
      • String, 值用""括起来
    • 整型
      • byte
      • short
      • int
      • long, 值后边要加上字母L(大小写均可)
    • 浮点型
      • float, 值后边要加上字母F(大小写均可)
      • double
    • 字符型
      • char, 值用’'括起来
    • 布尔类型
      • boolean, 值只能是true或者false.

字符串相加

  • 猜猜看,下面代码的运行结果是什么:
    • 代码示例
       String firstName = "Tomas";
       String familyName = "Zhang";
      	打印 firstName + familyName 的结果是什么;
        
  • 字符串相加,会直接拼接, 得到一个新的字符串.

变量的使用和赋值

  • 变量没有赋值就不能使用? 对么?

    • 对的. 使用变量必须先声明, 再赋值, 然后才能使用.
  • 示例代码

     public class Itheima{
     	int weight;
     	public void test(){
     		int age;
     		System.out.println(age);  	//局部变量,没有默认值.
     		System.out.println(weight);	//成员变量,有默认值.
     	}
     }
     
  • 局部变量和成员变量的区别:

    • 局部变量: 没有默认初始化值, 想使用必须先声明, 再赋值, 然后才能使用.
    • 成员变量: 有默认初始化值, 例如:
      • String类型默认值是 null,
      • 整数类型默认值是 0,
      • 浮点类型默认值是 0.0,
      • 布尔类型默认值是 false.

加加和减减

  • 算术运算符
    • +, -, *, /, %, ++, –
  • ++和–的用法(此处以++为例)
    • 单独使用
      • 前加后加没有区别, 都是自身+1.
    • 参与运算
      • 前加: 先自身+1, 然后用新值来运算.
      • 后加: 先以原值来运算, 然后再自身+1.

加等于和减等于

  • 赋值运算符

    • +=, -=, *=, /=, %=, =
  • 赋值运算符的用法(此处以+=举例)

    • +=: 左边和右边相加, 并把结果赋值给左边.
  • 比较运算符:

    • = //大于或者等于

    • <= //小于或者等于
    • //大于

    • < //小于
    • == //等于
    • != //不等于
  • 逻辑运算符

    • && 逻辑与, 要求条件都必须满足, 如果有false, 则整体为false. //相当于: And
    • || 逻辑或, 只要满足一个条件就行, 如果有true, 则整体为true. //相当于: Or
    • ! 逻辑非, 取反操作, 以前为false, 现在为true, 以前为true, 现在为false. //相当于: No

if结构

1. 
	if(条件语句){
		// 任意的代码    条件成立,就会执行,条件不成立,就不会执行

	}


2. 
	if(条件){

		// 条件成立,就会执行的代码 1
	}else{

		// 条件不成立,就会执行的代码 2
	}

	// 所以代码1 和代码2 不会同时执行,也不会同时不执行

3.
	if(条件1){
		// 代码1

	}else if(条件2){
		// 代码2

	}else if(条件3){
		// 代码3

	}else{
		// 代码4

	}

注释

概述: 注释就是用来解释代码的, 大白话, 就是给人看的.

	分类:
		单行注释:ctrl+/
			// 注释的文字
		多行注释:  ctrl+shift + /
			/*	
				注释的文字
			*/
		文档注释:
			/**	
				注释的文字
			*/

数组

概述: 数组就是一个容器,可以存储多个相同类型的数据 ,数组的长度是固定的

语法:
1. 先声明,后初始化
声明: 数据类型[] 数组名;
String[] names;

		初始化: 数组名 = new 数据类型[长度];
			names = new String[4];

	2.声明的同时初始化
		数据类型[] 数组名 = new 数据类型[长度];  // 常用  推荐
		String[] names = new String[4];


		String name;
		name = "jack";

		String name = "jack";

	3.快速初始化数组
		数据类型[] 数组名 = {值1,值2,值3,...}; // 推荐
		String[] names = {"张三","李四","王五","赵六"};

		数据类型[] 数组名 = new 数据类型[]{值1,值2,值3,...};// 常见
		String[] names = new String[]{"张三","李四","王五","赵六"};

	赋值:
		数组名[索引] = 值;
		names[0] = "班长";

	取值:
		数组名[索引]

特点:
	索引: 索引是从0开始的 ,最大的索引是 : 数组长度-1
	长度:数组的长度是数组的一个属性    int len = 数组名.length;


注意: 数组越界(索引越界)

字符串

String类:
作用:代表字符串,里边也定义了一些对字符串的常见操作。
//理解: 字符串的底层其实是一个 字符数组。
常用的构造方法:
public String();
public String(String str);
public String(char[] chs);

	常用的方法:
		concat();  //把两个字符串拼接起来,获取一个新的字符串
		★length();  //获取字符串的长度(其实就是获取字符串中 字符的个数)
		★isEmpty(); //判断字符串是否为空(长度为0返回true,不为0返回false)
		★equals();  //比较两个字符串的内容是否相同。    //区分大小写
		equalsIgnoreCase();  //比较两个字符串的内容是否相同。    //忽略大小写
		★charAt();	//根据给定的索引,获取对应位置的字符
		★contains();	//判断字符串中是否包含 给定的字符串。
		endsWith(); //判断字符串是否以 给定的字符串 结尾。
		startsWith(); //判断字符串是否以 给定的字符串 开头。
		★indexOf();	//获取指定的字符 在字符串中 第一次出现的位置(索引),找不到返回-1
			//int index = a1.indexOf('h');   从头找,'h'第一次出现的位置
			//int index = a1.indexOf('h',3); 从索引为3的元素开始往后找,'h'第一次出现的位置
		lastIndexOf();	//获取指定的字符 在字符串中 最后一次出现的位置(索引),找不到返回-1
			//int index = a1.lastIndexOf('h');   从尾部找,'h'最后一次出现的位置
			//int index = a1.lastIndexOf('h',3); 从索引为3的元素开始往前找,'h'最后一次出现的位置
		★replace();	//用新内容替代旧内容,返回新的字符串
		★split();	//根据给定的内容,切割字符串,返回字符串数组
		★substring(); //截取字符串,返回新的字符串
			//String newStr = a1.substring(2);	     //从给定索引,直接截取到字符串末尾
			//String newStr = a1.substring(2,5);	 //包左不包右(前闭后开), 能取索引2的元素,不能取索引5的元素
		toLowerCase();	//把字母都转成其对应的小写形式。
		toUpperCase();	//把字母都转成其对应的大写形式。
		★trim();			//移除首尾空格。 "   abc   "-->"abc"
		
	理解的口诀:
		判断功能:  首尾中空加判断	
			
		获取功能:	截长取位取元素
		
		转换功能:	大小拼串转数组
			//toCharArray(), getBytes();
		其他功能:  除空切换字典拍
			//copareTo();

面向对象入门

面向对象入门(封装):
Java语言就是用来描述 现实世界事物的, 最基本的单位是类.
* 如何定义类
* 格式
public class 类名 {
}
* 注意
* 类名要和文件名一致

	类与对象的关系:
		类: 一个抽象的概念,是看不见也摸不着的
		对象: 类的具体体现,实现.
		属性: 名词, 事物有哪些特征. 
			//其实就是我们说的: 成员变量
		行为: 动词, 事物能做什么
			//其实就是我们说的: 成员方法
		
	如何创建对象:
		数据类型 对象名 = new 数据类型();
	如何使用类中的内容(成员)
		通过 对象点 的形式来调用.
		
	构造方法:
		作用: 用来创建对象的.
			//大白话: 其实就是用来给属性赋值的.
		格式:
			public 类名(参数列表) {
			}
			
	封装:
		概述: 隐藏对象的属性和实现细节,仅对外提供一个公共的访问方式.
			如何隐藏?
				可以通过 private 关键字实现.
				private 关键字:
					被它修饰的内容,只能在本类中直接访问.
			公共的访问方式是什么?
				getXxx() 和 setXxx()

this关键字讲解

  • 概述:
    • 官方解释: 代表本类当前对象的引用.
    • 大白话: 谁调用, 就代表谁.
  • 作用:
    • 用来解决 局部变量 和 成员变量 重名问题的.
  • 局部变量和成员变量的区别:
    • 局部变量: 定义在方法中, 或者方法声明上的变量, 没有默认值.
    • 成员变量: 定义在类中, 方法外的变量, 有默认值.
  • 记忆:
    • Java中使用变量遵循的特点: 遵循就近原则.
    • 局部有就使用, 没有就去本类的成员位置找, 有就使用, 没有就报错. //先这么记忆, 不严谨.

static关键字

  • 概述:
    • 当一个属性是被该类下所有的对象所共享的时候, 就可以考虑使用静态.
  • 特点:
    • a. 被static修饰的内容, 能被该类下所有的对象所共享.
      • b. 可以被 类名点 的形式直接调用. //记忆
  • 注意事项:
    • a. 静态方法中是没有 this 关键字.
    • b. 静态方法中只能直接访问静态.

Random类讲解

  • 关于是否导包:
    • 如果是使用java.lang包下的类, 是可以直接使用的, 不用导包.
    • 其他包下的类, 必须导包才能使用.
  • Random类中的成员方法:
    • public int nextInt(int n); 生成一个0~n之间的随机数, 包左不包右

while循环

  • loop是神奇的东西, 允许我们让计算机执行代码任意的次数.
  • while循环, 后跟一个条件, 重复执行任务只要条件为真.
  • 尝试运行下面的代码
    • 创建Itheima类, 创建无参无返回值test方法
       int counter = 0;
       while(counter < 10) {
       	counter++;
       }
       System.out.print(counter);
       
  • while循环
    • 语法格式:
       初始化条件;  			//1
       while(判断条件) {		//2
       	//循环体			//3
       	//控制条件		//4
       }
       
    • 执行顺序:
      • 第一次执行:
        • 先执行初始化条件, 在执行判断条件, 如果不成立, 就结束
        • 如果成立, 就执行循环体, 然后执行控制条件.
      • 第二次执行:
        • 执行判断条件, 再执行循环体, 在执行控制条件
      • …(重复第二次步骤)
      • 最后一次:
        • 执行判断条件, 不成立, 循环结束.
    • 用1,2,3,4步来陈述上述的执行流程:
      • 第一次执行: 1, 2, 3, 4
        • 第二次执行: 2, 3, 4
          第三次执行: 2, 3, 4
          … 2, 3, 4
      • 最后一次执行: 2

do.while循环

  • do while循环和while循环,基本上类似, 不过do while循环是先干活, 后检查条件是否成立
  • 尝试运行下面的代码
    • 创建Itheima类, 创建无参无返回值test方法
       int counter = 5;
       do{
           counter++;
       }while(counter<10);
       System.out.print(counter);
       
  • do.while循环
    • 语法格式:
       初始化条件;			//1
       do {					
       	//循环体			//3
       	//控制条件		//4
       }while(判断条件) ;		//2
       
    • 执行顺序:用1,2,3,4步来陈述上述的执行流程:
      • 第一次: 1, 3, 4, 2
        • 第二次: 3, 4, 2
          … 3, 4, 2
      • 最后一次: 2

for循环

  • for循环
    • 包含三个部分, 第一部分,循环的开始条件,第二部分循环的判断条件,第三部分循环的的变化方式.
  • 尝试运行下面的代码
    • 创建Itheima类, 创建无参无返回值test方法
       for(int i =1;i<=8;i++){
           System.out.println(i);
       }
       
  • for循环
    • 语法格式:
       //	1	  2 	  4
       for(初始化条件; 判断条件; 控制条件) {
       	//循环体		//3
       }
       
    • 执行顺序:
      • 第一次执行:
        • 先执行初始化条件, 在执行判断条件, 如果不成立, 就结束
        • 如果成立, 就执行循环体, 然后执行控制条件.
      • 第二次执行:
        • 执行判断条件, 再执行循环体, 在执行控制条件
      • …(重复第二次步骤)
      • 最后一次:
        • 执行判断条件, 不成立, 循环结束.
    • 用1,2,3,4步来陈述上述的执行流程:
      • 第一次执行: 1, 2, 3, 4
        • 第二次执行: 2, 3, 4
          第三次执行: 2, 3, 4
          … 2, 3, 4
      • 最后一次执行: 2

for循环倒序输出

  • 尝试运行下面的代码
    • 创建Itheima类, 创建无参无返回值test方法
    • 我们来看看另外一种for循环的写法
       for(int i=5 ;i>0;i--){
           System.out.println(i);
       }
       

三种循环之间的区别

  • 需求:
    • 到目前为止, 我们学过的循环有: while, do.while, for
  • 和循环相关的一些问题:
    • 问题一: 什么时候使用哪种循环?
      • 循环次数已知吗?
        • 是: for
        • 否: //一般我们会优先选择while
          • 是否需要先执行一次,再判断:
            • 是: do.while
            • 否: while
    • 问题二: 三种循环之间的区别是什么?
      • do.while循环和其他两种循环的区别:
        • do.while循环是先执行一次后判断, 其他两个循环是先判断, 后决定是否执行.
        • for循环和其他两个循环的区别: for循环执行完毕后, 初始化条件就不能用了, 其他两个循环执行完毕后, 初始化条件还可以继续使用.
        • 这个就是我理解的这个问题.

泛型和包装类

  • 泛型
    • 概述: 泛指某种特定的数据类型, 表示形式为: <>
      • 大白话: 泛型就是用来确定, 集合中将要添加什么类型的数据.
    • 好处:
      • 提高代码的安全性.
    • 记忆:
      • 泛型只能是引用数据类型.
      • 泛型一般只和集合结合使用.
  • 包装类:
    • 概述:
      • 其实就是基本数据对应的引用数据类型.
    • 各基本类型对应的包装类如下:
      • 基本数据类型 对应的 引用数据类型(包装类)
        • byte Byte
          short Short
          char Character
          int Integer
          long Long
          float float
          double Double
          boolean Boolean
    • 自动拆装箱(JDK1.5的新特性)
      • 自动装箱: 就是把基本类型的数据转成对应的引用数据类型.
        • Integer i = 10;
      • 自动拆箱: 就是把引用类型的数据转成对应的基本数据类型.
        • Integer i = 10;
        • int a = i;

ArrayList集合

	ArrayList: 有序,可重复
		add(Object value);	 //添加元素
		get(int index);		 //根据索引获取对应的元素.
		set(int index,Object value);	//把指定索引位置改成指定值
		remove(int index);	//根据索引移除元素
		isEmpty();			//判断集合是否为空
		indexOf();			//返回指定元素在集合中第一次出现的位置, 如果元素不存在,返回-1
		lastIndexOf();		//返回指定元素在集合中最后一次出现的位置, 如果元素不存在,返回-1
		size();				//获取集合的长度(元素的个数)
		toArray();			//把集合转成对应的数组
		//Arrays.toString(数组对象);	//把数组转成其对应的字符串形式(快速打印数组的内容)

抽象类

  • 概述:
    • 有抽象方法的类一定是抽象类(或者接口), 抽象类中不一定有抽象方法.
  • 特点:
    • 1.有抽象方法的类一定是抽象类(或者接口), 抽象用关键字 abstract 修饰.
    • 2.抽象类能创建对象吗?
      • 不能.
      • 既然抽象类不能实例化, 那么怎么实例化呢?
        • 可以通过创建其子类对象, 完成实例化.
        • 多态: Animal an = new Cat();
    • 3.抽象类有构造方法吗?
      • 有.
      • 既然不能创建对象, 那么要构造方法有什么用?
        • 用于子类对象访问父类数据前,对父类数据进行初始化.
    • 4.抽象类的子类:
      • 要么也是抽象类: 这样可以不用重写抽象方法.
        • 要么是普通类: 必须重写父类中的所有抽象方法.

接口

  • 概述:

    • 比抽象类更加抽象.
    • 接口不是类, 因为接口中没有构造方法.
  • 特点:

      1. 接口用 interface 关键字表示.
      1. 类实现接口用 implements 关键字表示.
      1. 接口中没有构造方法的.
      1. 接口的子类:
      • 要么也是抽象类: 这样可以不用重写抽象方法.
        • 要么是普通类: 必须重写父接口中的所有抽象方法.
  • 接口的成员特点:

    • JDK1.7及其以前:
      • 接口中的成员有且只能有: 抽象方法或者是常量.
      • 抽象方法的默认修饰符: public abstract
      • 常量的默认修饰符: public static final
    • JDK1.8之后:
      • 接口中可以定义有方法体的方法了,
      • 如果是静态可以直接写, 如果是非静态方法, 必须加default.

类与接口之间的关系

  • 类与接口之间的关系:
    • 类与类: 继承关系, 只能单继承, 不能多继承, 但是可以多层继承.
    • 类与接口: 实现关系, 可以单实现, 可以多实现, 还可以在继承一个类的同时实现多个接口.
    • 接口与接口: 继承关系, 可以单继承,也可以多继承.
  • 面试题:
    • 抽象类和接口的区别是什么:
      • 1.成员特点不同
        • 抽象类中的成员比普通类多一种抽象方法(而且抽象方法也可以不写)
        • 接口中有且只能有抽象方法(JDK1.8以后可以有带方法体的方法)或者常量.
      • 2.关系特点不同
        • 参考上个知识点
      • 3.设计理念不同
        • 抽象类: 定义的是整个继承体系的 共性内容.
        • 接口: 定义的是整个继承体系的 扩展内容.
  • 记忆:
    • 以后我们学习一个新的体系, 都将采用: 学顶层, 用底层 的方式.
    • 因为顶层记录的是整个体系的共性内容, 而底层才是具体的实现.

多态

  • 概述:
    • 同一事物在不同时刻表现出来的不同形态(状态).
  • 前提条件:
    • 1.必须要有继承(或者实现)关系.
    • 2.要有父类(父接口)引用指向子类对象.
    • 3.要有方法重写.

多态的访问特点

  • 多态的访问特点:
    • 成员变量:
      • 编译看左边, 运行看左边.
    • 成员方法:
      • 静态: 编译看左边, 运行看左边.
      • 非静态: 编译看左边, 运行看右边.
    • 总结: (记忆)
      • 只有非静态方法是编译看左边,运行看右边, 其他都是编译和运行都看左边.
      • 原因是因为: 只有非静态方法有 方法重写.

多态的好处和弊端

  • 多态的好处
    • 1.提高代码的扩展性.
    • 2.提高代码的可维护性.
  • 多态在实际开发中最常用的应用场景:
    • 父类型可以作为方法的形参的参数类型, 这样可以接受其任意的子类对象.
    • 代码示例:
       public static void test(Person p) { 
       	p.eat();
       }
       
  • 多态的弊端:
    • 父类(父接口)引用 不能直接使用子类的特有成员(成员变量和成员方法).
    • 怎么解决这个问题呢?
      • 可以通过向下转型实现.
  • 向上转型和向下转型: 这个概念是针对于引用类型的
    • Person person = new Student(); 向上转型
      • Student s = (Student)person; 向下转型
  • 隐式类型转换和强制类型转换: 这个概念是针对于基本类型的
    • double d = 10; 隐式类型转换
      • int a = (int)d; 强制类型转换
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值