1. Java最早是sun(Sun Microsystems隶属于斯坦福大学)公司1995年推出的,java以前叫”oak(橡树)”2009年Oracle(甲骨文)以74亿美金收购了sun公司。
2. java是一门面向对象的语言
3.java是一门静态语言
a = 3;a = “hello”;在python
种类型随着数据的变化而变化
int b = 5; b = “hello”;在java中一旦类型被确定就不能被改变了
4.java是一门安全性较高的语言
5.java是一门编译语言(一处编译到处运行)
6.java是一门跨平台的语言(在各个系统都可以运行)
不同系统的虚拟机不同,把虚拟机称为JVM,
7. public static void main(String[] args)表示程序执行的入口
一个java程序只能有一个入口,我们把程序入口也称为main方法
System.out.println("hello2");表示输出语句,会显示双引号中的内容
8. 输出语句分为两种:
换行输出System.out.println
不换行输出System.out.print
9. \"表示字符的双引号\n表示换行\\表示一个\\t表示一个制表符(空白)\’表示字符串的单引号
从大的分类来说有2种:基本数据类型和引用数据类型
基本数据类型分为8种:
- byte类型,也称为字节类型,占1个字节,范围是-128到127
- short类型,也称为短整型,占2个字节,其范围是-32768到32767
- int类型,也称为整型,占4个字节,其范围是?
- long类型,也称为长整型,其范围?
要求数字后跟大写字母L,小写字母l和数字1分不清
- float类型,也称为单精度浮点类型,占4个字节,要求数字后跟字母f
- double类型,也称为双精度浮点类型,占8个字节
- boolean类型,也称为布尔类型,只有两个值:true和false
- char类型,也称为字符类型,要求:1必须使用单引号 2.单引号种只能有1个字符
- 问String是不是基本数据类型?不是基本数据类型,是引用数据类型
- 问Long是不是基本数据类型?不是基本数据类型,是引用数据类型
- 问short[] 是不是基本数据类型?不是基本数据类型,是引用数据类型
- 当字符串和非字符串拼接时,会自动把非字符串转换成字符串
- 范围小的可以直接赋值给范围大的,范围大的不能直接赋值给范围小的,如非要赋值需要强制类型转换
- 三目运算符
- 语法:(条件)?值1:值2;
- 执行流程:当条件成立时返回值1,否则返回值2
- continue(跳过一次循环)和break(跳出整个循环)
面向对象
Java认为:万事万物皆对象
对象(object):客观存在的事物
类(class):指的是对象所属的分类
在java中认为先有类,然后有对象
对象 = 属性 + 方法
类 = 属性 + 方法
学习面向对象的思路
- 会定义类
- 会定义类中的属性
- 会定义类中的方法
- 会创建对象
- 会用对象调用属性
- 会用对象调用方法
- 会使用面向对象的特征:继承,多态,封装
- 会面向对象相关的关键字:static,public,private...
如何定义类
语法:public class 类名{}
类名首字母大写,以后每个单词首字母大写
- 创建项目
- 创建模块
- 创建包
如何定义属性
变量类型 变量名;
属性一般不赋值,除非项目需要
根据运行结果,属性不赋值也可以使用,系统会自动赋默认值
- 整数的默认值是:0
- 小数的默认值:0.0
- 布尔类型的默认值:false
- char类型的默认值:\u0000
- 引用数据类型的默认值:null
变量的分类
- 定义在方法中的变量称为局部变量,局部变量只能在当前方法内部使用
- 定义在方法外的变量称为全局变量,在类中任何方法内部都能使用
- 局部变量必须赋初值才能使用,全局变量可以不赋初值,会使用默认值
- 注意事项:全局变量和局部变量同名,优先使用局部变量,如果非要使用全局变量可以在局部变量前添加this.
使用return的注意事项
- 一个方法最终只能有一个return被执行
- return除了有返回值的功能之外,还有结束方法的功能,在return后不能添加任何语句
- 在java中一个return只能返回一个值
- return后的值的类型要小于等于返回值类型
- 在有void的方法中也可以使用return,只表示方法的结束,不能跟返回值
方法的重载机制
同一个类中,方法名一样参数不一样(参数类型或者参数个数)的方法就构成了重载关系
和返回值类型无关
构造方法
类名 对象名 = new 类名();
类名()就称为构造方法
当程序员不指定构造方法时会自动生成一个默认的构造方法格式如下:
public 类名(){}
如果程序员指定了构造方法就不会在生成默认的构造方法了
构造方法也可以重载
当创建对象时会自动调用构造方法
构造方法的主要作用:1.给属性初始化 2.完成一些初始化工作
new关键字的作用
- 调用构造方法
- 开辟内存空间
- 把内存地址返回给对象名
Java的内存结构
- 寄存器(负责存储程序执行的顺序)
- 栈(负责存储方法和局部变量)
- 堆(存储new出来的对象)
- 方法区(.class文件,静态方法,静态属性等)
- 本地方法区(java调用底层的函数(c或者c++编写))
栈内存的特征:first in last out 简称 filo
队列的特征:first in first out 简称 fifo
对象做参数
案例一:张三玩手机
分析:有几个类:Person和Phone
Person中有play这个方法,用Phone对象做参数
- 先有手机,然后才能玩手机
使用对象做返回值
案例一:食堂做饭
分析:食堂类和饭类
食堂有一个做饭的方法,可以返回饭
步骤一:定义Food类
对象做属性
案例一:模拟电脑有cpu,disk,可以用它们做属性
分析:有三个类,电脑类,cpu类,disk类
电脑必须包含cpu和disk
步骤一:定义CPU类和DISK类
步骤2:定义电脑类,并且设置cpu和disk属性
- 编写测试类
面向对象语言的特征
说法一:继承,多态,封装
说法二:继承,多态,封装,抽象
:1.子类继承父类 2.子类可以继承父类的属性和方法(除了构造方法,私有属性和方法)
子类可以改变父类的属性和方法,java是单继承的,意味着一个子类只能继承一个父类
继承的优点:增加了代码的扩展性,简化了代码的书写
面试题:重载(overload)和重写(override)的区别
重载:在同一个类中,方法名一样,参数不一样(个数和类型)的方法构成了重载
重写:在有继承关系的类中,方法名一样,参数一样,返回值类型一样的方法构成了重写
继承和构造方法的关系
当创建子类对象时,首先调用父类的构造方法,然后才会调用子类的构造方法
深入学习继承和构造方法的关系
当创建子类对象时,首先调用父类的无参的构造方法,然后才会调用子类的构造方法
this和super关键字
this关键字
this在英文中表示这个,是一个指示代词,表示的物品不确定
java中的this表示当前类不确定的对象
当某个对象调用含有this的方法时,那么this就指向该对象
this的用法
- this.属性表示调用当前类的属性
- this.方法表示调用当前类的方法
- this(参数)表示调用当前类的构造方法
Super关键字
- super.属性表示调用父类的属性
- super.方法();表示调用父类的方法
- 如果在子类的构造方法中不指定super时,会默认在子类构造方法的第一行
- 生成super()表示调用父类无参的构造方法。
- 总结:遇见this朝当前类看,遇见了super朝父类看
- 面试题:this()和super()能不能同时出现呢?为什么?
- 不能,因为this()和super()都要放到构造方法的第一行,冲突了
- toString方法的默认作用是显示内存地址
- 当输出对象时就相当于调用其toString方法
一般使用toString方法显示对象的内容,所以程序员需要重写toString方法,可以使用alt + insert快速生成。
- book和book2中存储的是对象的内存地址,所以它们内存地址不同
- equals方法的默认作用是比较对象的内存地址
- 程序员需要重写equals方法,类比较对象的内容
- 可以使用快捷键来重写:alt + insert选择hashCode和equals
比较字符串使用==还是equals
equals方法的默认作用是比较对象的内存地址
程序员需要重写equals方法,类比较对象的内容
可以使用快捷键来重写:alt + insert选择hashCode和equals
从以上案例来看,使用equals方法比较好
多态
演示多态
当一个类不指定父类时,会默认继承Object类
所有类都是Object类的直接或者间接子类,意味着Object类是最大的类
多态的相关术语
- 向上转型(小的给大的)
Father father = new Son();
- 向下转型(大的给小的),需要强转否则报错
Son son = (Son) father;
- 向下转型之前必须先向上转型
多态和属性方法的关系
对于属性来说:调用的时候看左边,执行的时候看左边
对于方法来说:调用的时候看左边,执行的时候看右边
修改Boy类
我们把这种设计原则称为开闭原则,对扩展是开放的,对修改是关闭的。
java提供了一个java.lang包,我们把这个包称为语言基础包,其中包含System,String,Object等等,因为使用比较频繁,所以当书写java代码时会默认导入该包,*表示所有类
import java.lang.*;除此之外都需要手动导包
访问修饰符
- public公共的,谁都能访问
public可以修饰类,方法,属性,构造方法
- private私有的,除了当前类本身,其他无法访问
- private不能修饰类
- private可以修饰属性,那么该属性就称为私有属性
封装
java中的封装指的是属性私有化
访问修饰符
- 默认修饰符(什么都不写)
可以修饰类,属性,方法,构造方法,其范围是同包内有效
创建一个新包com.jd
在该包下创建TestBook2并测试
- protected修饰符称为受保护的,同包内可以访问,子类内部也可以访问(同包不同包都可以)
测试同包内是否可以访问
protected不能修饰类,但是可以修饰属性和方法
在同包内创建TestPerson
按照访问修饰符的访问范围由大到小排序?
public>protected>默认修饰符>private
final关键字
final可以修饰类,属性,方法
被final修饰的类不能有子类
被final修饰的属性或者变量不能被改变
被final修饰的方法不能被重写
static关键字
static表示静态的
被static修饰的方法称为静态方法
被static修饰的属性就称为静态属性
static的用法:
- 被static修饰的属性或者方法可以用类名直接调用(除了私有)
- 静态方法只能调用静态方法或者静态属性,非静态的方法什么都可以调用
使用static的注意事项:
- 使用静态方法时不能出现this关键字
- 静态的属性是共享数据,非静态的属性非共享数据
接口
如何定义接口:public interface 接口名{}
接口不能直接创建对象,可以通过类来实现接口,
如果一个类实现了接口就必须实现接口中所有的实现方法
一个类可以实现多个接口
语法格式:public class 类名 extends 类名(object) implements 接口名1,接口名2...
抽象类
引入抽象类
抽象类中既可以定义普通方法,也可以定义抽象方法
其命名格式为AbstractXXX,而且要被abstract关键字修饰
面试题1:问abstract和final可不可以同时修饰一个类?
不能,因为abstract必须有子类才能使用,而final让一个类不能有子类,冲突了所以不能同时修饰一个类
面试题2:问接口和抽象类的区别
- 抽象类使用abstract关键字,接口使用的是interface关键字
- 一个类只能继承一个抽象类,一个类可以实现多个接口
- 一个类继承抽象类用extends关键字,一个类实现接口用implements关键字
- 抽象类中既可以有抽象方法,也可以有非抽象方法,抽象类中的abstract不能省略,jdk1.8以前接口中都是抽象方法,所以public abstract可以省略不写,但是在jdk1.8以后允许出现普通方法,必须用default关键字修饰
- 抽象类中既可以有普通属性,也可以有常量,在接口中属性都是常量,其中public static final可以省略
匿名对象
匿名对象就是没有名字的对象:new 类名(参数);
匿名对象的使用场景:当对象的某个方法只使用一次时建议使用匿名对象