Java开发基础(一)
提示:观看尚硅谷视频所做的笔记
入门准备总结
- 学习:按照721来安排,7是在工作中学习,2是向他人学习,1是自学。
- 看视频双核处理,边听讲,边思考,边做笔记。
- 第一层:听得懂,第二层:练得熟;三分看,七分练。至少两边,最好三遍,第一遍看着写,第二遍自己尝试写,第三遍纯自己写(不会的不看老师的,自己查,自己debug)。
- 资料在微信公众号上。
尚硅谷链接
Java随笔
day1
- Java的跨平台特性依赖于在不同系统中安装的JVM(java虚拟机)。Java技术体系平台分为:Java ee 、Java se、 Java me、Java card。 一般老一辈人叫j2se、j2ee之类的。
- Java的两种核心机制:JAVA虚拟机和垃圾回收机制。相当于一个保姆一样,回收无用内存。但是也还是会出现内存泄漏和内存溢出的问题。
- JDK和JRE。JDK是Java开发工具,JRE是Java运行环境。JDK包含JRE,JRE包含JVM。如果只是需要运行Java程序,只需要安装JRE就可以了。不同的系统装不同的JVM。
- Java程序运行过程,首先是.java文件(源文件),然后经过javac.exe编译后,成为.class文件(字节码文件),最后通过java.exe运行.class文件,得到结果。字节码文件名,对应的是类名。
- cmd里面用Java命令运行字节码文件的时候,不用加.class后缀。注意哦,Java不是python了,语句后面需要加分号。
- windows 路径是不区分大小写的,Java语言是区分大小写的。
- java 有三种注释方式,单行、多行和文档注释。其中,单行和多行注释不参与编译,即编译后生成的.class的字节码文件中不包含单行和多行注释的内容。注意多行注释不可以嵌套。
- 文档注释,注释的内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。 /** @author @version */ 可以导出类似于程序说明文档的东西(网页)。
- 一个源文件中可以申明多个类,但是只能由一个类是public的。而且要求声明为public的类的类名,必须与源文件名相同。程序的入口时main函数。格式是固定的。
- 编译以后会生成多个字节码文件,有几个类就有几个字节码文件字节码文件名与Java文件名类名相同。
day2
- 标识符(变量名)不能包含空格,数字不能开头,可以由下划线和$符。
- Java中的名称命名规范: ----> 规范不遵守,也可以通过,但是建议遵守
包名:多单词组成时所有字母都小写: xxxyyzzz
类名、接口名:多单词组成时,所有单词的首字母大写: XxxYyyZzz(驼峰)
变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写: xxxYyyZzz(小驼峰)
常量名:所有字母都大写。多单词时每个单词用下划线连接: XXX_YYY_ ZZZ - 命名尽可能间名知意;java采用unicode字符集,因此可以使用汉字申明,但是不建议。
- java 是一种强类型的语言,即每个变量必须指定类型。变量必须先申明(定义加赋值),再使用;变量都有作用域,出了作用域,就失效;同一个作用域内,不可以声明两个同名变量
- 数据类型分为基本数据类型和引用数据类型。基本数据类型就是数值、字符、布尔类型之类的,引用数据类型包括三类(类(字符串)、接口(interface)、数组)。
- 声明long类型变量,必须以 l 或者 L 结尾。float(4字节),double(8字节),虽然空间小,但是表示范围很大,只是精度不高。定义float类型的变量后面需要加F或者f。char(1字符=2字节),只能写一个字符,可以是unicode字符,还可以是转义字符比如\n(换行),还可以是unicode编码,比如\u0043,表示C。
- 字符集发展历程,ascii --> unicode --> utf-8,其中utf-8是unicode字符集的具体实现应用。
- 基本数据类型的运算规则:自动类型提升和强制类型转换。
byte,char,short三种变量类型做运算时,结果为int型。
long数字,末尾不加l,默认为int类型传给long类型。long a = 1288。但是float必须加f,因为小数默认为double,直接赋值不会自动类型提升,会报错。
强制类型转换,将128赋给byte类型后,会有精度损失,但是存的不是127,而是-128。这里涉及到二进制的计算。 - String类型可以不放任何字符,但是char类型不行。String类型可以和其他8种基本数据类型做运算,但是只能是连接运算(+)。
注意String类型不具有自动类型提升机制,也不能强制转换。只能作连接运算。 - 关于进制,二进制,以0b或者0B开头,八进制,以0(零)开头,十六进制0x或者0X开头。
- 二进制,原码、补码、反码,正数的三个码都相同,负数的补码是其反码+1。
- 十进制转二进制:除2取余的逆。
- 计算机底层都是用补码存储数据。为什么用补码,为了使符号位能够参与运算,并且使减法能够参与运算。补码是类似于通过找规律的方法得到的。
day3
- 自增不会改变本身变量的数据类型
- 加等于也不会改变数据类型,注意这个用惯了python,很容易就出错,编译不通过
- 比较运算符,instanceof,也是一个比较运算符
- 位运算符,操作的都是整型的数据,<<左移一位,相当于乘一个2。>>右移一位,就是除以2。还有无符号右移>>>,就是只补0,还有&,|,~,^。可以用 ^ 运算符来交换运算数据。
- 取余运算,结果的符号与被模数的符号相同。+用作连接符,只适用于String与其他变量类型。
- == 和 !=比较运算符,不仅可以用在数值类型之间,还可以用在其他的引用类型之间。
- 位运算符都是操作的整型数据
- if else 和三元运算符,三元运算符效率更高,在可以用三元的时候用三元更好。
- 代码在追求效率的同时,不要忘记可读性。
day4
- scanner用法:
如何从键盘获取不同类型的变量:需要使用Scanner类
具体实现步骤:
1.导包: import java. util. Scanner;
2.Scanner的实例化:Scanner scan = new Scanner(System.in);
3.调用Scanner类的相关方法(next() / nextXxx()) ,来获取指定类型的变量。 - 带标签的break和continue。在for循环前面加上lable。
- 注意Java和C在二维数组上的不同。
- 注意区分定义、声明、调用和赋值的关系。
- 类的属性有初始化值、局部变量没有初始化值,即在调用前一定要显式赋值。
- 非static的属性加载到堆,局部变量加载到栈。
- void 也可以用return ,只是不能加值,表示方法到此结束。
- 匿名对象的使用。创建了一个对象,但是没有显式地赋给一个变量名,即为匿名对象。
Day5
- 方法的重载:同一个类中,允许同名的方法存在,形参不同即可(参数个数或者参数类型不同,顺序不同也算)。跟别的什么,比如方法体、返回类型、权限修饰符等无关。
- 可变个数形参的方法: 数据类型 … 变量名 也可以重载,但是得注意相同类型的数组,JDK5.0之前用的是数组来表示可变个数的形参。 且可变个数形参只能声明在末尾,且最多只能声明一个可变形参。
- 实参和形参的区分。Java的值传递机制:参数是基本数据类型,实参赋给形参的是存储的数据值。如果是引用数据类型传递的是地址。
- 方法递归,实际上包含了一种隐式的循环,一定要注意递归边界。
- 封装性的体现,将类的属性、方法私有化,用get和set方法来获取和设置属性值。
- java四种访问权限修饰符的范围,与c++很大不同。缺省的话,范围是类内部和一个包内。分别是private、缺省、protected、public这四个类别,在类内部、同一个包、不同包的子类、同一个工程这四个范围逐级递增。注意:类的修饰,只能用缺省和public来修饰。
- 通常是一个源文件一个类。
- 构造器的作用:创建对象,初始化对象属性。 一个类中可以定义多个构造器,彼此构成重载,一旦定义了类的构造器之后,系统不再提供默认构造器。
- UML类图,要会看包、类、属性、方法
- this 关键字的使用:
(1)this 可以用来修饰方法和属性还有构造器。this 修饰属性和方法:可以理解为当前对象,在类的方法中,我们可以使用"this.属性"或"this.方法"的方式,调用当前对象属性或方法。但是,通常情况下,我们都选择省略"this."。特殊情况下,如果方法的形参和类的属性同名时,我们必须显式的使用"this .变量"的方式,表明此变量是属性,而非形参。构造器和方法类似。
(2)this调用构造器
①我们在类的构造器中,可以显式的使用"this (形参列表) "方式,调用本类中指定的其他构造器
②构造器中不能通过"this (形参列表) "方式调用自己
③如果一个类中有n个构造器,则最多有n - 1构造器中使用了"this (形参列表)”
④规定:“this (形参列表)”必须声明在当前构造器的首行
⑤构造器内部,最多只能声明一-个"this (形参列表)”,用来调用其他的构造器 - package关键字,为了更好地实现项目中类的管理,使用package声明类或者接口所属的包,声明在源文件的首行。包名都是小写的,用点来连接。每“.”一次就代表一次文件目录。同一个包下不能定义同名的接口或者类。
- MVC设计模式。
- import static : 导入指定类或者接口中的静态结构:属性或方法
- 继承性:
(1)继承性的格式:class A extends B{ } A就是子类,B就是父类
(2)体现:一旦子类A继承父类B以后,子类A中就获取了父类B中声明的所有的属性和方法。
特别的,父类中声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类中私有的结构。
只是因为封装性的影响,使得子类不能直接调用父类的结构而已。
(3)Java 是单继承,只能有一个父类,c++ 是多继承,可以有多个父类。可以有多层继承。直接父类和间接父类。
(4)所有类都直接或间接继承于Object类。 - 方法的重写(override/overwrite)
(1)重写:子类继承父类之后,可以对父类中同名同参数的方法进行覆盖操作。主要用于继承后,父类方法不适用于子类。
(2)重写之后,调用时,用的是重写的方法。
(3)重写时,子类方法的权限修饰符不小于父类被重写的权限修饰符。特殊情况:子类不能重写父类中声明为private权限的方法(不是说写了会报错,而是private太小了,子类看不见,写了不算重写。可以重新实现父类的该方法,不会有冲突,但是你重新实现的方法,不叫重写也不叫重载,是一个该子类新增的方法,和子类的一般扩展方法一样。理论 Java中使用static、final、private修饰的方法能被子类继承,但不会重写。此外,属性也能继承,但不能重写。)
(4)返回值类型:
父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类
父类被重写的方法的返回值类型是基本数据类型(比如: double), 则子类重写的方法的返回值类型必须是相同数据类型(double)
(5)子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(具体放到异常处理时候讲)
注意:
(1)实际开发中,一般直接复制方法头就可以了,不用记住太细。复制的,肯定不会错。或者用快捷键。
(2)子类和父类中的同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写)。 - super 关键字的使用:
(1) super 理解为父类的,跟this比较类似。可以用来调用属性、方法、构造器。
(2) 可以在子类的方法和构造器中,用super.属性或者super.方法,来调用父类中声明的属性和方法。通常是省略的,只有当子类和父类中定义了同名的属性时,必须显示用super。当子类重写了父类的方法时,想调用父类中的方法,就需要加上super. 。
(3) super调用构造器,可以使用super(形参列表)的方式,调用父类中声明的指定的构造器。与this类似,也需要写在首行。因此this和super只能二选一。在构造器的首行,没有显式地调用this和super,则默认调用super()。因此,当定义非空的构造器的时候,最好顺便写上空构造器。否则后面子类继承的时候,继承空构造器容易出错。
(4)在类的多个构造器中,至少有一个类的构造器中使用了super(形参列表),调用父类的构造器。创建对象的过程中,会不断地调用父类地构造器,但是自始自终只创建了一个对象。 - 多态性:
(1) 对象地多态性:父类的引用指向子类的对象。Person p1 = new man();当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法(虚拟方法的调用)。不能调用父类没有,子类有的方法。即,编译的时候,只能用父类中声明的方法,运行的时候,执行的是子类重写的方法。简单总结为:编译,看左边;执行,看右边。
(2) 多态性的使用前提:类的继承和方法的重写。
(3) 多态性可以简化代码,省去重写方法的代码编写。
(4) 对象的多态性只适用于方法,不适用于属性(编译和运行都看左边)。
(5) 多态是一个运行时行为,在多态情况下,父类的方法成为虚拟方法。又称,动态绑定。
(6)对象多态性,内存中实际上是加载了子类的特有属性和方法的,只是不能调用。想要调用需要使用强制类型转换(向下转型)。使用强转时,可能出现强转异常。此外,要想向下转型成功,必须是new 的子类对象。 - instanceof 关键字的使用。a instanceof A: 判断对象a是否是类A的实例。为了避免向下转型时出现异常。A也可以是其父类。