本章重点: 继承的概念,重写与抽象类本章难点: 1.理解存在继承关系时创建对象时的内存调用原理 2.理解抽象类 学习方法: 1.自己多想例子并分析,有了思路立刻动手实现,不要空想社会主义 2.根据需求找父类,定子类,发现属性,归纳特征 1.继承1.1 继承是面向对象的特征之一,子类继承父类则子类能拥有父类的方法与属性,这样的好处是复用代码,使结果清晰,它是多态的必要条件1.2 需要继承的类访问修饰符不能用protected 和 private修饰1.3 Object是所有java的类的父类,如果一个类没有显式的继承一个类那么它默认就继承Object类1.4 (1)完全继承:public 和 protected 修饰的属性和方法 (2)部分继承:同一个包内默认修饰符修饰的属性和方法 (3)不能继承: private修饰的属性和方法与构造函数1.5 创建子类对象之前,都会从最上级依次调用父类的构造函数。1.6 如果父类没有提供默认的构造方法,则必须用super关键字显式的调用父类的构造函数写至第一行
package org.lyrk.accp8.s2.chapter.two; /** * Created by niechen on 17/4/20. */ public class Test1 { public Test1() { System.out.println("Test1的构造函数"); } public static void main(String[] args) { new TestChildTwo(); } } class TestChildOne extends Test1 { public TestChildOne() { System.out.println("TestChildOne的构造函数"); } } class TestChildTwo extends TestChildOne { public TestChildTwo() { System.out.println("这个是TestChildTwo的构造函数"); } } //子类的访问修饰符不能是private 或者 protected //protected class TestChildThree extends TestChildTwo{ // //} 输出结果: Test1的构造函数 TestChildOne的构造函数 这个是TestChildTwo的构造函数
2.super关键字是对父类的引用2.1 是调用父类的关键字2.2 调用父类的属性和方法2.3 调用父类的构造方法2.4 在构造函数中不能同时出现 super与this关键字,在实例方法则可以 3.关于重写3.1 可以用override注解,也可以不用3.2 规则: (1)方法名,返回值(或者是其子类),方法参数必须保持一致。 (2)访问修饰符的控制权限不能低于父类的访问控制权限 (3)不能抛出不兼容于父类的异常3.3 重载(overload)与重写(override)的区别 (1) 重载是在一个类里,重写作用在子类当中 (2) 重载仅仅是需要方法名保持相同,而重写是返回值 方法名 参数保持一致,访问修饰符最好保持一致 (3) 构造方法支持重载,但构造方法无法被重写
package org.lyrk.accp8.s2.chapter.two; import java.io.IOException; /** * Created by niechen on 17/4/21. */ public class Test3 { public int age = 20; public void test1() { } public void test2() { } public void test3() { } public Test3 test4() { return null; } public void test5() throws NullPointerException { } } class Test3Child extends Test3 { //报错父类没有抛出异常 public void test1() throws Exception{ } //报错 返回值与父类不同 public int test2() { return 0; } public void test3(int text) { } @Override public Test3Child test4() { super.test4(); return null; } //报错不兼容父类的异常 @Override public void test5() throws IOException { } }
4.抽象4.1 抽象类是一个残缺不全的类,所以它无法被实例化,用关键字abstract修饰4.2 抽象类中能定义实体方法也能定义抽象方法,但非抽象类不能定义抽象方法4.3 非抽象子类则必须要重写抽象方法4.4 抽象方法不能为private4.5 当一个类迫切的想让子类重写方法时则可以考虑定义抽象类(不知道该怎么实现,却很有必要实现)
1 package org.lyrk.accp8.s2.chapter.two; 2 3 /** * abstract示例 可以作用在类与方法上 4 * Created by niechen on 17/4/21. 5 */ 6 public abstract class Test4 { 7 8 public abstract void test1(); 9 10 protected abstract void test2(); 11 12 abstract void test3(); 13 14 // private abstract void test4(); 抽象方法不能是私有的 15 16 public void test5() { 17 System.out.println("这个是实例方法"); 18 } 19 } 20 21 class Test4Child extends Test4 { 22 23 @Override 24 public void test1() { 25 26 } 27 28 @Override 29 protected void test2() { 30 31 } 32 33 @Override 34 void test3() { 35 36 } 37 }
5 final关键字5.1 final类不能被继承,没有子类,final类中的方法默认是final的。 (1)final方法不能被子类的方法覆盖,但可以被继承。 (2)final成员变量表示常量,只能被赋值一次,赋值后值不再改变。 (3)final不能用于修饰构造方法。5.2 final作用于方法上: 如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。 使用final方法的原因有二: 第一、把方法锁定,防止任何继承类修改它的意义和实现。 第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率5.3 final作用于参数时,可以读取使用该参数,但是无法改变该参数的值。
package org.lyrk.accp8.s2.chapter.two; /** * Created by niechen on 17/4/25. */ public final class Test5 { public static final String TEST_CONST = "这是一个常量测试"; public final void test1() { System.out.println("这是一个final方法"); } public static final String test2() { return null; } public void test3() { final int age = 10; } public void test4(final Test3 test3) { // test3 =new Test3(); 不可以创建对象 但能改变对象的属性 test3.age =100; } } // 最终类不能被继承 //class Test5Child extends Test5 { // //}
时间: 2024-10-03 01:28:53