面向对象的三大特征:继承 封装 多态
继承:
- 将多个类重复的内容放到一个新的类中,使用extends关键字让原来的类和新的类产生关联关系–继承,新的类叫做子类,原来的类是父类
- 子类可以继承父类的部分信息(父类的私有化信息,构造方法,构造代码块不能被继承)
- 继承方式:单继承,子类只能有一个父类,父类可以有多个子类
**重写:**重写原则
- 前提:出现在继承中-----方法签名一致
- 当父类方法返回值类型是基本类型/void类型时,那么子类返回值类型要和父类返回值类型保持一致
- 当父类方法返回这类型是引用类型时,那么子类方法返回值和父类方法返回值类型一致,要么是父类方法返回值的子类
-`class A{}
class B extends A{}
class C{
public A m(){return null;}
}
class D extends C{
public A/B m(){return null;}
}
- 子类方法访问权限修饰符要么和父类方法访问权限修饰符范围一致,要么子类访问权限修饰符比父类方法访问权限修饰符的范围要大 -class A{
void m(){}
}
class B extends A{
public void m(){}
}
`访问权限修饰符:
多态:
java分为编译时期、运行时期
编译时多态–在编译时期绑定代码–重载 编译的时候保证重载不报错就好
public void m(){}
public void m(int m){}
运行时多态—在运行时期绑定代码—重写 在运行的时候才知道调用的是哪个方法 向上造型(重写)
**向上造型:**
可以调用那些方法看父类----父类中的方法一方面被子类重写了,另外一方面子类可以继承父类的部分信息
方法的具体执行调用看子类---如果子类重写了父类的方法,那么子类优先调用本类的方法,否则向上查找,一直向上查找,父类的父类也可以,如果没有找到,则报错停止程序。
多态优点:
- 统一参数类型
- 降低耦合度(高内聚,低耦合)
- 体现的是子类的不同展示,实现不同,相当于方法的增强
封装:
体现形式–方法,属性私有化并且提供公共的访问方式进行正常取值,正常赋值,提高代码数据安全性
publicstaticvoidmain(String[]args){
//创建代表人的类的对象
Personp=newPerson();
//给对象属性赋值
//p.name="豆豆";
//调用方法间接给私有化属性进行赋值
p.setAge(-10);
//p.gender='男';
//调用方法间接给私有化属性进行取值
//System.out.println(p.name+","+p.getAge()+","+p.gender);
}
}
//代表人的类
classPerson{
//属性
privateStringname;
//私有化属性,只能在本类中直接使用
privateintage;
privatechargender;
//Alt+Insert---Generate---GetterandSetter
//java自动提供
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicchargetGender(){
returngender;
}
publicvoidsetGender(chargender){
this.gender=gender;
}
/*//定义方法间接的给私有化属性进行赋值
publicvoidsetAge(intage){
if(age<0){
System.out.println("数据有误!!!");
}else{
this.age=age;
}
}
//定义方法间接的给私有化属性进行取值
publicintgetAge(){
returnage;
}*/
/*//有参构造
publicPerson(intage){
if(age<0){
System.out.println("数据有误!!!");
}else{
this.age=age;
}
}*/
}
在class字节码文件中的封装:完全的对于类的封装,将类进行模块化封装,所有的成员变量封装到Fields域中,将所有的方法封装到Mehtod域中,将所有的构造方法封装到Constructor域中,在JVM中提供一个Class对象作为class对象的访问域的接口,从而将类进行模块化存在,实现反射的基础
对象中的封装,是将属性进行私有化,提供setXX() getXX()方法在外部进行属性私有化的赋值和取值访问,不会造成数据的泄露
**Final关键字:**关键字,修饰符—>数据、方法、类
作用:保证java中某些资源是不能被改变的
最终值:
1. 当final修饰基本类型数据时,值不能改变
2. 当final修饰引用类型数据时,地址值不能改变
3. 当final修饰成员变量,保证对象创建完成之前确定值----构造代码块 构造方法,静态代码块
4. 当final修饰静态变量时(静态常量),保证类加载完成之前给值----静态代码块(只能)
class SmallPerson extends SuperMan{
final static int i;
static{
i=0;
}
public SmallPerson(){
//i=1;
//super();
}
}
**```
修饰方法:**
1. 支持重载 ---重载的方法不是同一个方法,所以支持重载
2. 不支持重写 ----重写的方法,子类要进行改写,而本身创建的初衷就是不能改变,只能是最终的方法
```html
publicclassFinalDemo3{
}
classFDemo1{
publicfinalvoidn(){}
//支持重载
publicfinalvoidn(inti){}
}
classFDemo2extendsFDemo1{
//@Override
//不支持重写
//publicfinalvoidn(){}
}
修饰类:
- 可以继承别的类 ----- 继承的类是别得
- 不能被别的类继承 ----final表示的就是不希望外界打扰所以不能被别的类进行扩展,表示的是不可改变
**修饰参数:**----方法中修饰参数的表示的是变量的值只能被赋值,不能对这个值进行修改 i 和value都不能进行修改 public void finalFunc(final int i, final Value value) { // i = 5; 不能改变i的值 // v = new Value(); 不能改变v的值 value.v = 5; // 可以改变引用对象的值 }
