面向对象编程
面向对象编程
三大特性
-
封装:是指利用抽象数据类型把数据和基于数据得操作封装起来,使其成为一个不可分割得完整体。数据隐藏在抽象数据内部,尽可能隐藏数据细节,只保留一些数据接口使其与外界发生联系。
封装得目的是增强安全性和简化编程,使用者不必了解具体得实现细节,而只要通过外部接口,以特定的访问权限来使用类得成员。
-
继承:Java不支持多继承,一个子类只能有一个父类。但父类可以有多个子类。
-
多态:多态同一个行为具有多个不同表现形式或形态能力。是指一个类实例化(对象)的相同方法在不同情形有不同的表现形式。
多态存在的三个条件:继承、重写、父类引用指向子类对象。
抽象
注意点:
- 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
- 构造方法、类方法(用static修饰的方法)不能声明为抽象方法。
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现(重写),除非该类也声明为抽象类。
接口与抽象类的区别
- 抽象类的方法中可以有方法体,但接口中的方法不行。
- 抽象类的成员变量可以是各种类型的,而接口中的成员变量只能被public static final修饰。
- 接口中不能含有静态代码块与静态方法,而抽象类中可以有。
- 一个类只能继承一个类,但一个类可以实现多个接口。
一、什么是外部类、内部类
public class Outer {
class Inner{
}
}
如上述代码,Outer
是一个外部类,Inner
是一个内部类,内部类也可以用public
、static
等修饰,但要注意:
1.静态内部类中可以有非静态的方法;
2.当内部类中有静态方法或者静态成员变量时,一定是静态内部类。
外部类与内部类的区别与联系:
内部类可以访问外部类所有的方法和属性,如果内部类和外部类有相同的成员方法和成员属性,内部类的成员方法调用要优先于外部类即内部类的优先级比较高(只限于类内部,在主方法内,内部类对象不能访问外部类的成员方法和成员属性),外部类只能访问内部类的静态常量或者通过创建内部类来访问内部类的成员属性和方法。
如何访问
- 外部类访问内部类:
内部类被static修饰:可以直接new Inner in = new Inner();
内部类没有被static修饰:先new出外部类的实例,再new内部类的 Inner in = new Outer().new Inner(); - 内部类访问外部类:(外部类.this.变量)
二、内部类的种类:成员内部类、局部内部类,静态内部类、匿名内部类
1、成员内部类
语法格式:
[修饰符] class 外部类{
[修饰符] class 内部类{ }
}
成员内部类特点:
- 不能使用static关键字,但可以使用static final 关键字定义常量
- 内部类可以直接访问外部类的所有方法和属性
- 内部类如果想要调用外部类,需要使用
外部类名.this.外部方法名
- 可以使用final修饰内部类,表示不能被继承
- 和成员变量一样,可以使用全部的四种权限修饰符和final修饰符
- 可以在外部类里创建内部类对象,然后在通过方法返回,同时,也可以使用 new 外部类.new 内部类() 在外部直接访问内部类
- 编译以后也会有自己独立的字节码文件, 外部类名$内部类名.class
2、静态内部类
静态内部类也被称为嵌套类,静态内部类不会持有外部类对象的引用
语法格式:
[修饰符] class 外部类{
[其他修饰符] static class 内部类{ }
}
静态内部类特点:
-
使用static关键字修饰。
-
在静态内部类里,可以使用static关键字定义静态成员。
-
只能访问外部的静态成员,不能访问外部的非静态成员。
-
外部类可以通过 静态内部类名.静态成员名 访问静态内部类的静态成员
-
可以使用 四种权限修饰符和 final修饰符静态内部类
-
创建静态内部类对象,可以不创建外部类对象
-
也会生成独立的 .class文件,文件名是 外部类名.静态内部类名
3、局部内部类
局部内部类定义在外部类的方法中,就像局部变量一样,并不是外部类的成员。
局部内部类在方法外是无法访问到的,但它的实例可以从方法中返回,并且实例一直存在。
语法格式:
[修饰符] class 外部类{
[修饰符] 返回值类型 方法名([形参列表]){
[final/abstract] class 内部类{
}
}
}
局部内部类的特点:
- 定义在类的某个方法里,而不是直接定义在类里。
- 局部内部类前面不能有权限修饰符
- 局部内部类里不能使用static声明变量
- 局部内部类可以访问外部类的静态成员
- 如果这个局部内部类所在的方法时静态方法,它就无法访问外部类的非静态成员
- 局部内部类可以访问外部函数的局部变量,但这个局部变量必须要非final修饰。
4、匿名内部类
用来创建 一个接口或者抽象类 对象 (抽象类或者接口,本来不可以直接创建对象,可使用匿名内部类方法直接创建)
语法格式:
new 父类名或者接口名(){
// 方法重写
@Override
public void method() {
// 执行语句
}
};
匿名内部类特点:
- 匿名内部类就是一个特殊的局部内部类,只不过没有名称而已,基本特点和局部内部类一致
- 匿名内部类不能有构造器,匿名内部类没有类名,肯定无法声明构造器
- 匿名内部类的前提是,这个内部类必须要继承自一个父类或者父接口
- 匿名内部类是接口的一种常见简化写法,也是我们开发中最常使用的一种内部类,它的本质是一个实现父类或者父类接口具体方法的一个匿名对象。
abstract class Animal{
abstract void shout();
}
class Demo{
public void demo(){
Animal animal = new Animal() {
@Override
void shout() {
System.out.println("动物在叫");
}
};
}
}