面向对象的四大特性:
封装 继承 多态 抽象
主要的功能: 代码的重用
1.函数(封装的一种表现)
1.1 函数(方法)的概念
函数就是对代码的封装
函数的种类:2种
- 普通函数
- 静态函数 例:main静态函数(方法)
区分:是否使用static修饰,使用static方法修饰的方法就是静态函数
重点:静态方法中只能调用其他的静态方法,静态方法不能直接调用普通方法。
本类中静态函数调用本类的静态函数,可以省略掉类名;
调用其他类的静态方法,通过类名.方法名调用。
好处:
- 一次编写,到处运行。
- 修改一处,全部修改。
- 隐藏实现细节(封装代码的本质是为了让别人用的更方便)
(1)普通方法中可以直接调用静态方法
(2)普通方法中可以直接调用本类中的其他普通方法
(3)静态方法想要调用普通方法,一定要new对象
2. API (application program interface 应用程序接口)
API 意思就是函数,各种各样的接口函数
3. 继承和 聚合
类与类之间存在2种关系: 继承和聚合
继承的目的:为了代码的重用,将类进行扩充
每一个类都默认继承Object方法(11个方法)
OutLine :(查看一个类的所有资源),位置:window—show view–out line
Crtl + t : 查看类的族谱 ,其继承的所有类
3.1 继承情况下的变量
子类的变量是对父类变量的扩充
当子类new 的时候,先 new 父类 ,再new 子类
就近原则:当子类和父类都有相同的变量名和方法名时,采用就近原则
(1)当子类 和 父类 都定义了相同名称的变量 xxx
例:子类 tool = new 子类
tool.xxx = 3;
意思是 为子类的 xxx赋值为3
(2)子类和父类都是相同的方法名相同,sayhello().
例:子类 tool = new 子类
tool.sayhello();
意思就是输出子类中的sayhello()方法
(3)静态变量
常量池:在方法区中的一块区域
当子类和父类中都有相同的变量时, public static int a
常量池中只存放子类的静态变量 a
(4)非静态变量
当 子类 tool = new 子类 时,在堆中的空间先是父类的非静态变量的空间大小再加上子类中的非静态变量的空间大小
每new一次,都向堆中扩充大小为new的对象的变量大小的空间,再将new对象的方法放入方法区。
(5) 关键字 this. super.
- 当 子类 tool = new 子类 时 ,this 和 super 都表示子类
- this 和 super 都只能在堆中和私有方法区找资源
- this 和 super 都不能在静态方法中使用,因为他们都是在栈中占有独立的内存 空间,静态方法和 main()方法是独立的。当他们new对象时,是独立的指向堆中,而继承是堆中的空间指向方法区再调用方法的。
3.2. 重载(overload)
理解: 方法名相同, 方法参数的个数、顺序、类型不同,则构成重载
使用场景:同类下
例:
Math.max(double a,double b)
Math.max(float a,float b) : Math.max(111f,100f)
Math.max(int a,int b)
Math.max(long a,long b) : Math.max(111L,100L)
3.3 重写(override)------完全一致
使用场景:继承的父子类下
理解:子类跟父类的方法一模一样,与返回值无关
快捷键:alt + shift + s ----> Override /Implement Method
父类 中 有
public void eat()
{
System.out.println("我可以吃");
}
子类 中 有
public void eat()
{
System.out.println("我是程序猿....");
}
3.4 抽取方法:重构
快捷键:Ctrl +shift+T ------> Extract Interface
3.5 final
-
类 :
public final class A
用 final 修饰的类不能被继承 -
变量: 常量(final修饰的全局变量叫做常量)
1.必须要有初始值
2.不能被修改
3.static 让常量在常量池
public static final int a=1;
已经定义不能修改 -
方法:
public final void sayHello()
{
}
sayHello() 方法不能被重写
3.6 构造器
多个构造器:构造方法的重载 即 使用方法名相同但是方法参数不同的构造方法
(1)每个类都会有默认的构造方法(无参的构造方法)
(2)如果自己编写了构造方法会把系统默认的构造方法给毁掉
构造方法的目的:
- 是为了配合new关键字使用,当new关键字后面接上构造方法,JVM帮助我们在堆里面分配相应的内存空间
- 构造方法初始化数据
- 构造方法只能被new关键字调用
- new 子类一定会先把父类构造出来,再构造子类
- super() 调用的是父类的构造方法
- this() 调用的是自己的构造方法
- super 和 this 一定要放在其他代码的最前面
类的种类:
- 方法类 : 该类中全部都是方法 Math 工具类 用于简化开发
- 数据类 : 就是对现实世界的抽象 用户类
3.7 访问修饰符
- public
用public修饰的类、类属变量及方法,包内及包外的任何类(包括子类和普通类)均可以访问; - protected
用protected修饰的类、类属变量及方法,包内的任何类及包外那些继承了该类的子类才能访问; - default
如果一个类、类属变量及方法没有用任何修饰符(即没有用public、protected及private中任何一种修饰),则其访问权限为default(默认访问权限)。默认访问权限的类、类属变量及方法,包内的任何类(包括继承了此类的子类)都可以访问它,而对于包外的任何类都不能访问它(包括包外继承了此类的子类)。default重点突出包; - private
用private修饰的类、类属变量及方法,只有本类可以访问,而包内包外的任何类均不能访问它
4.接口
接口的用途:定义规则。
- 1.接口中只能有方法签名,没有方法体
- 2.接口可以允许两种资源:常量 方法签名
- 3.接口的常量可以不需要使用static final 修饰
- 4.接口和类不同 不能被实例化
public interface USB{
static final int max = 0;
int min = 2;
public void sayHello();
public static void main(String[] args){
}
}
5.抽象类
使用abstract修饰的类为:抽象类
- 标识该类还没有完成,还没有达到使用的级别
- 抽象类不能被实例化(new)
- 存在抽象方法的类(方法public abstract void xxx())一定是抽象类
- 没有抽象方法的类也可以是抽象方法
- 不能new 它本身,但是能new 它的子类 可以实现它的功能
非4类8种的数据类型,取值范围有且只有两种:null 和 new xxx();
6.单例模式
1.通过单例模式可以保证系统中,应用该模式的一个类只有一个实例,即一个类只有一个对象实例。
2.不让new,是放在常量池中的
public class Person{
//2.在常量池中实例化一个对象
private static Person p = new Person();
//1.将构造器私有化
private Person(){
}
//3.设置一个方法,返回它本身
public static Person getPerson(){
if(p==null){
return p;
}
else{
return p;
}
}
}