年轻一代的程序员的一天就是从早修bug到晚上修bug,而我叔叔退休后决定练练书法,花重金购入文房四宝,一番研墨拟纸并点上上好的檀香,定神片刻,泼墨挥毫,郑重的写下:Hello World!
面向对象编程
编程语言根据解决问题的思维方式的不同分为面向过程编程和面向对象编程
面向过程编程
C语言就是典型的面向过程编程,事物比较简单,可以使用线性思维解决,具体每一个实现步骤清晰可见
面向对象编程
java语言,事物比较复杂使用简单的线性思维无法解决,存在对象与对象之间的引用。
共同点
- 都是为了解决实际问题的一种方式。
- 当解决问题时,面向对象是从宏观角度把握问题的整体,面向过程是从微观角度实现具体细节,两者之间相辅相成。
面向对象的三大特征
封装
封装是面向对象编程的核心思想,将对象的属性和行为封装起来,其载体就是类。对类的成员属性进行隐藏(私有化)对类中的成员方法公有。
- 对类的成员属性的封装,提供对属性的访问给属性添加公有的get和set方法。
- 对代码的封装,使用方法加参数传递对代码进行封装,并使方法公有。
类
什么是类
一类事物的抽象的模板,在现实世界中,类就是任意一类事物。类是封装对象的属性和行为的载体,反过来说具有相同属性和行为的一类实物被称为类。
类的定义
类的定义使用class关键字来定义一个类。
public class 类名 {
...
}
类的组成
类由静态特征和动态特征组成,静态特征就是成员属性,说的通俗点成员属性就是这个类里的变量。动态特征就是类的行为,什么是类的行为,就是这个类的里的方法。好比一个人就是一个类,这个有什么眼睛,鼻子,手等,这些都是这个人的器官,也就是这个类的属性。这个人会吃饭,睡觉等,这些是这个人的行为,这些行为就是类的方法。通过调用方法就能实现这个类的行为。
对象
类是一个抽象的,不能实现的,而对象就是,实现这个抽象。例如:有一个鸟类-这个类里有翅膀属性和飞行的方法。然后通过new关键字,将这个鸟类实例化,然后实例化出来的对象就好比是鸽子。而不再是鸟了。将它具体化,人是一个类,new一个对象就是一个人,小明这个人会吃饭,睡觉。
- 在这一类事物中,具体的某一个个体就是对象
- 在程序中对象就是new出来的有内存空间
语法
//将鸟这个类实例化对象--bird就是这个鸟的实例化对象
Bird bird = new Bird();
//通过‘.’调用鸟类中的方法
bird.flight();
类与对象
类是抽象的,对象是具体的,对象是由类创建的实例
static静态关键字的使用
静态关键字可以用于变量,方法,和普通代码块。
1、静态变量
同一个类的不同实例对象可以共用同一静态变量
静态变量可以被其他对象修改
2、静态方法
可以在不创建类对象时调用静态方法
3、静态代码块
用static修饰代码区域可以称之为静态代码快,在声明类对象的时候就会被执行。非静态代码块每次创建对象的时候,会在构造方法之前运行
使用this关键字来代表本类对象的引用,this关键字被隐式地用于引用对象的成员变量和方法
- 成员方法只在使用对象调用的时候才会运行
方法
将一个功能抽取出来,放在类里面,形成一个独立的功能,当需要使用该功能的时候,通过创建对象此类的对象调用此方法。
方法的定义
//方法必须定义在类的里面
public void 方法名() {
...
}
注方法名一般是第一个单词首字母小写,后面单词首字母大写。
方法的分类
类的主方法mian方法
main方法,程序的入口
- 主方法必须是静态的
- 主方法没有返回值
- 主方法的形参为数组String[] ages
- 形参就是方法里(参数类型 参数名)的总称
public static void mian(String[] ages) {
...
}
在IDEA里面可以使用每个单词的前面的字母快捷输出主方法。
构造方法
概要:
1.构造方法的名称要与本类同名
2.构造方法没有返回类型,也不能定义void
3.构造方法的主要作用是完成对象的初始化工作,他能把定义对象的参数
构造方法又分为:
- 无参构造方法
- 有参构造方法
传给对象成员(对类的属性在创建对象是初始化属性)
- 当没没有构造方法时编译器会自动创建
- 有参构造方法会覆盖无参构造方法
成员方法
成员方法分为:
1、无参无返回值
public void way() {
...
}
2、无参有返回值
public int way() {
...
}
3、有参无返回值
public void way(int a) {
...
}
4、有参有返回值
public itn way(int a) {
...
}
- 成员方法的方法名不能是本类的类名
继承
继承是实现重复利用的重要手段,子类通过继承,复用父类属性和行为的同时又添加了子类特有的特有的属性和行为。 用于定义类与类之间的关系
一个类可以继承一个类。
继承的extends关键字,一个类继承另一个类使用extends关键字。
方法重写
父类的成员都会被子类继承,当父类中的某个方法并不适用于子类时,就需要在子类中重写父类的方法。
super关键字
用于子类,继承父类后父类方法被重写后使用super调用父类的方法。
Object类
所有类的子类
在Java中所有类都直接或间接的继承了Object类,它是所有类的父类
Object类中常用的方法
toString()返回某个对象的字符串形式
getClass()返回某个对象执行时的Class实例
equals()比较两对象的引用地址是否相同
多态
含义
- 将父类对象应用于子类的特征就是多态。
- 在继承关系中,一个类的对象可能呈现不同的状态。
- 一种定义,多种实现。
方法重载
一个类中,存在相同方法名的两个及以上的方法,且他们的参数列表不同,不考虑参数名,不考虑返回值类型
- 参数类型不同
- 参数个数不用
- 参数顺序不用
一个类中不能存在完全相同的方法,他们是重复的方法,JVM编译不通过。
方法和属性的调用规则
- 属性: 当子类和父类中存在相同属性时 ,以对象的左边引用类型为依据,所谓“看左边”
- 方法: 以当前new出来的对象为依据,如果方法重写了,就调用子类方法,如果方法没有重写 调用父类方法
- 静态方法: 无论方法是否有重写, 都已对象左边的引用类型为依据。
基于继承和基于实现类实现
子类或实现类必须对方法进行重写(没有重写不具备多态行为)
父类的引用指向子类对象(接口的引用指向实现类的对象)
向上转型
把子类对象赋值给父类类型的对象,这种技术被称为:向上转型
向下转型
将父类对象强制转换为某个子类对象的方式被称为显示类型转换
父类对象要变成子类的对象,必须通过显式类型转换才能实现
重写和重载
重写是重新编写父类的方法,而重载是方法名相同他们的参数个数,参数类型,参数顺序各不相同。
共同点:它们的方法名是重复的
instanceof关键字
判断某一个对象是否继承自某一个类,判断对象和指定类是否有继承关系。返回一个Boolean值。
语法:
if(对象名 instanceof 类名) {
...
}
访问修饰符
public公有-那里都可以看到
private私有-只在本类中可见
protected被保护-其他包中的非子类不可见
default-默认只在本类和本包可见
抽象类
抽象类及抽象方法
抽象类
- 抽象类不能创建对象实例
- 抽象类除了被继承外没有任何作用
- 使用abstract关键字定义的类被称为抽象类
语法:
public abstract class 类名{
...
}
抽象方法
public abstract 方法返回值 方法名(参数);
接口
接口使用interface关键字创建接口类
语法:
public interface 接口名{
...
}
实现接口使用implements关键字,实现一个接口需要实现接口中的所有方法。一个类可以实现多个接口。
多重继承
Java中类不允许多重继承,但使用接口可以实现多重继承,继承多个接口使用“,”隔开。
区分抽象类和接口
共同点:他们都是抽象的,都不能实例化
不同点:
比较项 | 抽象类 | 接口 |
---|---|---|
方法 | 可以抽非抽象方法 | 所有方法都是抽象方法 |
构造方法 | 有构造方法 | 没有构造方法 |
继承 | 一个类只能继承一个父类 | 一个类可以同时实现多个接口 |
被继承 | 一个类只能继承一个父类 | 一个接口可以同时继承多个接口 |
final关键字
final变量
final修饰的变量的值不能被更改
使用static final定义的常量必须使用大写字母命名,且多个单词之间必须使用_连接,这是Java编码规范
static final int VALUE_DOME = 1;
final方法
final修饰的方法不能被重写
同时final方法执行效率高于非final方法
public final void 方法名() {
...
}
final类
final修饰的类不能被继承也不许其他人对这个类进行任何更改
public final class 类名 {
...
}
内部类
成员内部类
语法:
public class Out {
public class in { //内部类
...
}
}
成员内部类,一个类除了有成员变量、成员方法,成员内部类也可以作为类的成员。
一次性用品:匿名内部类
特点:只需要使用一次的类叫内部类,也就是说匿名内部类不能被重复使用,即:
- 匿名内部类用完就会立即消失
- 匿名内部类没有构造方法
- 匿名类不能定义静态的成员
- 匿名内部类部不能使用public等修饰符
- 匿名类实例只能创建一个
语法:
new 父类构造器(参数列表)|实现接口()
{
//匿名内部类的类体部分
};