1、Java面向对象中类与对象的概念和使用
方法的定义:
方法就是一段可以重复调用的代码。
定义格式:
1 | 访问修饰符 返回值类型 方法名(){ |
方法的返回值类型:
void类型不需要返回值,其他类型的全部需要返回值。
方法的重载:
方法名称不同,但是参数的类型和个数相同,通过传递参数的个数和类型不同来完成不同的功能。
类的定义:
1 | class 类名称{ |
声明一个类需要通过一个关键字class。
类与对象的关系:
类是对某一类事物的描述,是抽象的、概念上的意义,对象是实际存在的该类事物的每一个个体,也被称为对象或实例。
了解面向对象:
1、程序的发展历程:面向过程、面向对象。
2、解释面向过程和面向对象:(比如制作一个盒子)
- 面向过程:不去想做什么样子的盒子,随机取工具制作。
- 面向对象:先想好做一个什么样的盒子,再去找对应的工具去做。
面向对象的三大特征:
- 封装性:对外部不可见。
- 继承:扩展类的功能。
- 多态性:方法的重载。 对象的多态性。
方法的递归:
递归调用就是方法自己调用自己。
例如:求1-100的和。
1 | package java面向对象; |
2、Java面向对象的基本特征之一:封装性
封装性:
1、封装性的目的:保护某些属性和方法不被外部所看见。
2、封装的实现:为属性和方法进行封装是通过关键字private声明的。 实现该属性的set和get方法,为外部所访问。
例如:
1 | package java面向对象; |
匿名对象:
匿名对象就是没有名字的对象,如果程序中只用一次该对象,就可以事业匿名对象的方式。
例如:
1 | package java面向对象; |
构造方法:
1、格式:
1 | 访问修饰符 类名称(){ |
2、注意点:
- 构造方法名称必须与类名一致。
- 构造方法没有返回值。
3、构造方法主要是为类中的属性初始化。
4、每个类在实例化之后都会调用构造方法,如果没有构造方法,程序在编译的时候回创建一个无参的什么都不做的构造方法。
5、构造方法也可以重载。
例如:
1 | package java面向对象; |
3、Java面向对象中引用的传递
引用传递:
也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
值传递:
方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
例如:
1 | package java面向对象; |
this关键字:
- 表示类中的属性和调用方法。
- 调用本类中的构造方法。
- 表示当前对象。
1 | package java面向对象; |
static关键字:
- 使用static声明属性:static声明全局属性。
- 使用static声明方法:直接通过类名调用。
- 注意点:使用static方法的时候,只能访问static声明的属性和方法,而非static声明的属性和方法是不能被访问的。
4、Java面向对象基本特征:继承
继承的实现:
- 继承的基本概念:扩展父类的功能。
- Java中使用extends关键字完成继承。 class 子类 extends 父类 {}
例如:
1 | package java面向对象; |
继承的限制:
- 在Java中只允许单继承。
- 子类不能直接访问父类的私有地址。
例如:
1 | package java面向对象; |
子类对象的实例化:
在子类对象实例化之前,必须先调用父类中的构造方法,之后调用子类的构造方法。
例如:
1 | package java面向对象; |
继承方法的重写:
- 在继承中,也存在着重写的概念,其实就是定义了和父类同名的方法。
- 定义:方法名称相同,返回值类相同,参数也相同。
- 重写的限制:被子类重写的方法不能拥有比父类更加严格的访问权限。
- 访问权限:private<default<public
public、private、protected、default的区别:
首先就class之间的关系做一个简单的定义,对于继承自己的class,base class可以认为他们都是自己的子女,而对于和自己一个目录下的classes(即同一个包),认为都是自己的朋友friendly。
- public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
- private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
- protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。
- default:java的默认访问权限,当没有使用上面提到的任何访问限定词时,就使用它,这种权限通常被称为包访问权限,在这种权限下,类可以访问在同一个包中的其他类的成员,也即可以访问我们前面说的朋友,在包之外,这些成员如同指定了private。
java 变量作用域的修饰的作用范围:
- public:类本身和任何包的任何类都访问
- private 只有类本身可以访问,其他类想访问可以通过该类的成员方法访问如getter/setter
- protected:保护的,这个和缺省的比较容易混淆,记住最主要区别是:protected可以在不同包的子类被访问,而friendly不可以。 protected可以在类本身、同包的子类,不同包的子类,同包的非子类 被访问
- 缺省的:可以在类本身,同包的子类,同包的非子类 被访问。
同类 | 同包 | 不同包子类 | 不同包非子类 | |
---|---|---|---|---|
private | √ | |||
default | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
super关键字:
强行调用父类的方法的执行。
super不一定在重写中使用,也可以表示哪些方法是从父类中继承而来的。
例如:
1 | package java面向对象; |
重写与重载的区别:(重点)
NO | 区别点 | 重载 | 重写 |
---|---|---|---|
1 | 单词 | Overloading | Overriding |
2 | 定义 | 方法名称相同,参数的类型和个数不同 | 方法名称、参数的类型个数、返回值全部相同 |
3 | 权限要求 | 对权限没要求 | 被重写的方法不能有比父类更加严格的权限 |
4 | 范围 | 发生在一个类中 | 发生在继承中 |
5、Java面向对象-抽象类与接口
final关键字:
1、final关键字在java中被称为完结器,表示终结的意思。
2、final使能声明类、方法。属性:
- 使能final声明的类不能被继承。
- 使能final声明的方法不能被重写。
- 使能final声明的变了变成常量。常量是不可以被修改的。
抽象类:
抽象类概念:包含一个抽象方法的类就是抽象类。
抽象方法:声明而未被实现的方法,抽象方法必须使用abstract关键字声明。
抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中的所有抽象方法。
定义格式:
1
2
3
4
5abstract class className{
属性
方法
抽象方法
}抽象类不能直接实例化,要通过其子类进行实例化。
例如:
1 | package java面向对象; |
接口的实现:
接口是Java中最重要的概念、接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成的。
接口的格式:
1
2
3
4interface interfaceName{
全局常量
抽象方法
}接口的实现也必须通过子类,使用关键字implments,而且接口是可以多实现的。
一个子类可以同时继承抽象类和实现多接口。
一个接口不能继承一个抽象类,但是却可以通过extends关键字同时继承多个接口,实现接口的多继承。
例如:
1 | package java面向对象; |
6、Java面向对象多态性
多态性:
1、多态性的体现:方法的重载和重写。 对象的多态性。
2、对象的多态性:
- 向上转型:程序会自动完成。 父类 父类对象 = 子类实例
- 向下转型:强制类型转换。 子类 子类对象 = (子类)父类实例
例如:
1 | package java面向对象; |
instanceof关键字:
- instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
- 用法:result = object instanceof class
- 参数:
- Result:布尔类型。
- Object:必选项。任意对象表达式。
- Class:必选项。任意已定义的对象类。
- 说明:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
例如:
1 | package java面向对象; |
抽象类的应用举例:
1 | package java面向对象; |
接口的应用举例:
1 | package java面向对象; |
7、Java面向对象之泛型
认识泛型:
泛型是在JDK1.5 之后新增的新功能。泛型(Generic)。
泛型可以解决数据类型的安全性问题,他的主要原理,是在类声明的时候通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。
格式:
1
2
3
4访问权限 class 类名称<泛型,泛型···>{
属性
方法
}对象的创建: 类名称<具体类型> 对象名称 = new 类名称<具体类型>
例如:
1 | package java面向对象; |
构造方法使用泛型:
构造方法可以为类中的属性初始化,那么如果类中的属性通过泛型指定,而又需要通过该构造方法设置属性内容的时候,那么构造方法得的定义与之前并无不同,不需要像声明类那样指定泛型。
例如:
1 | package java面向对象; |
设置多个泛型:
设置多个泛型直接在< >添加多个泛型就可以了。
例如:
1 | class G<K,T>{ |
通配符:
在泛型<>中填入”?” ,代表什么类型都可以匹配。
泛型接口:
- 在JDK1.5之后,不仅仅可以声明泛型类,也可以声明泛型接口,声明泛型接口和声明泛型类的语法类似,也是在接口的名称后面加上
. - 格式: interface 接口名称<泛型标识>
例如:
1 | package java面向对象; |
泛型方法:
- 泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据类型。
- 格式: 访问权限 <泛型标识> 泛型标识 方法名称([泛型标识 参数名称])
例如:
1 | package java面向对象; |
泛型数组:
在使用泛型方法的时候,也可以传递过返回一个泛型数组。
例如:
1 | package java面向对象; |