欢迎光临散文网 会员登陆 & 注册

【狂神说Java】Java零基础学习视频通俗易懂

2023-08-07 11:33 作者:安艺伦也桑  | 我要投稿

学习路线


写博客的重要性

DOS:Disk Operation System


alt+f4 关闭窗口

shift+del 永久删除

运行窗口下新建任务:explorer //显示桌面


shitf+右键 打开powershell

JavaSE服务端

Java EE企业端

Java ME移动端

java优势:

简单性、面向对象、可移植、高性能、分布式、动态性、多线程、安全性、健壮性


学习Java的特性,主动爱上Java的魅力

Write once,Run anywhere


JDK、JRE、JVM的关系

编译javac xx.java

运行Java xx

文件名和类名必须保持一致



Java程序运行机制

编译型:一次编译,随时运行

解释型:每次从头运行

idea中

#生成一个main方法 psvm

#打印 sout


书写注释是一个非常好的习惯

三种注释:

  • 单行注释 //
  • 多行注释 /* */
  • 多行注释/** */
  • 文档注释

标识符:类名、变量名和方法名都被称为标识符

关键字


标识符:数字、字母、下划线组成,其中数字不能作为开头,不能使用关键字作为变量名和方法名,标识符大小写敏感


Java是一种强类型语言,先定义后使用

数据类型:基本类型(byte、short、int、long、float、double、Boolean、char)、引用类型(接口、类、数组)

float后面的参数要加F,因为浮点数默认是double

long后面的参数要加L


浮点数尽量避免比较,使用Big Decimal数学工具类比较

所有字符本质都是数字

Unicode编码给每个字符一个编号

#转义字符 \u

#换行 \n

#制表符 \t


Boolean默认为true

多字节强制转换成低字节会照成内存溢出

#(类型)变量名

强制转换:高->低 //可能会照成损失精度或内存溢出,比如int转char就不会错误

自动转换:低->高 //自动填充

强制类型转换可以在定义时强转,也可以在输出时强转

shift+F10自动运行

数字可以这样表示1000_0000_000


三种变量:

常量:final double PI=3.14;

# 运算符


CTRL+D复制当前行到下一行

【cast:V.转换】

运算符

++ 自增

--自减


a++ //a先赋值再自增1

++a //a先自增1再赋值

#幂函数计算 double pow =Math.pow(2,3) //8,很多运算会使用一些工具类来运算

#输出字符串加结果:System.out.println("a&&b的结果:"+(a&&b));


短路运算

异或:相同为0,不同为1


面试题:2^4怎么算最快

答:位运算往左移2位

位运算

a+=b //等价于a=a+b


面试题:int+String和String+int的不同


三元运算符

x?a:b X为true返回a,否则返回b


包机制

公司利用域名倒置作为包名,如com.baidu.www

#定义包 package 包名

#导包import package

import java.util.Date //导入Date包

【param:参数】

/**+Enter //输出参数

Java Doc参数信息

#生成文件 javadoc -encoding UTF-8 -charset UTF-8 xx.java


# java流程控制

Scanner对象

#获取用户输入:java.util.Scanner

【util】全称utility,一种实用的包


Scanner s=new Scanner(System.in);

通过next()和nextLine()方法获取输入的字符串,读取前用hasNext()和hasNextLine判断是否还有输入的数据

区别:


Summary:


Ctrl+左键,点击类名查看它的方法


# 顺序结构

#选择结果

#if多选择结构:

规则:

#if嵌套结构

if(){ if() }else


#switch case结构

switch(条件){

case'A':

break; //可选,如果满足A则不输出后面的内容

case‘B’:

default: //可选,如果都不满足则输出此条件下的内容

}

//case后可跟字符串,Jdk7新特性


#idea反编译:把class文件和放在源Java所对应的工程文件夹下,在idea下打开class文件


#while循环

  • 只要布尔表达式为true,循环会一直执行下去
  • 大部分情况需要让循环停止下来
  • 小部分情况需要一直执行,比如服务器的请求监听

#do...while:至少会执行一次

while和do...while的区别:

  • do...while至少会执行一次
  • while先判断后执行,do...while先执行后判断
  • do...while总是保证循环体至少执行一次


#for循环

关于for:

1、最先执行初始化步骤,可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句

2、中间是布尔表达式

3、执行一次循环,更新循环控制变量

4、再次检查布尔表达式,循环执行上面的过程

#简化,如for(int i; i<100;i++),简化后for( ;i<100;i++); //简化后要提前声明并赋值给i

#死循环for( ; ; ){ }


#增强for循环:用于数组或集合

#break用于强行退出循环,不执行循环剩余的语句(break也可在switch语句中使用)

#continue语句用在循环体中,跳过尚未执行的语句,并进行下一次是否执行循环的判定


#两个作业:九九乘法表和打印正三角形(5行)


# 学会打断点:能够知道程序的运行机制

步过:一行一行的往下走,不会进入到其他方法的内部。

步入:如果当前行有方法执行,可以进入方法的内部(不会进入官方定义的方法,仅能进入自定义的方法)。

强制步入:如果当前行有方法执行,可以进入方法的内部(可以进入官方定义的方法,这在查看底层源码时非常有用)。

智能步入:如果当前行有多个方法同时被执行,IDEA 将会询问你要进入哪个方法。

步出:从步入的方法内执行完该方法,然后退出到方法调用处。

重置 Frame:恢复到上一个断点的开始处。

————————————————


#方法

如:System.out.println() //System是类,out是对象,println是方法 ,即调用System类下out对象的一个方法println


形参:用来定义作用的

实参:实际调用传递给他的参数


Java是值传递

#方法的重载:在一个类中,有相同的函数名称,但形参不同的函数

规则:

  • 方法名称必须相同
  • 参数列表必须不同(个数不同、或类型不同等)



# 用命令行给方法传递参数

在src目录下运行,同时后面跟上参数


# 可变参数

指定参数类型后加一个省略号(...)

一个方法只能指定一个可变参数,它必须是方法的最后一个参数,如何普通的参数必须在它之前申明。

public static void main(String args[]){ int 1,2,3,4}

public static void a(int...i){ }


#递归结构:

  • 递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
  • 递归体:什么时候调用自身方法。

边界条件:递归有一个尽头边界

前阶段:未达到边界条件前的阶段

返回阶段:n*(n-1)

原理:栈机制

小点的数可以用栈机制可以快速解决问题,大量数据不要使用栈机制,这样会照成内存溢出

#写一个计算器

思路:

  • 写4个方法:加减乘除
  • 利用循环+switch进行用户交互
  • 传递需要操作的两个数
  • 输出结果

[链接](https://blog.csdn.net/EasonYoung1/article/details/131495075?spm=1001.2014.3001.5501)



# 数组

  • 数组声明:int[ ] nums;
  • 使用new创建数组,分配空间:

nums=new int[3];//存放3个int类型的数字,这里的3是空间大小,不是数组下标

  • 声明同时创建int[ ] nums=new int[3]
  • 给数组元素赋值

nums[0]=1;

nums[1]=3;

nums[2]=5;

nums[3]=7;

  • 数组长度 nums.length

## 数组特点:

1、长度不可变

2、元素必须相同

3、元素可以是基本类型和引用类型

4、数组对象属于引用类型,数组可看作对象,每个元素相当于成员变量

数组本身就是对象,Java中对象是在堆中的,无论数组保存原始类型还是其他对象类型,数组本身是在堆中的。

#内存分析(堆、栈和方法区)

声明数组放入栈

创建数组放入堆,在堆中开辟一块区域

## 三种初始化

  • 静态初始化

int[ ] a={1,3,5};//创建直接赋值

  • 动态初始化

int[ ] a=new int[3];//创建并分配3个空间

  • 默认初始化

数组是引用类型,其元素相当于类的实例变量,一旦数组被分配空间,数组每个元素被按照实例变量同样的方式被隐式初始化


## 数组使用

  • For-Each循环
  • 数组作方法入参
  • 数组作返回值

## 二维数组

在一维数组的基础上,每一个元素都是一个数组

int a[ ][ ]=new int [1][2];//可看作一个两行三列的数组


int[ ] [ ] array={{1,2},{3,2},{2,0}};//看作3行两列的数组

#Arrays类

  • 先导包import java.util.Arrays;
  • 再使用Arrays.toString(类型【】 数组名);

Arrays.fill(int[] 数组名)//填充数组


# 稀疏数组

当一个数组中大部分元素是0,或为同一值的数组时,可以使用稀疏数组来保存该数组

  • 处理方式:
  • 记录几行几列,有多少不同值
  • 把不同值元素和行列及值记录在一个小规模数组中,从而缩小程序的规模

#打印一个稀疏数组


#面向对象

return:结束方法,返回一个结果

break:跳出当前循环

属性+方法就是一个类

面向过程:步骤清晰简单,适合处理简单问题

面向对象:物以类聚,分类思维模式,适合处理复杂问题

#面向对象的本质

以类的方式组织代码,以对像的组织(封装)数据


三大特性:封装、继承、多态


类分静态类和非静态类,非静态类要实例化才能使用

public class Student{

String name;

}

public static void main{

Student student=new Student(); //实例化

student.name="ian";//赋值

sout+student.name //(伪代码)输出

}


## 创建与初始化对象

使用new关键字创建对象:

  • 使用new关键字创建,除了分配内存空间,还会给创建好的对象进行默认的初始化,以及对类中构造器的调用。
  • 类中的构造器也称为构造方法,是在进行创建对象时必须要调用的,特点如下

1、必须和类名相同

2、必须没有返回类型,不能写void

* 作用:
* 1、new本质在调用构造方法
* 2、初始化对象的值
* 注意:定义有参构造后,如果使用无参构造,可以定义一个无参构造
*
* 创建构造器快捷键:ALT+Insect
* this.对象 //this指当前类


#内存分析:



小结:

1、类与对象

类是一个模板:抽象

对象是一个具体实例

2、方法:定义与调用

3、对象的引用

引用类型:基本类型

对象是提高引用来操作的:栈->堆

4、属性:字段field 成员变量

默认初始化:

数字 0 0.0

char: u0000

boolean: false

引用:null


5、对象的创建与使用

必须使用new创建对象,建立构造器

对象的属性 ian.name

对象的方法 ian.fx()


6、类

静态的属性 属性

动态的行为 方法


# 封装:

高内聚、低耦合

高内聚:类的内部操作细节自己完成,不允许外部干涉

低耦合:仅暴露少量的方法给外部使用

属性私有,get/set

set中可以对接收的数据判断是否合法,进行操作


Alt+Insect 快捷生成


意义:

1、提高程序的安全性,保护数据

2、隐藏代码实现的细节

3、统一接口

4、系统的可维护性增加了


# 继承

子类在类定义时:

public class Person(){} //父类

public class extends Person(){} //子类


Ctrl+H //查看层次结构

所有的类,都直接或间接继承object类


知识点:

  • java中只有单继承,没有多继承。一个儿子只有一个爸爸,一个爸爸可以有多个儿子
  • 继承是类和类之间的一种关系。除此之外,类和类之间还有依赖、组合、聚合等。


object类

super

方法重写


# super

注意点:

1、super调用父类的构造方法,必须在构造方法的第一个

2、super必须只能在子类的方法或构造方法中!

3、super和this不能同时调用方法!


对比this:

1、代表的对象不同:

  • this:本身调用这个对象
  • super代表父类对象的引用

2、前提:

  • this:没有继承也可以使用
  • super:只能在继承条件下才可以使用

3、构造方法

  • this():本类的构造
  • super():父类的构造


方法的重写:重写的方法的重写,与属性无关

//静态方法的调用只和左边,定义的数据类型有关
//非静态的方法能重写


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

1、方法名必须相同

2、参数列表必须相同

3、修饰符:范围可以扩大,不能缩小:

private<Default<protected<public

4、抛出的异常:范围,可以缩小,但不能扩大:

ClassNotFoundException->Exception(大)

5、子类的方法和父类要一致,方法体不同。


重写的意义:父类的功能,子类不一定需要,或不一定满足!

Alt+O;override


多态:

同一个方法可以根据发送对象的不同而采取多种不同的行为方式

一个对象的实际类型的确定的,但可以指向对象的引用类型有很多(父类,有关系的类)


多态存在的条件

1、有继承关系

2、子类重写父类方法

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


注意:多态是方法的多态,属性没有多态性

instanceof 判断两个对象是否有联系

(类型转换)引用类型

eg: ((Student) s2). fx();


抽象类:abstract

1、不能new这个抽象类,只能在子类去实现它:约束!

2、抽象类可以写普通方法

3、抽象方法必须在抽象类中

4、new,存在构造器


# 接口

普通类:只有具体实现

抽象类:具体实现和规范(抽象方法)都有

接口:只有规范!自己无法写方法~专业的约束!约束和实现分离:面向接口编程

  • 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是...则必须能...”的思想
  • 接口的本质是契约
  • oo的精髓,是对对象的抽象

接口关键字:interface

实现类关键字:implement


内部类

内部类就是在一个类的内部再定义一个类,如,A类定义一个B类,那么B类相对于A类来说称为内部类,A类相对于B类来说就是外部类

1、成员内部类

2、静态内部类

3、局部内部类

4、匿名内部类


# 异常



异常体系结构:

Error:

Error类对象由Java虚拟机生成并抛出,大多数错误与代码执行者所执行的操作无关

Exception:

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



Alt+Enter 处理波浪线









【狂神说Java】Java零基础学习视频通俗易懂的评论 (共 条)

分享到微博请遵守国家法律