java基础中级版本

java

  • javaME:Java Micro Edition 嵌入式开发(手机 家电)
  • javaSE :Java Standard Edition 标准版(桌面 控制台开发) 核心 基础
  • **javaEE **:Java Enterprise Edition 企业级开发(web端 服务器开发)java的主要方向

JDK, JRE, JVM

  • JDK:java开发工具 java集成开发工具包
  • JRE:java运行环境
  • JVM:java虚拟机

image-20210604174336393

JDK包含JRE包含JVM; API在JRE中

java开发环境搭建

卸载jdk

  1. 删除java JDK安装目录(安装包)

  2. 删除JAVA-HOME

  3. 删除path下关于java的目录(删除环境变量)

  4. cmd中 查看一下 java -version

安装jdk

官网下载:https://www.oracle.com/java/technologies/javase-downloads.html

  1. oracle官网

  2. 找到jdk

  3. 下载,双击安装

  4. 一直下一步,记住安装的路径

  5. 配置环境变量

    1. 我的电脑–>右键–>属性–>高级系统设置–>环境变量

    2. 环境变量–>系统变量 新建 变量名JAVA_HOME–>变量值为jdk安装的路径(包路径)(C:\Program Files\Java\jdk-14.0.1)

    3. 配置path变量–>系统变量 打开path–>新建 %JAVA_HOME%\bin–>新建 %JAVA_HOME%\jre\bin(这一步看情况,可能不需要)

      %% 表示 引用 的意思 表示变量JAVA_HOEME的值 等价于(C:\Program Files\Java\jdk-14.0.1),, %JAVA_HOME%\jre\bin指向了JAVA_HOME下的bin目录


      1. 检查安装是否成功 cmd -->java -version

        java目录

  • bin 放了一些一些可执行的文件
  • include 一些c语言的头文件
  • jre java运行环境
  • lib java的库
  • src.zip 资源文件 很多java类 所有的类都在src里面 可以看见源代码

(尽量将环境放在一起)

快捷键

win 加 + 放大镜

win 加R 打开运行

win 加E 打开我的电脑

ctrl shift esc 打开任务管理器

win tab 切换桌面

基本dos命令

dos控制台

打开cmd方式

  1. 开始+系统+命令提示符
  2. win+R 输入cmd 打开控制台
  3. 在任意文件夹下,桌面下,按住shift+右键 打开powershell窗口
  4. 资源管理器的地址栏前面加上cmd路径

管理员方式运行:开始界面 windows系统 cmd右键 管理员身份运行

常用dos命令

#盘符切换  系统盘+:
#查看当前目录所以文件  dir
#切换目录  cd 
		cd .. 返回上一级
		cd /d E:\ide 跨磁盘跳转
		cd +文件名 进入一个文件
		cd>a.txt 新建一个文件
#删除文件 del
		del a.txt
#清理屏幕 cls  (clear screen)
#推出终端 exit
#查看电脑ip ipconfig
#打开应用
		calc  计算机
		mspaint 画图
		notepad 记事本
#ping命令
		ping www.baidu.com
#创建文件目录 md 
		md 文件目录  
#删除文件目录 rd
		rd 文件目录
		

Hello World

  1. 新建文件夹,存放代码

  2. 新建java文件

    • 显示文件扩展名

    • 文件名.java

  3. 编写代码

    public class Hello {
        public static void main(String[] args) {
            System.out.println("Hello,World!");
        }
    }
    
  4. javac编译器 编译 .java文件,会生成一个class文件 //需要点java

  5. java运行class文件 //不需要点class

java程序运行机制

  • 编译型:一次编译完
  • 解释型:一次编译一段

IDEA安装

  • IDE:集成开发环境
  • IDEA优化

java基础语法

  • 单行注释 //

  • 多行注释 /* */

  • 文档注释 javaDoc /** */

        /**
         * @Description  描述
       * @Author  作者
         * 
         */
    

数据类型

  • 强类型语言 (更安全 速度慢)
    • 要求变量先定义后使用
  • 弱类型语言

image-20210522105202189

  • java数据类型分为两大类

    • 基本类型(primitive type)
      • long类型要在数字后面加个L
      • float类型要加一个F
      • String不是关键字,是一个类
      • boolean占一位(bit) 0或1
    • 引用类型(reference type)
      • 类(String Integer Byte)
      • 接口
      • 数组
  • 位(bit)0或1

  • 字节(Byte)

  • 1B=8bit


整数拓展 int

int i=10; //10
int i2=010;//八进制 8
int i3=0x10;//十六进制 16    0~9 A~F 16

浮点数拓展 float double 有限 离散 舍入误差 大约 接近但不等于

避免浮点数进行比较

银行业务? 用BigDecimal 数学工具类 表示数


字符拓展 char (编码表)

可以强制转换为数字 字符本质是数字 数字与字符对应


转义字符

\t 制表符 (相当于 tab)

\n 换行


String sa=new String(“Hello”);

String sb=new String(“Hello”);

sa不等于sb 比较的式地址 地址不一样 (对象 内存)

String sc=“Hello”;

String sd=“Hello”;

sc等于sd


布尔值拓展

Boolean flag =true;

if(flag==true){} //新手

if(flag){} //上下一样

类型转换

  • java是强类型语言,所以进行有些运算时要用到类型转换

    低 --------->高 自动转换

    byte,short,char——》int——》long——》float——》double

int i=2;
byte b=(byte)i;//强制转换 (转换类型)变量名  从高——》低
/*
1.布尔值不能转换
2.不能把对象类型转换为不相干的类型 (要用继承关系)
3.转换时可能存在内存溢出,或精度问题! (小数点丢失)  (128转换为byte就是精度问题)
4.高转低 ,强制转换
*/

//操作比较大的数的时候,注意溢出问题
//JDK7新特性,数字之间可以用下划线分割
int money =10_0000_0000;//不会输出下划线
//超出范围时,先把一个数转换为更大的数

变量

  • 作用域
public class Test {
    static int test =0;// 类变量(静态变量)
    String str= "hello";// 实例变量  (可以不初始化)
    
    public void  method(){
        int i = 0;//局部变量 (必须初始化)
    }
}
  • 类变量 (静态变量) static修饰定义变量在类中 在方法中可以直接使用 没有static修饰的不行

    可以直接使用,或 类名.变量名 使用

  • 实例变量(类变量):从属于对象 ,类 如果不初始化 默认值为int为0,小数为0.0或boolean为false 其余为null 方法中不能直接使用 需要在方法中创建对象调出使用

  • 局部变量 :一个方法{ }里面 必须声明和初始化值

命名规范

  • 类名:首字目大写和每个字母首字母大写
  • 常量:大写字母 (全大写) 和下划线 : MAX_VALLUE
  • 其他的首字母小写,其他 单词首字母 大写

常量 (初始化后无法变动的值)

  • 关键字 final

  • 常量名一般使用大写字符

    final 与static可以一起使用

运算符

// Ctrl + D: 复制当前到后面

低位的运算结果默认为int,有long的默认为long,有double为double double>long

int a=3;//a初始为3,进过下面两次计算a为5

int b=a++;//先赋值,a再加1,b为3

int c=++a;//a先加1,再赋值,c为5

幂运算 很多运算会使用工具类操作!(数学工具类Math)

double pow = math.pow(2.3)//2的3次方,会返回一个数

&&与 ||或 !非 逻辑运算符会产生短路运算 (第一个不满足直接为 false)

int c=5;
boolean d=(c<4)&&(c++<4);
System.out.print(d);//d为false
System.out.print(c);//c为5  因为短路运算 c++没有执行所以c还为5
  • 位运算 跟二进制相关 一位一位的比较 效率高

    • &与 |或 ^相同为0,不同为1 ~取反

    • 《《 左移相当于乘2

    • 》》 右移相当于除2

2<<3 相当于2乘2乘3次

image-20210522115239061

​ a+=b;//a = a+b

​ a-=b;//a = a-b

字符串连接符 + ,String

int a = 10;
int b = 20;
System.out.print(""+a+b);//1020   字符串在前面  后面的数会拼接
System.out.print(a+b+"");//30   字符串在后面   前面的会运算
System.out.print(a+b+""+a+b)//301020   字符串前 会运算 后会拼接

三元运算符

// x?y:z

如果x==true (x可以是一个运算表达式 ),则结果为y,否则为z 会返回一个值

int score = 80;
String type = score < 60 ? "不及格":"及格";  // type 的值为 及格 或 不及格

包机制

  • 更好的组织类,就是文件夹,解决重名问题

  • 一般利用公司域名倒置作包名 //com.baidu.www

  • package开头 加自己在的父子包名

  • Ctrl+鼠标左键 看源码 看源包

  • 导包 : 将package换成 import 具体到类名 //.* 可以表示包下所有内容 所有类 导包类名与当前类名不要重复

    import java.util.Date;
    

javaDoc

  • javadoc命令是用来生成自己的API文档的
    • @author 作者名
    • @version 版本号
    • @since 指明需要最早使用的jdk版本
    • @param 参数名
    • @return 返回值情况
    • @throws 异常抛出情况

image-20210523101557976

image-20210523102125528

官方在线文档:Java SE 文档 — API 和文档 | Oracle 中国

java流程控制

Scanner对象

  • 实现程序和人的交互,java提供了一个工具类,获取用户的输入。 java.util.Scanner是java5的新特性,我们可以通过Scanner类来获取用户的输入

  • 基本语法:

    ​ Scanner s = new Scanner(System.in);

    alt+enter补全对象

  • 通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前使用hasNext()与hasNextLine()判断是否还有输入的数据。

      public static void main(String[] args) {
            //创建一个扫描器对象,接收键盘数据
            Scanner scanner = new Scanner(System.in);
            //判断是否输入数据
                if(scanner.hasNext()){
                    String str=scanner.next();//接收数据
                    System.out.println("输出内容"+str);
                }
                scanner.close();//凡是属于IO流的类不关闭会一直占用资源。 (输入输出流)
        }
    
  • scanner.close();关闭Scanner

  • next()

    • 读取不到空格之后的字符串 hello world //只能获取hello
    • 不能获得空白
  • nextLine()

    • 可以读取输入回车前的所有字符,包括空格 hello world //能获取hello world
    • 可以 获得空白
  • 可以不用if判断hasNext(),所有的输入为String类型,用String接收。

String s = scanner.nextLine();
  • nextInt() hasNextInt()只能输入整数
  • nextFloat() hasNextFloat()只能输入小数或整数
  public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        double sum=0;
        int m=0;
        while (scanner.hasNextDouble()){//如果输入不是double会停止循环
            double d = scanner.nextDouble();
            m++;
            sum = sum + d;
            System.out.println("你输入了"+m+"个数据,结果为"+sum);

        }
        System.out.println(m+"和"+sum);
        System.out.println(m+"平均数"+(sum / m));

            scanner.close();
    }

顺序结构

  • 重上至下一句一句执行 基本算法结构

选择结构

  • if单选结构

    • if(true){
          //执行语句
      }
      //equals方法:判断字符串是否相等    s.equals("Hello")  判断字符串等等与Hello
      
      

    // 少用== 判断字符串

    
    
  • if双选结构

    • if(true){
           //执行语句
      }else{
           //执行语句
      }
      
  • if多选结构

    • if(){
           //执行语句
      }else if(){
           //执行语句
      }else if(){
           //执行语句
      }else if(){
           //执行语句
      }else{
          
      }
      
  • 嵌套的if结构

    • if(true){
          //执行语句
          if(true){
          //执行语句
      	}
      }
      
  • switch多选择结构

    • switch case 语句

    • case 穿透

        char  grade='A';
              switch (grade){//可以是字符串 和八大基本类型 JDK7特性
                  case 'A':
                      System.out.println("优秀");
                      break;//可选 没写的话会输出当前和下面的语句
                  case 'B':
                      System.out.println("良好");
                      break;// 如果为B 会输出良好  不会输出下面的数据
                  case 'C':
                      System.out.println("及格");
      
                  case 'D':
                      System.out.println("挂科");
      
                  default:// 参数都不满足 走default
                      System.out.println("未知");
      
      
      
  • 反编译 用IDEA打开class文件(将class文件通过文件目录的形式,放入IDEA项目中)

循环结构

  • while循环 如果不满足条件,则不能进入循环

    • while (true){
             //执行内容       
          }
      
  • do…while循环 如果不满足条件,也至少执行一次

    • do{
          //执行
      }while(true);
      
  • for循环

    for (初始化; 布尔表达式 ; 更新) {// 初始化可以定义多个变量  
              
          }
    
//死循环
for;;{
    
}

//计算0到100之间奇数和偶数的和
int odSum = 0;
     int eveSum = 0;
        for (int i = 0; i < 100; i++) {
            if (i%2!=0){
                odSum+=i;//奇数和
            }else{java
                eveSum+=i;//偶数和
            }

//print输出完不换行
//printIn输出完换行

```
  • IDEA快捷创建方式 数字.for (10.for 创建循环10次的for循环)

  • java5引入了主要对于数组或集合的遍历 增强for循环(适用于遍历)

    for(声明语句 :表达式){
        //代码
    }
    
    
    
       int[] mun = {10,20,30,40};
    
    		forint i=0;i<5;i++{
                System.out.printIn(mun[i]);//普通for循环
            }
    
            for (int x:mun) {// 遍历mun  用 x 取出数据
                System.out.println(x);//增强for循环  简化
            }
    
    
  • break continue

    • break可以在任何循环中 强行退出循环,不仅仅是在switch语句中
    • continue用于终止某一次循环过程,接着进行下一次循环

java方法

  1. 何谓方法

    • System.out.printIn(),

      类. 对象. 方法( )

    • java方法是语句的集合,它们在一起执行一个功能

      //一个方法需要new一个类 点方法才能使用
         public static void main(String[] args) {
      
              text t = new text();
              System.out.println( t.add(1,2));
      
          }
          public  int add(int a,int b){
              return a+b;
      
          }
      
      //一个方法加上static关键字后  可以直接使用方法  不用创建类
         
          public static void main(String[] args) {
      
              System.out.println( add(1,2));
      
          }
          public  static int add(int a,int b){
              return a+b;
      
          }
      
  2. 方法的定义及应用

    • java方法类似其他语言的函数,用来完成特定功能的 代码片段
  3. 方法重载

    • 重载就是在一个类中,有相同的函数名称,但形参不同的函数

      public static void main(String[] args) {
             text t = new text();
             System.out.println( t.add(1.1,2.2));
        
         }
      //方法重载  方法名字相同 参数不同
          public  static int add(int a,int b){//int型add方法
              return a+b;
      
          }
          public  static double add(double a,double b){//double型add方法
              return a+b;
      
          }
      
      1. 方法名称必须相同

      2. 参数列表必须不同

  4. 命令行传参 CMD (运行一个程序时再给他消息)

    public static void main(String[] args) {
          for (int i = 0; i <args.length ; i++) {
              System.out.println("args["+i+"]:"+args[i]);
      
          }
      }
    //程序编译以后通过 cmd命令行传递参数 需要从src目录出执行程序
    
  5. 可变参数 不定项参数 不规定你要传多少参数 参数可以看作一个数组

    • Jdk1.5支持

    • 方法声明中,指定参数类型后加一个省略号(…)

    • 一个方法中只能指定一个可变参数,它必须是最后一个参数。任何普通参数必须在它之前声明。

        public static void main(String[] args) {
              text t = new text();
              t.text(1,5,6,7);
      
      
          }
          public void text (int... i){//可变参数
              System.out.println(i[0]);//i相当与一个数组 通过下标取出数据
              System.out.println(i[1]);
              System.out.println(i[2]);
              System.out.println(i[3]);
          }  
      	public  void text(double j,int... i){
      
              
          }
      
  6. 递归

    能不用递归就不要递归 小计算可用递归

    • 递归就是自己调用自己

      • public static void main(String[] args) {
              System.out.println(f(5));
          }
          //阶乘 5! 5的阶乘
          public static int  f (int n) {
              if(n==1){//递归的边界
                  return 1;
              }else {
                  return n*f(n-1);//递归 有一个边界
              }
          
        

      }

      
      

image-20210523112727800

image-20210523112920885

  • 递归结构包括两个部分
    • 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环
    • 递归体:什么时候需要调用自身方法

数组

数组的定义

  • 数组是相同数据类型的有序集合
  • 数组元素通过数组下标访问,从 0 开始

数组声明创建

  • 首先声明数组变量

    int[] mun1;//声明一个数组 首选 没有开辟空间  栈里面
         int mun2[];(不常用)
    
  • new创建数组

        int[] mun1;//定义 首选
            mun1 = new int[5];//创建一个数组 存放5个int类型数据  开辟了一个方5个int的空间   对象在堆里面
    
  • 数组的元素索引从0开始

    没赋值的int默认为0 string默认为null

  • 获取数组长度:array.length 方法

java.lang.ArrayIndexOutOfBoundsException 数组下标越界异常

image-20210523114255070

image-20210523114641631

三种初始化

  • 静态初始化 : 创建+赋值

    int[] a = {1,2,3,4,5,6};
     
    Man[]  mans = { new Ma(1,1), new Ma(2,2)}//Man是一个创建的类
    
  • 动态初始化: 包含默认初始化

    int[] b = new int[10];
            b[0] = 10;
            System.out.println(b[0]);
    

数组的四个基本特点

  • 长度确定。一旦被创建大小不可改变。
  • 元素类型相同
  • 数组元素 可以是任何数组类型
  • 数组变量属于引用类型,数组可以看成对象。数组本身就是对象,java中对象是在堆中的。new出来的都是在中的。

数组边界

ArrayIndexOutOfBoundsException:数组下标越界异常

  • 数组是相同数据类型的有序集合

  • 数组也是对象。数组元素相当与对象的成员变量

  • 数组长度越界报错

数组的使用

  • 增强for循环,array.for 适合打印输出(遍历) 不适合操作元素
  • 普通For循环
  • 数组作为方法入参
  • 数组作为返回值

多维数组

  • 多维数组可以看成是数组的数组, 比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组, (数组里面包含了一个数组)

原来存一个数 现在存一个数组

       int[][] a = {{1,2},{2,3},{3,4}{45}};
        //[4][2]
	//	a[0]为一个数组	a[1]唯一数组	a[2]为一个数组 a[3]为一个数组

//        {1,2}  a[0]
//        {2,3}  a[1]
//        {3,4}  a[2]
//        {4,5}  a[3]
 
	a[0]中存了{12}  就是数据12 | a[0][0]中存了数据1
	// a.length   a[i].length

​ 二维数组(数组嵌套):一个数组 数组内包含的另一个数组

image-20210523171557421

Arrays类(数组的工具类)

  • 数组工具类java.util.Arrays

  • toString(数组)方法 打印数组元素(此方法数据是用[ ]括起来的)

  • sort(数组)方法 数组进行排序(升序)

  • Arryas类方法都是static修饰的静态方法可以直接类名点方法调用,不需要使用对象调用

  • fill(数组,填充数值) 方法 数组填充

冒泡排序(八大排序)

    1. 比较数组中两个相邻的元素 如果第一个比第二个数大 交换他们的位置**(大的数据右移)**
    2. 每次比较 产生最大值 最小值
    3. 下一轮减少一次排序
    4. 一次循环 到结束
  1. 两层循环,外层表示轮数。里层依次比较

时间复杂度O(n2)

 public static void main(String[] args) {
      int[] a = {5,8,2,6,7};// 5个数循环4次
      int[] b = sort(a);
      System.out.println(Arrays.toString(b));
      }
      public  static  int[] sort(int[] array) {
      //临时变量
          int temp = 0;
          //外层循环,判断走多少次
          for (int i = 0; i < array.length - 1; i++) {// 循环4次
              //内层循环,判断大小
                            
              for (int j = 0; j < array.length - 1 - i; j++) {//每次可以少判断一次
                  if (array[j+1]<array[j]) {
                      temp = array[j];
                      array[j] = array[j + 1];
                      array[j + 1] = temp;
                  }
              }
          }
          return array;
      }



// 优化 存疑
 public static void main(String[] args) {
      int[] a = {5,8,2,6,7};// 5个数循环4次
      int[] b = sort(a);
      System.out.println(Arrays.toString(b));

      }
      public  static  int[] sort(int[] array) {
      //临时变量
          int temp = 0;
          //外层循环,判断走多少次
          for (int i = 0; i < array.length - 1; i++) {// 循环4次
              //内层循环,判断大小
              
              boolean flag =false;// (优化)通过flag标识位减少没有意义的比较
              
              for (int j = 0; j < array.length - 1 - i; j++) {//每次可以少判断一次
                  if (array[j+1]<array[j]) {
                      temp = array[j];
                      array[j] = array[j + 1];
                      array[j + 1] = temp;
                      flag=true;
                  }
              }
              if(flag==false){
                  break;
              }
          }
          return array;
      }

稀疏数组

数据结构) 好好研究研究

  • 当一个数组中大部分元素为0,或者为同一值的数组时,可以用稀疏数组来保存改数组
  • 稀疏数组的处理方式:
    • 记录数组一共有 几行几列,有多少个不同值
    • 把具有不同值的元素和行列记录在一个小规模的 数组中,从而缩小程序的规模 (压缩)

参考:

image-20210525174450320

public class Test {
    public static void main(String[] args) {
        //创建一个二维数组  11*11  0:没有棋子   1:黑棋子   2:白棋子
        int[][] array1=new int[11][11];
        array1[1][2] =1;
        array1[2][3] =2;
        //输出原始的数组
        System.out.println("输出原始的数组");

        for (int[] ints : array1) {
            for (int anInt: ints) {// anInt 是个具体的值
                System.out.print(anInt+"\t");// \t 空格的意思
            }
            System.out.println();//换行
        }
        System.out.println("===============");
        //转换为稀疏数组保存
        //获取有效值的个数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (array1[i][j]!=0){
                    sum++;
                }
            }
        }
        System.out.println("有效值的个数:"+sum);

        //2.创建一个稀疏数组的数组
        int[][] array2 = new int[sum+1][3];
        // 稀疏数组的头
        array2[0][0]=11;
        array2[0][1]=11;
        array2[0][2]=sum;

        //遍历二维数组,将非零的值,存放稀疏数组中
        int count=0;
        for (int i = 0; i < array1.length; i++) {//array1.length 外层数组的长度
            for (int j = 0; j < array1[i].length; j++) {// array1[i].length内层数组的长度
                if (array1[i][j]!=0){
                    count++;
                    array2[count][0]=i;
                    array2[count][1]=j;
                    array2[count][2]=array1[i][j];

                }
            }
        }

        //输出稀疏数组
        System.out.println("稀疏数组");

        for (int i = 0; i < array2.length; i++) {// i=0 记录的是 有多少 行,列,值(头部信息)  i=1 才是第一个数
            System.out.println(array2[i][0]+"\t"
                    +array2[i][1]+"\t"
                    +array2[i][2]+"\t");
        }
        System.out.println("===============");

        System.out.println("还原");
        //1.读取稀疏数组的值
        int[][] array3=new int[array2[0][0]][array2[0][1]];

        //2.给其中的元素还原他的值
        for (int i = 1; i < array2.length; i++) {//i=0是(头部信息)  从array2第一个记录的数开始   i=1 才是第一个元素的具体信息
            array3[array2[i][0]][array2[i][1]]=array2[i][2];

        }
        //3. 打印
        System.out.println("输出还原的数组");

        for (int[] ints: array3) {
            for (int anInt: ints) {// anInt 是个具体的值
                System.out.print(anInt+"\t");
            }
            System.out.println();//换行
        }
    }
}

输出结果

image-20210525210851316

面向对象编程

面向对象

  • oop

  • 面向对象编程的本质就是:以类的方式组织代码,以对象的形式组织(封装)数据。

  • 抽象

  • 三大特点

    • 封装
    • 继承
    • 多态

方法

  • 方法定义

修饰符 返回值类型 方法名(参数){

​ //方法体

​ return 返回值;

}

  • 异常抛出

方法的调用:(难点是递归)

  • 静态方法static**(和类同时加载)** 和 非静态方法 (对象创建才加载)

    1. 一个类中静态方法不可以调用非静态方法

    2. 一个类中静态可以调用静态

    3. 一个类中非静态可以调用非静态

      //1 
      public void a(){
                  b();
              };
       public void b(){};
      
      //2
      public static  void a(){
                  b();
              };
      public static  void b(){};
      
      //3 a()无法调用b
      public static  void a(){  //static和类一起加载
                  b();//错误
              };
      public   void b(){};  //类实例化 new对象后才加载
      
      
  • 方法:形式参数(参数的名字) 实际参数(参数的值)5

  • 值传递 和 引用传递 (java都是值传递 )

    //void方法  
    public static void main(String[] args) {
            int a = 1;
           change(a);
            System.out.println(a);// 输出a 值为1
            }
    		// void方法   并没有返回值
            public static void change(int a){//形参 值传递
                a = 10;
            }
    
    // int方法 返回值为a 
        public static void main(String[] args) {
            int a = 1;
            System.out.println(change(a));// 输出a 值为1
            //输出change(a) 值为10
        }
        // int方法 返回值为a  
        public static int change(int a){
        a = 10;
        return a;
    }
    
    
    //引用传递: 对象,本质还是值传递
    
    public class text {
        public static void main(String[] args) {
            Person person = new Person();
    
            change(person);
            System.out.println(person.name);
            }
            public static void change(Person person){
          //person是一个对象;指向的-->Person(类)的 String name:类变量 
            //对象的属性可以赋值(改变)
               person.name ="莫莫虎";
            }
    
    
        }
    class Person{//Person 类
        String name;//null
    }
    

类与对象的关系

  • 类是一种抽象数据类型 对一类事物整体描述/定义 不代表某个具体事物
  • 对象是抽象概念的具体实例

//一个项目应该只存一个main方法

创建与初始化对象

  • 使用new关键字创建对象(new之后类的变量才加载到堆中)

构造器 构造方法

  1. 必须和类的名字相同

  2. 没有返回值 不能写void

public class Person {
    String name;
    //无参构造
    //实例化初始值
    //1.使用new关键字,本质实在调用构造器
    //2.用来初始化值
    public Person(){

    }
    //有参构造:一旦定义了有参构造,无参就必须显示定义
    public Person(String name){
        this.name=name;
    }
}

//alt+insert快捷键 自动生成构造器

创建对象内存分析

image-20210529220031498

初略图

要new一个类,要先加载他的类 才能创建出来(new创建对象之后类的变量才加载到堆中)

简单小结类与对象

  1. 类与对象

    类是一个模板:抽象,对象是一个具体的实例

  2. 方法

    定义,调用!

  3. 对应的引用

    引用类型: 基本类型(8)

    对象是通过引用来操作的: 栈 --(指向)–> 堆

  4. 属性: 字段Field 成员变量

    默认初始化:

    数字: 0 0.0

    char : u0000

    Boolean : false

    引用 : null

    修饰符 属性类型 属性名 = 属性值!

  5. 对象的创建和使用

    • 必须使用new 关键字创造对象,构造器 Person k = new Person ();(使用new关键字,本质实在调用构造器)
    • 对象的属性 k.name
    • 对象的方法 k.sleep();
  6. 类:

    静态的属性 属性

    动态的行为 方法

​ 封装 继承 多态

封装

// 封装为属性(属性私有) 方法用不了多少封装

//类  privat :私有
public class Person {
    //属性私有
   private String name;
   private int id;
   private char sex;

   //提供一些操作属性的方法
    //提供一些public的 get  set方法
    //get 获得这个数据
    public String getName(){
        return this.name;
    }

    //set 给这个数据设置值
    public void setName(String name){
        this.name = name;
    }

}


//alt + insert
  1. 提高程序的安全性,保护数据(信息隐藏)
  2. 隐藏代码的实现细节
  3. 统一接口 get/set
  4. 系统可维护型增加

继承

  • 继承的本质是对某一批的抽象

  • extends的意思是“扩展”。子类是父类的扩展。private(私有)修饰的东西 子类无法继承 想要继承方法的话,一般是public声明方法

  • java中只有单继承,没有多继承。

  • 继承是类和类之间的一种关系。 类与类之间的关系还有依赖,组合,聚合等

  • object类

    • java中, 所有类,默认直接或间接继承object类
  • super父类对象 - this本身对象

    public void test(String name){
          System.out.printIn(name);//调用方法时传入的值
          System.out.printIn(this.name);//本类中设置的值
          System.out.printIn(super.name);//父类中设置的值
    }
    
    public Student (){
    //	super();  必须放在代码第一行//隐藏代码:默认调用了父类的无参构造
        super();
    	System.out.printIn("Student无参执行了");
    }
    //父类有参构造 子类要调用有参构造
    
    //ctrl+h  显示类的继承关系图
    

//super注意点

  1. super调用父类构造方法,必须在构造方法内的第一个
  2. super 必须只能在子类的方法或构造方法中
  3. super和this不能同时调用构造方法

构造方法

​ this();本类的构造

​ super();父类的构造

/ctrl + F 查找

  • 方法重写 非静态的public方法 才能重写

  • @override // 注解:有功能的注解

    //静态的方法和非静态的方法区别很大
      //静态方法 : 对象的方法的调用只和左边,定义的数据类型(数据对象A,B)有关
    
    public class B {
        public static void test(){
            System.out.println("B=>test()");
        }
    }
    public class A extends B{
        public static void test(){
            System.out.println("A=>test()");
        }
    }
    public class Person {
        public static void main(String[] args) {
            //对象的方法的调用只和左边,定义的数据类型(数据对象A,B)有关
            A a = new A();
            a.test();//A=>test()   为A类中的方法
            B b = new A(); 
            b.test();//B=>test()  为B类中的方法
        }
    }
    
    
    //非静态  : 重写
    public class B {
        public  void test(){
            System.out.println("B=>test()");
        }
    }
    public class A extends B{
        //Override 重写
        @Override //注解 : 有功能的注释
        public  void test(){
            System.out.println("A=>test()");
        }
    }
    public class Person {
        public static void main(String[] args) {
           
            A a = new A();
            a.test();//A=>test()
            B b = new A();
            b.test();//A=>test()
        }
    }
    

重写:需要有继承关系 子类重写父类的方法

  1. 方法名相同
  2. 参数列表相同
  3. 修饰符:范围可以扩大: public>protected>default>private
  4. 抛出的异常:范围,可以缩小 , 不能扩大

alt + insert : override;

//ctrl + H 继承树 查看继承的关系(idea中)

多态

  1. 有继承关系

  2. 重写父类方法

  3. 父类引用指向子类对象

//父类Person  子类Student
//一个对象的实际类型是确定的
//可以指向 的引用类型就不确定了: 父类的引用指向子类

	//Student 子类型 能调用的方法都是自己的或在继承父类的
	Student s1 = new Student();
        
    //Person 父类型, 可以指向子类 但是不能调用子类*独有*的方法 只能调用子类重写的方法(父类的引用指向了子类)
    Person s1 = new Student();//对象 能执行那些方法 主要看左边
        //子类重写了父类的方法,父类会执行子类的方法  没有重写,会调用父类方法
    Object s1 = new Student();

多态注意事项

  1. 多态是方法的多态,属性没有多态
  2. 父类和子类, 有联系 类型转换异常 (ClassCastException)
  3. 存在条件: 继承关系 方法需要重写 ,父类引用指向子类对象 (引用)Father f1 = new Son();(对象)(对象 能执行那些方法 主要看左边)

//没有重写 不是多态

  1. static 方法 属于类 , 它不属于实例

  2. final 常量;

  3. private方法;

  • instanceof (类型转换 ) 引用类型,判断一个对象是什么类型 是否有一条线的纽带

    System.out.printIn(Object instanceof Student); // true
    System.out.printIn(Object instanceof Person);// true
    System.out.printIn(Object instanceof Object);// true
    
    
    System.out.printIn(Person instanceof Student); // true
    System.out.printIn(Person instanceof Person);// true
    System.out.printIn(Person instanceof Object);// true
    
    
    //System.out.printIn(X instanceof Y);是否为true 取决与是否存在父子关系 是否有一条线的纽带
    
    
    Person obj = new Student();
        //转换obj类型   父类转子类
        ((Student)obj).方法名();
        
        Student student = (Student)obj;
        student.方法名();
    	//子类转父类   可能丢失字自己的本来的一些方法
    	Student student = new Student();
            student.方法名();
            Person person =student;
    
       1. 父类引用指向子类的对象
       2. 子类转换为父类,向上转型
       3. 父类转换为子类,向下转型 :  强制转型
       4. 方便方法的调用 ,减少重复代码  简洁
            
      抽象: 抽象的思想
            
            封装  继承  多态           抽象类  接口
    

static

静态的变量 (多线程)

public class Person {
    //2: 赋初始值等
    {//对象创建  先走匿名代码块
        System.out.println("匿名代码块");
    }
    static {//1:只执行一次
        System.out.println("静态代码块");
    }
    public Person(){//3:再走构造方法
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Person p1= new Person();
        System.out.println("=====");
        Person p2=new Person();
    }

}
//运行结果:
            静态代码块
            匿名代码块
            构造方法
            =====
            匿名代码块
            构造方法




image-20210530115629994

  • 静态导入包

    import static java.lang.Math.random;

    //静态导入包
    import static java.lang.Math.random;
    import static java.lang.Math.PI;
    
    public class text {
    
        public static void main(String[] args) {
            System.out.println(random());//返回一个随机数
            System.out.println(PI);//PI值
            }
    
        }
    
    

final

一个被final定义了 就不能再被继承了 没有子类了(断子绝孙了)

抽象类(可以被继承 只能单继承)

abstract 修饰方法或类, 抽象类可以没有抽象方法, 有抽象方法的一定是抽象类

  • abstract 抽象类 : 是一个类 extends : 只能单继承 ~ 接口可以多实现

    //抽象类的所有方法,继承了它的子类 , 必须要实现它的方法 除非它也是抽象类

  • public abstract class text {
        
        }
    
  • abstract 抽象方法 只有方法名字 没有方法的实现

    public abstract void thing ();
    

//1. 不能new这个抽象类,只能靠子类去实现它; (约束!)

// 2. 抽象类里面可以写普通方法 抽象方法必须在抽象类中

接口

  • 普通类:只有具体实现
  • 抽象类:具体实现个规范(抽象方法)都有
  • 接口:只有规范! 约束和实现分离: 面向接口编程
//interface  定义的关键字 ,   接口都需要有实现类
public interface UserService {
    //接口中的所有定义的方法其实都是抽象的public abstract(默认)
    public void run();
    void run(int n);
    void sum();

    //静态的常量(默认为)public static final  很少在接口定义常量  属性默认定义的常量
    public static final int AGE = 99;//在实现类中可以直接使用

}



//抽象类 : extends
// 类 可以实现接口 implements 接口
//实现了接口的类,就需要重写接口中的方法
//多继承  利用接口实现多继承
public class UserServiceImp  implements UserService{
    @Override
    public void run() {

    }

    @Override
    public void run(int n) {

    }

    @Override
    public void sum() {

    }
}

作用:

  1. 约束
  2. 定义一些方法,让不同人实现
  3. 方法都是public abstract
  4. 都为静态常量public static final
  5. 接口不能被实例化 , 接口中没有构造方法
  6. implements 可以实现多个接口
  7. 必须重写接口中的所有方法

内部类

  • 内部类就是在一个类的内部再定义一个类

    public class Outer {
        private int id=10;
        public  void  out(){
            System.out.println("这是一个外部类的方法");
        }
        public class Inner{
            public  void in(){
                System.out.println("这是一个内部类的方法");
            }
            //获得外部类的私有属性
            public  void getID(){
                System.out.println(id);
            }
        }
    }
    
    
    public class Application {
        public static void main(String[] args) {
            Outer outer = new Outer();
            //通过这个外部类来实例化内部类
            Outer.Inner inner = outer.new Inner();
            inner.getID();//10
        }
    }
    
    
  • 成员内部类

    public class

  • 静态内部类

    public static class

    public class Outer {
        private int id=10;
        public  void  out(){
            System.out.println("这是一个外部类的方法");
        }
        public static class Inner{
            public  void in(){
                System.out.println("这是一个内部类的方法");
            }
            //获得外部类的私有属性
            public  void getID(){
                System.out.println(id);// id 就拿不到了
            }
        }java
    }
    
    
  • 局部内部类

    方法内部class 类

    public class Application {
        // 局部内部类
        public void method(){
            class Inner{
                public  void in(){
                    
                }
            }
        }
    }
    
  • 匿名内部类

public class Application {
    public static void main(String[] args) {
        //没有名字初始化类, 不用讲实例保存到变量中
        new Apple().eat();

        UserService userService = new UserService() {
            @Override
            public void hello() {

            }
        };
    }
}
class Apple{
    public void eat(){
        System.out.println("1");
    }
}

interface UserService{
    void hello();
}
public class Application {

}
//一个java类中可以有多个class类,但是只能有一个public class
class A{
    public static void main(String[] args) {

    }
}

多线程 lamda表达式

异常

  • java把异常当作对象来处理 , 并定义了一个基类java.lang.Throwable作为所有异常和错误的超类
  • java API定义了许多异常类,这些异常类分为两大类 , 错误Error和异常Exception

image-20210601163617904

Exception分支中有一个重要的子类RuntimeException(运行时异常)

异常处理机制

  • 抛出异常
  • 捕获异常
  • 异常处理五个关键字
    • try,catch,finally,throw,throws

finally始终会运行 , 可以不要finally, 假设IO~Scanner ,资源, 需要关闭! 处理善后工作

catch(Throwable e) 可以捕获异常和错误 可以多个catch范围大的写在后边

public static void main(String[] args) {
    int a=1;
    int  b=0;
    try{//try控制区域  可能抛出异常的语句
        System.out.println(a/b);

    }catch (Error e){//假设捕获多个异常:   从小到大依次
        System.out.println("Error");
    }
    catch (Exception e){//catch(范围大的写在后边)
        System.out.println("Exception");
    }
    catch(Throwable e){//catch(想要捕获的异常类型  最高的为Throwable)  捕获异常
        System.out.println("Throwable");
    }finally {//处理善后工作  无论出不出异常 都会执行
        System.out.println("finally");
    }
    //finally  可以不要finally , 假设IO,资源,关闭!

}

//ctrl +alt +T  快捷键(选中代码)  可以快捷的生成异常语句包裹被选中的代码



  public static void main(String[] args) {
        try {//异常捕获以后 程序有异常也会继续执行
            new text().test(1,0);
        } catch (ArithmeticException e) {
            e.printStackTrace();//打印错误的栈信息
        }
    }
    //假如这个方法中,处理不了这个异常,方法上抛出异常throws
    public void test(int a , int b) throws  ArithmeticException{
        if(b==0){// throw  throws
            throw new ArithmeticException();//throws主动抛出异常   一般在方法中使用
        }
    }

  int b=0;

    public void eat(int b) throws ArithmeticException{// 假如方法处理不了异常  方法上抛出异常 但没有进行处理
            if (b==0);{
                throw  new ArithmeticException();//主动抛出异常  有异常的话不会执行方法会抛出异常 (一般在方法中抛出异常)
            }
        }

idea 选中代码ctrl alt+T :可以快速生成代码块包裹选择的代码(if,try…)

     System.exit(0);
     System.exit(1);
//让程序执行或结束

自定义异常

  1. 创建自定义异常类**(需要继承Exception类)**
  2. 在方法中通过throw关键字抛出异常对象
  3. 可以用try-catch捕获异常并处理,或者在方法声明处通过throws抛出异常给方法调用者
  4. 在异常方法调用者中捕获并处理异常
//自定义的异常类   继承Exception
public class MyException  extends Exception{
    //传递数字>10 时抛异常
    private  int detail;
    public MyException(int a){
        this.detail = a;
    }
    //toString: 异常的打印信息
    @Override
    public  String toString(){
        return "MyException{" + detail + '}';
    }

}

image-20210601172450073

e 为定义异常时toString里面的内容

没有异常会输出ok 有异常不会输出 ok

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值