面向对象篇
一、面向对象基础
1.概述
Java语言是一种面向对象的程序设计语言,这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。那么,面向对象就是指,把相关的数据和方法组织为一个整体来看待,强调的是通过调用对象的行为来实现功能。
- 注意:面向过程关注的是执行的过程,面向对象关注的是具备功能的对象。 面向过程到面向对象,是程序员思想上从执行者到指挥者的转变。
2.三个特征
封装性:所有的内容对外部不可见。
继承性:将其他的功能继承下来继续发展。
多态性:方法的重载本身就是一个多态性的体现。
3.类和对象
类:是一组相关属性和行为的集合(任何人都具有人类的特点,比如有手、脚等,这就是属性,人可以吃饭,打游戏,写代码,这就是行为)
属性:就是该事物的状态信息。
行为:就是该事物能够做什么。
- 类必须通过对象才可以使用,对象的所有操作都在类中定义。
- 对象:是一类事物的具体体现。对象是类的一个实例(对象并不是找个女朋友),必然具备该类事物的属性和行为。(就好像作为指挥者,你需要叫军人这个类中的某一位军人去执行相关的任务,同时这位军人具备军人这个类的一切属性和行为)。
4.类与对象的关系
类是对一类事物的描述,是抽象的。
对象是一类事物的实例,是具体的。
类是对象的模板,对象是类的实体。
5.类的定义格式
class 类名称{
成员属性
成员方法
}
6.属性与方法
属性定义格式:
数据类型 属性名;
属性定义并赋值的格式:
数据类型 属性名 = 初始化值;
方法定义格式:
权限修饰符 返回值类型 方法名(形式参数列表)
{
//方法体
return 返回值;
}
创建对象:
类名 对象名 = new 类名();
使用对象访问类中的成员:
对象名.成员变量;
对象名.成员方法();
7.栈
Java栈的区域很小 , 大概2M左右 , 特点是存取的速度特别快
栈存储的特点是:先进后出
存储的是: ①基本数据类型的数据 ②引用数据类型的引用
例如: int a =10;
Person p = new Person();
那么10存储在栈内存中 , 创建的对象的引用§存在栈内存中。
8.堆
存放的是类的对象 .
所有类的对象都是通过new关键字创建 new关键字, 是指告诉JVM ,
需要明确的去创建一个新的对象 , 去开辟一块新的堆内存空间。
9.方法区
存放的是类信息 、 静态的变量 、常量 、 成员方法
10.方法的重载
方法名称相同, 参数类型或参数长度或参数类型顺序不同, 可以完成方法的重载 。
方法的重载与返回值无关。
方法的重载 ,可以让我们在不同的需求下, 通过传递不同的参数调用方法来完成具体的功能。
二、面向对象进阶
1.封装——private关键字
private的含义
- private是一个权限修饰符,代表最小权限。
- 可以修饰成员变量和成员方法。
- 被private修饰后的成员变量和成员方法,只在本类中才能访问。
格式:
private 数据类型 变量名 ;
1.代码示例
public class Student {
private String name;
private int age;
}
2.get和set方法
提供 getXxx 方法 / setXxx 方法,可以访问成员变量,代码如下:
public class Student {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}
3.封装优化——this关键字
含义:this代表所在类的当前对象的引用(地址值),即对象自己的引用。
(记住 :方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。)
this使用格式:
this.成员变量名;
使用this关键字可以完成以下的操作: ·
1.调用类中的属性 ·
2.调用类中的方法或构造方法 ·
3.表示当前对象
4.封装优化——构造方法
Person p = new Person();
在右侧Person后面出现的小括号, 其实就是在调用构造方法 !
作用:用于对象初始化。
执行时机: 在创建对象时,自动调用
特点:所有的Java类中都会至少存在一个构造方法 如果一个类中没有明确的编写构造方法,则编译器会自动生成一个无参的构造方法, 构造方法中没有任何的代码!如果自行编写了任意一个构造器, 则编译器不会再自动生成无参的构造方法。
定义的格式: 和普通方法一样,区别在于: 方法名称必须与类名相同, 没有返回值类型的声明 !
修饰符 构造方法名(参数列表){
// 方法体
}
public class Solution{
public static void main(String[] args){
Person p = new Person();
p = new Person();
p = new Person();
p = new Person();
}
}
class Person{
public Person(){
System.out.println("对象创建时,此方法调用");
}
}
5.关于构造方法
建议自定义无参构造方法,不要对编译器形成依赖,避免错误发生。 当类中有非常量成员变量时,
建议提供两个版本的构造方法,一个是无参构造方法,一个是全属性做参数的构造方法。当类中所有成
员变量都是常量或者没有成员变量时,建议不提供任何版本的构造。
注意事项
1. 如果你不提供构造方法,系统会给出无参数构造方法。
2. 如果你提供了构造方法,系统将不再提供无参数构造方法。
3. 构造方法是可以重载的,既可以定义参数,也可以不定义参数
6.封装优化—— static
static表示“静态”的意思,主要作用在于创建独立于具体对象的域变量或者方法。
理解:被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了
就可以通过类名去进行访问。 并且不会因为对象的多次创建而在内存中建立多份数据
- 注意:
1. 静态成员 在类加载时加载并初始化。
2. 无论一个类存在多少个对象 , 静态的属性, 永远在内存中只有一份
3. 在访问时: 静态不能访问非静态 , 非静态可以访问静态 !
三、面向对象高级
1.抽象类
抽象类必须使用abstract class声明 一个抽象类中可以没有抽象方法。抽象方法必须写在抽象类或者接口中。
-
格式:abstract class 类名{
// 抽象类
} -
抽象方法:
只声明而未实现的方法称为抽象方法(未实现指的是:没有“{}”方法体),抽象方法必须使用abstract关 键字声明。 -
格式:abstract class 类名{
// 抽象类
public abstract void 方法名() ; // 抽象方法,只声明而未实现
} -
原则:抽象类本身是不能直接进行实例化操作的。
1.不能直接使用关键字new完成。
2.一个抽象类必须被子类所继承,被继承的子类(如果不是抽象类)则必须覆写(重写)抽象类中的全部抽象方法。
2.接口
如果一个类中的全部方法都是抽象方法,全部属性都是全局常量,那么此时就可以将这个类定义成
一个接口。(如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法)
-
定义格式: interface 接口名称{
全局常量 ;
public static final String string = “内容” ;(可省略public static final)
抽象方法 ;
public abstract void print() ;(可以省略 public abstract)
} -
注意
①接口的实现 implements
接口实现格式:class 子类 implements 接口1,接口2…{}②一个类即要实现接口,又要继承抽象类格式:
class 子类 extends 父类 implements 接口1,接口2…{ }
③接口因为都是抽象部分, 不存在具体的实现, 所以允许多继承
interface C extends A,B{ }
3.多态
多态: 是指同一对象,具有多个不同表现形式。
多态的使用格式:
向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。
格式: 父类类型 变量名 = new 子类类型();
如:Animal a = new Cat();
向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。
格式:子类类型 变量名 = (子类类型) 父类变量名;
如:Cat c =(Cat) a;
-
注意: 方法的重载和重写 也是多态的一种, 不过是方法的多态(相同方法名的多种形态)。
重载: 一个类中方法的多态性体现
重写: 子父类中方法的多态性体现。 -
instanceof关键字:避免类型转换异常,判断某个对象是否是指定类的实例。
格式:实例化对象 instanceof 类 //此操作返回boolean类型的数据
4.Object类
Object类是所有类的父类(基类),如果一个类没有明确的继承某一个具体的类,则将默认继承Object 类。
Object的多态性:使用Object可以接收任意的引用数据类型。
Object.toString方法。 作用:返回对象的字符串表示形式。( 返回对象的内存地址)