什么是面向对象
Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP)。面向对象编程更贴近实际生活的思想。总体来说面向对象的底层还是面向过程,面向过程抽象成类,然后封装,方便使用就是面向对象,(万物皆对象)。
面向对象的三大特征:封装,继承,多态。
封装(Encapsulation)
封装是面向对象的特征之一。核心思想就是“隐藏细节”、“数据安全”,将对象不需要让外界访问的成员变量和方法私有化,只提供符合开发者意愿的公有方法来访问这些数据和逻辑,保证了数据的安全和程序的稳定。所有的内容对外部不可见。
通常,禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。 信息隐藏是用户对封装性的认识,封装则为信息隐藏提供支持。
继承(inheritance)
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
java中使用继承需要使用extends关键字。
派生类(子类)可以从它的基类(父类)那里继承方法和实例变量,并且派生类(子类)中可以修改或增 加新的方法使之更适合特殊的需要继承性很好的解决了软件的可重用性问题。
继承的好处:
1.提高类代码的复用性
2. 提高了代码的维护性
3.使得类和类产生了关系,是多态的前提
this与spuer
super注意点:
1.调用父类的构造方法,必须在构造器中的第一行
2.必须出现在子类的方法或者构造器中
3.super和this不能同时调用构造方法
this:
this与super区别:
代表的类不同:
this 本身调用者这个对象
super 代表的是父类对象的应用
构造方法:
this() 本类的构造方法
super() 父类的构造
其他:
this 表示当前对象。
super 不能表示当前对象
变量:
this 变量 调用的当前对象的变量;
super 变量 直接调用的是父类中的变量。
参数:
this 调用(转发)的是当前类中的构造器;
super 用于确认要使用父类中的哪一个构造器。
方法重写:
需要有继承关系,子类重写父类的方法
- 子类与父类方法名相同。
- 方法参数相同
- 修饰符 范围可以扩大 public -> protected -> default -> private
- 抛出异常:范围可以缩小但是不可以扩大
方法重载:
- 发生在同一个类中
- 方法名相同
- 方法中的参数不同(参数个数,参数顺序,参数类型)
注意:
方法重载和返回值类型无关
方法重载和修饰符列表无关
多态(polymorphism)
多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。
什么是多态
生活中多态
同一个操作,由于条件不同,产生的结果不同。
程序中多态
同一个方法,不同的对象可以做出不同响应。
同一引用类型,使用不同实例(对象)而执行不同操作。
多态实现三要素
- 重写
- 父类的引用指向子类的对象
- 有继承关系
static与final
什么是static
静态变量对于类而言在内存中只有一个,能被类的所有实例所共享。实例变量对于类的每个实例都有一份, 它们之间互不影响.
static变量
在类中,使用static修饰的成员变量,就是静态变量,反之为非静态变量。静态变量属于类的,"可以"使用类名来访问,非静态变量是属于对象的,"必须"使用对象来访问。
public class Student{
private static int age;
private double score;
public static void main(String[] args) {
Student s = new Student();
//推荐使用类名访问静态成员
System.out.println(Student.age);
System.out.println(s.age);
System.out.println(s.score);
}
}
static方法
与在类中,使用static修饰的成员方法,就是静态方法,反之为非静态方法。
静态方法数属于类的,"可以"使用类名来调用,非静态方法是属于对象的,"必须"使用对象来调用。
静态方法"不可以"直接访问类中的非静态变量和非静态方法,但是"可以"直接访问类中的静态变量和静态 方法。this和super在类中属于非静态的变量.(静态方法中不能使用)
public class Student{
private static int count;
private int num;
public void run(){
}
public static void go(){
}
public static void test(){
//编译通过
System.out.println(count);
go();
//编译报错
System.out.println(num);
run();
}
}