java类 接口
final关键字
final关键字的用法:
- final关键字修饰一个基本类型的变量时,该变量不能重新赋值,第一次的值为最终的。
- final关键字修饰一个引用类型变量时,该变量不能重新指向新的对象。
- final关键字修饰一个函数的时候,该函数不能被重写。
- final关键字修饰一个类的时候,该类不能被继承。
常量的修饰符一般为: public static final
注意:用法2和以下情况的区别:
这里final的变量c和test函数里的c是不同的c,所以没有违反条件2。
注意函数参数的传递是值传递,而不是引用传递。
抽象类
抽象类的好处: 强制要求子类一定要实现指定的方法。
抽象类要注意的细节:
- 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象的函数。。
- 如果一个类出现了抽象的函数,那么该类也必须 使用abstract修饰。
- 如果一个非抽象类继承了抽象类,那么必须要把抽象类的所有抽象方法全部实现。
- 抽象类可以存在非抽象方法,也可以存在抽象的方法.
- 抽象类可以不存在抽象方法的。
- 抽象类是不能创建对象的。
疑问:为什么抽象类不能创建对象呢?
因为抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象的对象
调用抽象方法是没有任何意义的。 - 抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。
//动物类--->抽象类 abstract class Animal{ String name; String color; public Animal(String name,String color){ this.name = name; this.color = color; } //非抽象的方法 public void eat(){ System.out.println(name+"吃粮食"); } //移动... public abstract void run(); }
- 注意事项:
abstract不能与以下关键字共同修饰一个方法:
- abstract不能与private共同修饰一个方法。
- abstract 不能与static共同修饰一个方法。
- abstract 不能与final共同修饰一个方法。
值交换
值传递: 调用一个方法的时候,传递给方法的参数 ,实际上传递变量所存储的值。
引用交换:
引用类型变量虽然不一样,但是操纵的实际对象是一样的,因为传参数传的是地址
如果是是不同的引用类型变量操纵同一个对象,那么肯定会影响结果
接口
一个类最多只能有一个直接的父类。但是有多个间接的父类。
接口要注意的事项 :
- 接口是一个特殊的类。
- 接口的成员变量默认的修饰符为: public static final 。那么也就是说接口中的成员变量都是常量。
- 接口中的方法都是抽象的方法,默认的修饰符为: public abstract。
- 接口不能创建对象。
- 接口是没有构造方法的。
- 接口是给类去实现使用的,非抽象类实现一个接口的时候,必须要把接口中所有方法全部实现。
接口的作用:
- 程序的解耦。 (低耦合)
- 定义约束规范。
- 拓展功能。
类与接口要注意的事项:
- 非抽象类实现一个接口时,必须要把接口中所有方法全部实现。
- 抽象类实现一个接口时,可以实现也可以不实现接口中的方法。
- 一个类可以实现多个接口。
接口与接口之间关系: 继承关系。
接口与接口之间要注意事项:
- 一个接口是可以继承多个接口的。
多态
面向对象的三大特征:
1. 封装
2. 继承。
3. 多态
多态:一个对象具备多种形态。(父类的引用类型变量指向了子类的对象或者是接口的引用类型变量指向了接口实现类的对象)
多态的前提:必须存在继承或者实现关系。
动物 a = new 狗();
多态要注意 的细节:
- 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
- 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
- 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
- 多态情况下,不能访问子类特有的成员。
总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的。
编译看左边,运行不一定看右边。
编译看左边:java编译器在编译的时候,会检查引用类型变量所属的类是否具备指定的成员,如果不具备马上编译报错。