一、面向对象编程基础
(一)面向对象概述
1、对象,是一个抽象概念,表示任意存在的事物,世间万物皆对象!!
2、类是封装对象的属性和行为的载体,反过来说具有相同属性和行为的一类实体被称为类。
特点
1、封装性
将对象的属性和行为封装起来,其载体就是类,类通常会对客户隐藏其实现细节,这就是封装的思想。
2、继承性
继承是实现重复利用的重要手段,子类通过继承,复用父类属性和行为的同时又添加了子类特有的属性和行为。
3、多态性
将父类对象应用于子类的特点就是多态,子类继承父类特征的同时,也具备了自己的特征,并且能够实现不同的效果,这就是多态化的结构。
(二)类与对象
1、成员变量
2、成员方法
3、构造方法
什么是构造方法?
私有构造方法
4、局部变量
局部变量的有效范围:
注意: ①java中不同区域中可以有同名变量;②在同一区域中不可以定义相同名称和类型的局部变量
5、this关键字
变量与参数同名怎么办?
因此我们就引入了this关键字
注意: this()语句之前不可以有其他代码
6、static关键字
静态变量
静态常量
静态方法
静态代码块【声明类对象的时候,就会执行】
二、面向对象核心技术
(一)类的封装
将对象的属性和行为封住起来,而将对象的属性和行为封住起来的载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想
(二)类的继承、extends关键字
1、继承
2、extends关键字
在java中让一个类继承另一个类需要使用extends关键字.
语法:类1 extends 类2
注意:java仅支持单继承
3、方法的重写
父类的成员都会被子类继承,当父类中的某个方法并不适用于子类时,就需要在子类中重写父类的这个方法。
在继承中还有一种特殊的重写方式,子类与父类的成员方法返回值、方法名称、参数类型及个数完全相同,唯一不同的是方法实现内容,这种特殊的重写方式被称为重构。
super关键字
super关键字代表父类对象,且必须放第一位;
4、所有类的父类—Object
注意:Object类中的getClass()、notify()、notifyAll()、wait()等方法不能被重写,因为这些方法被定义为final类型。
getClass()方法
getClass方法会返回某个对象的执行时的Class实例,然后通过Class实例调用getName()方法获取类的名称。
getClass().getName;//获取名称
toString()方法
toString()方法会返回某个对象的字符串表示形式。当打印某个类对象时,将自动调用重写的toString()方法。
equals()方法
Object类中的equals()方法比较的是两个对象的引用地址是否相等。
(三)类的多态【一种定义、多种实现】
类的多态性可以从两方面体现:①是方法的重载;②类的上下转型;
1、方法的重载
2、类的上下转型
即把子类对象赋值给父类类型的对象,这种技术被称为“向上转型”;
说明:当使用显示类型转换向下转型时,必须向编译器指明将父类对象转换为哪一种类型的子类对象;
3、instanceof关键字【判断父类对象是否为子类的实例】
使用instanceof关键字的表达式返回值为布尔值;
(四)抽象类与接口
抽象类
在java中,把类似无法使用具体语言定义的图形类称为抽象类【抽象类不能产生对象实例】
抽象类与抽象方法【继承类必须重写抽象方法】:
具体实现:
使用抽象类和抽象方法时,需要遵循以下原则:
①在抽象类中,可以包含抽象方法,也可以不包含抽象方法,但是包含了抽象方法的类必须被定义为抽象类;
②抽象类不能直接被实例化;
③抽象类被继承后,子类需要重写抽象类中的所有抽象方法;
④如果继承抽象类的子类也被声明为抽象类,则可以不用重写父类中所有的抽象方法;
什么是接口?
接口是抽象类的延伸,接口中所有的方法都没有方法体;
implements是一个类,实现一个接口用的关键字,它是用来实现接口中定义的抽象方法;
说明:在接口中定义的任何变量都自动是static和final的,因此,在接口中定义变量时,必须进行初始化,而且,实现接口的子类不能对接口中的变量重新赋值;
接口的声明及实现类
多重继承(接口最大的优势)
区分抽象类与接口
抽象类与接口的五点不同:
访问控制
1、访问控制符
注意:声明类时,如果不使用public修饰符设置类的权限,则这个默认为default(缺省)修饰;
使用访问控制符时,需要遵循以下原则:
①大部分顶级类都使用public修饰符
2、java类包
3、final关键字【最后的最终的】
①被final修饰的类、方法和变量不能被改变;
②被final修饰的类不能被继承;
③被final修饰的方法不能被重写;
④final关键字可用于修饰变量,一旦变量被final修饰,就不可以再改变变量的值,通常把final修饰的变量称为常量;
(五)内部类
匿名内部类:
匿名内部类的特点是只需要使用一次,也就是说,匿名内部类不能被重复使用;
语法如下:
new A{
...//匿名内部类的类体
};
abstract class FreshKeepingFilm {
// 创建“保鲜膜”抽象类
abstract void pack(); // 定义抽象的包装方法
}
public class Sausage {
// 创建香肠类
public static void main(String[] args) {
new FreshKeepingFilm() {
// 创建匿名内部类FreshKeepingFilm的对象
@Override
void pack() {
// 重写抽象的包装方法
System.out.println("缠上保鲜膜为香肠保鲜");
}
}.pack(); // 匿名内部类FreshKeepingFilm的对象调用重写抽象的包装方法
}
}
使用匿名内部类时应该遵循以下原则:
①匿名类没有构造方法;
②匿名类不能定义静态的成员;
③匿名类不能用private、public、protected、static、final、abstrac等修饰;
④只可以创建一个匿名类实例。
什么情况下会使用匿名内部类?
其实匿名内部类和其他类有着相同的内部结构,只不过匿名内部类创建出的对象没有被具体的变量所引用,所以匿名内部类是“一次性”的。如果创建出的类对象有且仅有一次, 在这种场景中就可以考虑使用匿名内部类。