第1章 对象的概念
1、对象是一个抽象的概念。
在面向对象的编程语言中,对对象有以下几种解释:
- 万物皆是对象。即万物都可以被面向对象的语言所定义;
- 在面向对象语言组成的程序中,一段程序实际上就是多个对象通过发送消息来通知彼此要干什么。
- 从资源角度,大对象都是由小对象组成,小对象由基础对象组成。
- 每一种对象都有一种类型。
- 同一种类型的对象可以接受相同的消息。
简单地说,对象是具有状态、行为和标识的。
在Java语言中,在定义一个对象的时候,会把对象的状态、行为、标识等信息写在一个.java结尾的文件里,此文件可被称为一个类。
2、对象具有接口
对象的【接口】是一种被外部程序操作此对象的一个入口,外部程序通过对象提供的接口让对象去做某件事。例如如下代码:
Light lt = new Light();
lt.on();
有一个Light的对象lt,它被请求了on()方法用于开灯。
3、对象可以使用接口为其他对象提供一个服务。
4、隐藏的实现
对象对外提供一个服务接口,让别的对象来访问。那么别的对象能够访问的接口的数量,和这个对象定义的接口数量不一定相同。
因为这些接口在被定义的时候都必须给它设置可被外部对象访问的权限。
使用以下几个关键字来修饰接口,即可添加对应的权限。
- public,表示定义的内容可被任何对象访问
- private,表示定义的内容只能被类的创建者通过该类自身的方法访问
- protected,类似于private,区别是继承的子类可以访问protected,而不能访问private成员
- default,也称为包访问,意思是一个类可以访问同一个包里的其他类,非同一个包就不能访问了
5、复用实现
面向对象编程有一个特点是代码复用。
例如,我们已经有一个教室对象了,那么在我们定义的学校对象如果要含有教室相关的属性,就不需要在学校里二次定义教室属性,直接可以复用这个教室类,代码示例如下:
/**
* 教室对象
*/
public class Classroom{
// 教室的属性
}
/**
* 学校对象
*/
public class School{
// 学校名称
private String name;
//教室
private Classroom classroom;
// 其他属性
}
6、继承
继承的出现,是为了减少我们复制另一个类的属性或方法。
继承指的是有一个类A,它自身的属性和要做的是和已有的类B大多相似,那么类A可以使用extends关键字去继承类B,在关系上类B被称为父类,或者基类,类A被称为子类。如下所示:
public class ClassA extends ClassB{
}
举例,有一个动物类Animal,它有eat()行为;
public class Animal{
protected void eat();
}
后来有了具体的动物出现,如Dog、Tigger等他们除了有eat这个行为,还会有一个属于自身的行为,这个称为扩展子类的行为。
public class Dog extends Animal{
public void eat(){
}
public void run(){
}
}
在使用继承的时候有is-a 和 is-like-a的关系。
子类的对象可以代替父类的对象。
在子类方法和基类方法完全相同时,即子类没有扩展方法时,那么这两者关系可被描述为 is-a关系。
在子类的方法中有扩展方法的时候,此时父类没法完全访问子类的新方法,称这两个关系可以为 is-like-a关系。
7、多态
面向对象语言使用了一种后期绑定的机制,直到运行到这段代码时才确定哪段代码会被调用。
在继承中,子类对象可代替父类的对象,那么当接口表示需要一个Animal对象时,此时给这个接口发送Dog或Tigger都是被允许的。
当执行到eat方法时,才会确定当前的Animal是具体的Dog还是Tigger。
执行结果是符合预期的,对于接口访问方来说,传递了Tigger过去,那么得到的就应该是Tigger相关的。
8、单根层次结构
万物都是对象。Java所有的对象都有一个共同的父类Object。
9、集合
Java中有集合概念,它是一组相同类型的Java对象的管理容器。常见的有List,Map,队列,栈等。
向上转型:存入一个具体的对象,得到的却是该对象的父类对象;
向下转型:要求明确知道具体类型是什么,那么存这个具体对象,得到的也是这个具体类型的具体对象。
Java的泛型使用的就是这种向下转型。
10、对象的创建和生命周期
每个对象在创建的时候会消耗一定的资源,尤其是内存资源,当不再需要它的时候,就应该及时的被清理掉。
Java语言底层支持了垃圾收集器机制,它会自动找到无用的对象并将其销毁。
11、异常处理
异常是在错误发生之处抛出的对象,而根据该错误类型,它可以被对应的异常处理程序所“捕获”。
异常提供了我们可以修正问题的机会。
第2章 安装Java
跳过
第3章 对象无处不在
通过以下代码解释第三章内容:
package com.gyc.learning.test;
import java.util.ArrayList;
import java.util.List;
/**
* 类注释,
*/
public class LearningJava {
private int age =5;
private static int num=26;
public static void main(String[] args) {
LearningJava learningJava = new LearningJava();
int waitingCheckAge =45;
/*
注释块
*/
String result = learningJava.checkAge(waitingCheckAge);
System.out.println(result);
// 数组
int[] array = new int[]{1,2,3};
List<Integer> list = new ArrayList<>();
LearningJava.checkAge2(26);
}
public String checkAge(int age){
int smallAge =34;
if (age > 18){
return "成年人";
}
return "未成年人";
}
public static String checkAge2(int age){
int smallAge =34;
if (age > 18){
return "成年人";
}
return "未成年人";
}
}
class:表示创建的Java文件是一个常规的类,这些类中有方法,和属性;
package:表示这个Java文件所处的文件夹目录;
import:引入别的已经写好的Java类在本类中使用,import后跟这个类的全路径。
方法、参数和返回值:
如示例中的main和checkAge就是两个方法,表示包含一些逻辑规则的代码块;
参数指方法后括号里的内容,代表这个方法每次被使用时,外部要传的数据个数和数据类型,要一一对应;
返回值:指方法内部流程结束后对外输出的内容,像checkAge会输出String类型的【成年人】和【未成年人】;main方法返回值是void类型,可以无return出现。
注释符号:用于对一块、一行、一个方法进行白话说明的。
// 注释行说明,说明文字只能写一行
/*
可写多行
*/
作用域:指的是一个字段属性在代码中能够被使用到的范围。
像上面的age和num都是可以在这个类的所有地方被使用的;而smallAge只能用在checkAge方法里;arrary只能用在main方法里
new:用来创建一个对象,系统会为此对象分配内存资源,创建好Java对象后就可以使用此对象里的方法。如:
public static void main(String[] args){
LearningJava learningJava = new LearningJava();
learningJava.checkAge(waitingCheckAge);
}
static:静态标识,可用作属性、方法、代码块中。使用方法就要创建一个对象,这个情况下会消耗资源,static的出现就是为了减少频繁创建对象。被static修饰的属性、方法、可在外部直接使用。
public static void main(String[] args){
LearningJava.checkAge2(26);
}
对于被static修饰的变量属性和非static修饰,两者的区别在于,每次创建对象时,非static修饰的属性都要创建一次,而static修饰的不会再创建且在多对象时属性值也有可能被改变。
Java中的基本类型
boolean
- 大小:-
- 最小值:-
- 最大值:-
- 默认值:false
- 包装类:Boolean
char
- 大小:16位
- 最小值:Unicode 0 \u0000
- 最大值:65535 \uffff
- 默认值:\u0000(null)
- 包装类:Character
byte
- 大小:8位
- 最小值:-128
- 最大值:127
- 默认值:(byte)0
- 包装类:Byte
short
- 大小:16位
- 最小值:-32768
- 最大值:32767
- 默认值:(short)0
- 包装类:Short
int
- 大小:32位
- 最小值:-2^31
- 最大值:2^31 -1
- 默认值:0
- 包装类:Integer
long
- 大小:64位
- 最小值:-2^63
- 最大值:2^63 -1
- 默认值:0L
- 包装类:Long
float
- 大小:32位
- 最小值:IEEE754
- 最大值:IEEE754
- 默认值:0.0f
- 包装类:Float
double
- 大小:64位
- 最小值:IEEE754
- 最大值:IEEE754
- 默认值:0.0d
- 包装类:Double