学习记录之面向对象2
必须声明同时初始化
常常由类名来访问,不能被改变
建议:常量名所有字母都大写,多个单词用_分隔
编译器在编译时会将常量直接替换为具体的值,效率高
由abstract修饰
只有方法的定义,没有具体的实现(连{}都没有)
抽象类:
封装共有的属性和行为-----------------代码复用
为所有派生类提供统一的类型--------向上造型(代码复用)
重写所有抽象方法-------------------变不完整为完整
也声明为抽象类-----------------------一般不这么用
由abstract修饰
包含抽象方法的类必须是抽象类,不包含抽象方法的类也可以声明为抽象类
抽象类不能被实例化(new对象)
抽象类是需要被继承的,派生类:
抽象类的意义:
封装共有的属性和行为-----------------代码复用
为所有派生类提供统一的类型--------向上造型(代码复用)
可以包含抽象方法,为所有派生类提供统一的入口(能点出来),派生类的具体实现不同,但入口是一致的,同时达到强制必须重写的目的
类中套类,外面的称为外部类,里面的称为内部类
内部类通常只服务于外部类,对外不具备可见性
内部类对象通常在外部类中创建
内部类中可以直接访问外部类的成员(包括私有的)
若想创建一个类(派生类)的对象,并且对象只被创建一次,可以做成匿名内部类
是一种引用数据类型
由interface定义
只能包含常量和抽象方法
接口不能被实例化(new对象)
接口是需要被实现/继承的,实现类/派生类:必须重写所有抽象方法
一个类可以实现多个接口,用逗号分隔。若又继承又实现时,应先继承后实现
类和类-------------------------继承
接口和接口-------------------继承
类和接口----------------------实现
设计规则:
将所有派生类所共有的属性和行为,抽到超类中----------------------抽共性
若派生类的行为都一样,设计为普通方法
若派生类的行为都不一样,设计为抽象方法
将部分派生类所共有的属性和行为,抽到接口中
接口是对继承单根性的扩展-----------------------------------实现多继承
接口是一个标准、规定----------后期慢慢体会,现在先不需要纠结
如何调错:
将方法的调用都注释起来,然后一个一个的放开,放开哪个报错问题就在哪个方法
快速锁定问题方法:
打桩:System.out.println(数据);
意义:
同一个对象被造型为不同的类型时,有不同的功能
---对象多态:我、你、水-------------------所有对象都是多态的(明天再详细讨论)
同一类型的引用指向不同的对象时,有不同的实现
---行为多态:cut(),move(),getImage()......---------所有抽象方法都是多态的
向上造型:
超类型的引用指向派生类的对象
能点出来什么,看引用的类型
能造型成为的类型有:超类+所实现的接口
强转类型转换,成功的条件只有如下两种:
引用所指向的对象,就是该类型
引用所指向的对象,实现了该接口或继承了该类
强转时若不满足如上条件,则发生ClassCastException类型转换异常
java.lang.String使用final修饰,不能被继承
java中的String采用Unicode编码格式,任何一个字符都占用两个字节
String字符串底层封装了字符数组
java对字符串有一个优化措施:字符串常量池(堆中)