2017年7月1日 上午9:30
1.继承
修饰符
修饰符:
本类 同包 子类 其他(不同包) 唯一的标准
private 🐶 是否在 同一个类
frendly 🐶 是否在 同包 默认的
protect 🐶 是否 继承
public 🐶 都
final
1. 方法 重写
2. 类 继承
3. 变量属性 修改 (当变量为对象时,final对象不可以=new Object(),但是仍然可以改变这个对象的属性)
super()
1. super只能在写方法中1 | package package1; |
2. super不在过构造方法时,可以不放在第一行
3. super不能访问父类private成员
4. super()
5. super(a,b) 调用带参构造
6. super.属性
7. super.方法继承的重写 方法的重载 对比
重写的条件
1. 类型相同/父类返回类型的子类
2. 修饰符只能扩大,不能缩小
3. 方法名,参数列表相同
4. 构造方法不能重写
重写之后的方法调用:
1 | pet dog = new dog(); |
重载的条件
1. 同一个类中
2. 参数列表不同
3. 方法名相同
4. 和返回值,访问修饰符无关
instanceof
1. pet instanceof Dog
2. instanceof 使用:对象.instanceof(父类/接口)2.多态
多态概念+要求(多态的前提是继承)
多态概念:同一个引用类型,使用不同的实例而执行不同操作
父类存在的地方一般都能使用子类代替
1. 要素:
1. 子类重写父类分方法
2. 使用父类的类型
2. 使用的地方:
1. 方法参数
2. 方法返回值对java继承的测试(通过this)
1 | //父类 |
总结:
1. 在继承中,如果子类没有重写父类的方法,那么子类是调用的是父类的方法
2. 这里的调用,是在父类中执行,而不是在子类中执行(原来理解的是在子类中执行)
3. 因为:继承下来的setSite()方法中写的是this,java有一下几种
1. 继承下来将this改为super,那么就无法操作父类中的私有方法,所以不可能
2. 子类中还是保持this,那么,this指代的是子类,所以不可能父类私有属性,所以不可能
3. 这个this还是指向的父类,那么,说明本身父类也是存在的,像C++一样,在产生子类对象的时候,父类对象其实也产生了,那么这个setSite()其实父类对象自己执行的
4. 这三个的输出结果是一样的
this.setSite(site);
super.setSite(site);
setSite(site);
5. 继承不是拥有这项技能,而是能让父类帮你干,你自己其实不会。
3.抽象
抽象类要求
1. 抽象类不能实例化 --- 因为没有意义
2. `Pet pet = new Dog() //pet是abstract`
3. 是对的 这只是一个指针指向 没有分配空间进行实例化
4. 抽象类中可以有0个或者多个抽象方法
5. 子类中,抽象方法在子类中必须实现接口
接口的要求
1. 接口不能实例化
2. 实现类必须实现接口的所有方法
3. 变量都是静态变量
4. 现类可以实现多个接口
5. 方法:public abstract void service(); 不能用static
6. 变量:public static final double PI = 3.14;总结
- 现在对比下来继承绝对是老大,知识点多。
- 继承是 多态 + 重写 的前提
- 继承+抽象 +接口在生成对象比较
继承:
继承就不用说了,多态的上转型的概念理解的就像!
抽象:
1 | MotoVehicle moto[] =new MotoVehicle[4]; |
1. **这个MotoVehicle是abstract类**,但是能用new,这个例子就充分的说明了,new != 分配空间。
2. 在这里,他仅仅说明了moto[]的长度
3. **对象初始化挪到了后面,为了集中说明一个知识点!**接口:
1 | public class Test1 implements Interface1 { |
对比三个发现:父类 抽象类 接口 这三个都可以
1. 直接声明对象
2. 调用对象的方法
3. 但是,不可以初始化对象本身(父类初始化自己)
错误
对象数组的初始化方法:
第一种:
1 | MotoVehicle moto[] = new MotoVehicle[]{ |
第二种:1 | for(int i = 0 ;i < n;i++){ |
对象的强制转换错误:
1 | Dog dog = (Dog)pet;//强制转换 |