面向对象的特征
封装、继承、多态、(有人问第四个特征,再加抽象)
封装
体现形式(2种)
函数—提高代码的复用性
属性的私有化—将属性设置为私有的,通过提供对外的访问方法来间接操作对应属性,可以在方法内对属性做一系列的限定使之符合要求—提高了代码的安全性
private 默认 protected public
1 2.5 3 4
本类 子类 同包类 其他类
权限修饰符
本类
子类
同包类
其他类
public
可以
可以
可以
可以
protected
可以
可以
可以
不行
private
可以
不行
不行
不行
默认
可以
同包子类可以
可以
不行
继承
对一些类中共有的属性和方法进行提取,提取出来一个新的类,通过extends关键字是新的类和原来的来产生联系,这种联系称之为继承。新的类称之为父类(超类、基类),原来的类称之为子类(派生类)
注意:Java中支持的是单继承—一个子类只能有一个父类,而一个父类可以有多个子类
class A {
public int m(){return 0;}
}
class B {
public String m(){return “aaa”;}
}
class C extends A, B {}
C c = new C();
c.m();—返回值类型是什么?
优点
1. 提高安全性
2. 提高复用性
3. 统一结构
super关键字
在创建子类对象的时候,会先创建一个父类对象,而这个父类对象在子类中以super关键字的形式存在。super是父类对象的引用,可以认为是父类产生的一个虚拟对象
如果一个构造函数中已经存在了this语句,那么此时不能写super语句,此时如何创建父类对象?—this语句的作用?
子类的每个构造函数中都直接或者间接地有一个super语句—对
如果父类只提供了含参构造,子类的构造函数还能使用默认的super语句吗?—不能
可以通过this来调用父类中的方法或者属性吗?—可以。会先检查当前类中是否有对应属性,如果没有则再检查父类。
重写
在父子类中,存在了方法签名完全一致的方法,称之为函数的重写/覆盖
注意:重写遵守的五个原则:两等两小一大
1. 方法签名一致
2. 当父类中的方法的返回值类型是基本数据类型/void/最终类,子类重写方法的返回值类型必须一致
3. 当父类中的方法的返回值类型是引用数据类型的时候,子类方法的返回值类型要么和父类方法的返回值类型一致,或者子类方法的返回值类型是父类方法的返回值类型的子类
class A{
public Pet m(){}
}
class B extends A {
public Dog m(){};
}
4.子类方法的权限修饰符的范围要大于等于父类方法中权限修饰符的范围
多态
体现形式
编译时多态—重载
运行时多态—向上造型,重写—继承是运行时多态的前提
注意:用向上造型创建对象的时候,用父类声明,用子类创建;父类在声明的时候就相当于给了这个对象一份提纲;子类创建对象的时候是告诉这个对象该怎么干—能不能用看父类,具体执行看子类
重写的理解
1. 方法签名完全一致
2. 子类重写的方法的权限修饰符要大于等于父类
class A{
public void m(){}
}
class B extends A{
protected void m(){}
}
A a = new B();
a.m(); //a对象用A类来声明的,同时告诉a对象身上有一个公共的m方法,可以在任何地方使用;
在使用方法的时候需要看具体子类,这时候,子类中重写的这个方法告诉a不能在其他类中使用—这时候产生了冲突
3. 当父类中的方法的返回值类型是基本数据类型/void/最终类,子类重写方法的返回值类型必须一致
注意:八种基本数据类型之间是相互平等的,不存在继承关系
4. 当父类中的方法的返回值类型是引用数据类型的时候,子类方法的返回值类型要么和父类方法的返回值类型一致,或者子类方法的返回值类型是父类方法的返回值类型的子类
class A {
public void m(){}
}
class B extends A {
public void m(){}
public void mb(){}
}
class C {
public B mc(){return new B();}
}
class D extends C {
public A mc(){return new A();}
}
C c = new D();
c.mc().mb(); //声明c对象用的是C类,告诉了c对象身上有一个mc方法,并且返回值类型是B类,所以调用mc方法的时候可以用一个B类对象来接住结果,可以再次调用B类独显身上的mb方法;
实现用的是D类,具体执行mc方法的时候调用的是D类中的mc方法,D类中mc方法的返回值类型是A类,所以可以定义一个A类对象来接住方法执行后的结果,A身上有mb方法吗?—产生冲突
多态的产生是为了解耦
static
可以修饰变量、方法、代码块、内部类
类变量
static修饰变量,这个变量称之为成员变量或者类变量。静态变量随着类的加载而加载到方法区中的静态区,并且在静态区中被赋予初始值。由于静态变量是先于对象而存在的,可以通过对象来调用,也可以通过类名来调用,一般是通过类名来调用。由于该类创建的所有对象存储的是静态属性在静态区中的地址值,所以静态属性是被所有对象所共享的。—静态属性尽量少用
:http://www.linuxidc.com/Linux/2017-07/145841.htm