目录:
1、面向对象
2、面向对象三大特性
3、this和super
4、内部类
5、抽象类
6、接口
7、代码块
1. 面向对象
面向对象相对于面向过程,面向过程是你要解决一个问题,于是你制定了一系列流程,先做什么,接着做什么,一步步来解决这个问题,而面向对象则是你要解决一个问题,然后你制定一件东西做这件事,再做另一件东西做另一件事,然后这些东西相互配合操作。
就好比如说你和你男朋友,你想喝红枣银耳汤,你找到你男友让他来解决你这个需求,你男友要让你喝上银耳汤,首先得有炖锅,他先在京东挑了一个炖锅,有了炖锅之后还要有食材,于是他又去超市买银耳、红枣、冰糖等材料,之后他还要泡发银耳,清洗炖锅,最后他开始炖银耳汤,然后端来给你喝。在这一整个过程中,你找男友来解决,这是面向对象;你男友解决你要喝银耳汤的这个需求则是通过面向过程来实现的。
所以说,面向对象就是,找对象、创建对象、使用对象并维护对象之间的关系
- 类 :对现实中事物的描述 ,就是以.class结尾的文件
- 对象 : 实实在在存在的事物 ,就是new 出来的对象
2、面向对象三大特性
面向对象的三大特性:封装、继承、多态
2.1、 封装 :
将类中数据和功能隐藏起来,不允许对象直接访问。但对外会提供一定的访问方式,可以定义抽象类或私有化构造函数。
2.2、继承:
在已有数据功能的基础上,定义一个新类,从而实现功能扩展,子类不能选择性地继承父类的部分内容。
2.3、多态:
java程序运行时,相同的数据可能赋给不同类型的对象。不同对象会调用不同的方法,产生不同的运行效果,由此产生多态。
子父类的相互转换:
子类 --> 父类:向上转型
父类 --> 子类:向下转型
public class Test {
public static void main(String[] args) {
putOnSale(new Food()); // 以 Food 对象调用 putOnSale 方法
putOnSale(new MemberCard()); // 以 MemberCard 对象调用 putOnSale 方法
Goods goods = new Food(); // 向上转型
goods.showGoodsInfo(); // 调用的是 Food 的 showGoodsInfo
Food food = (Food)goods; // 向下转型
food.onSale(); // 调用的是 Food 的 onSale
}
// 货品上架
public static void putOnSale(Goods g) {
g.showGoodsInfo();
// 类型判断
if (g instanceof Food) { // 食品类上架
Food food = (Food)g;
food.onSale();
} else if (g instanceof MemberCard) { // 会员卡类上架
MemberCard memberCard = (MemberCard)g;
memberCard.onSale();
}
}
}
class Goods{
String name;
double price;
public void showGoodsInfo(){
syso("name:"+name + "price: ¥"+price);
}
}
class Food extends Goods{
public void putOnSale(){
syso("食品,上架");
}
}
class MemberCard extends Goods{
public void putOnSale(){
syso("会员卡,上架");
}
}
3.this和super
- this :代表当前活动的类
this.成员变量
this.成员方法
this([参数列表]) // 构造方法 - super :代表当前活动类的父类
super.变量
super.方法
super([参数列表]) // 父类的构造函数
4.内部类
内部类可以分为静态内部类、非静态内部类、局部内部类和匿名内部类
- 静态内部类
可通过本类直接调用,不需要创建对象,只能访问外部类的静态成员 - 非静态内部类
不允许定义静态成员 - 局部内部类(定义在方法中的内部类)
不能使用静态修饰符和访问修饰符修饰
不能再外部类以外的部分使用
只能访问方法中的常量 - 匿名内部类
使用一次即刻消亡
5. 抽象类
抽象类是被abstract修饰的类,可含有抽象方法和非抽象方法。抽象类必须被继承否则无存在的意义。
继承类要重写所有的抽象方法,否则该子类还是抽象类,而且该子类必须定义成抽象类。
6. 接口
所有方法都被抽象关键字abstract修饰,实现接口(implements)的类必须实现接口的所有方法,支持多实现
接口只能被接口继承
java支持多继承,这一点只体现在接口上,一个类可以实现多个接口,但是只能继承一个类,不能继承多个类。
- 特点
接口是对外暴露的规则
接口是程序的功能扩展,降低耦合性
可用来多实现
类与接口之间是实现关系,而且类可以多实现
接口与接口之间可以继承,而且可以多继承。
7、代码块
7.1、静态代码块
static { 操作语句 }
静态代码块随着类的加载而加载
7.2、构造函数代码块
在类上,随着对象的加载而加载
class Persion{
public Persion(){ 操作语句 }
}
7.3、普通代码块
在方法内部,随着方法的调用而加载,也叫局部代码块。
局部代码块可以限制变量的生命周期,也就是说在代码块中创建的变量只在代码块中有效,当代码块运行结束,变量就会被释放,从而节省内存空间。
public void work(){
{ 操作语句 }
}
使用过程中要注意下面的两种情况:
// 报错:
void method() {
int age = 10;
{
int age = 100; //此处报错[Duplicate local variable age];去掉前面的int类型声明即可
}
System.out.println("age = " + age);
}
// 不报错
void method() {
{
int age = 100;
}
int age = 10;
System.out.println("age = " + age);
}
7.4、操作顺序
优先执行顺序是静态代码块 > main()方法 > 构造代码块 > 构造方法。
优先级是父类静态代码块 > 子类静态代码块 > 父类构造代码块 > 父类构造方法 > 子类构造代码块 > 子类构造方法。
7.5、同步代码块
同步代码块,用于解决线程同步问题。
//下列两个方法有什么区别
// 同步方法
public synchronized void method1(){}
// 同步代码块
public void method2(){
synchronized (obj){}
}