1 继承引入
三个类都有重复的代码,可以把这共同的代码抽出去,抽出去放到另外一个类里面;下面的3个类和上面的类需要发生一点关系(继承),上面的类叫做 父类(超类,基类,根类),下面的类叫子类(派生类,拓展类);
好处 : 提高了代码的复用性
代码复用,提高开发效率和程序的扩展性。
① Java类中的继承的语法格式:
class A{}
class B extends A{}
A 就是B的父类、基类、根类、超类
B是A的子类、派生类、拓展类
② 验证:子类中是否可以继承到父类中的东西(通过创建子类对象来操作从父类继承的东西)
父类: public class Animal { String name; int age; public void eat() { System.out.println("吃"); } } 子类: public class Person extends Animal{ /** * 人类独有方法 */ public void coding() { System.out.println("敲代码..."); } } public class Pig extends Animal{ /** * 猪类独有方法 */ public void gongBaiCai() { System.out.println("拱白菜..."); } } public class Bird extends Animal{ /** * 鸟类独有方法 */ public void fly() { System.out.println("飞..."); } } 测试类: /** * 继承测试类 */ public class AnimalTest { public static void main(String[] args) { //创建子类对象 Person person = new Person(); Pig pig = new Pig(); //通过子类对象调用父类继承过来的成员 person.name = "张三"; person.age = 1; person.eat(); System.out.println(person.name); System.out.println(person.age); //调用子类特有方法 person.coding(); pig.name = "佩奇"; pig.age = 7; pig.eat(); System.out.println(pig.name); System.out.println(pig.age); //调用子类特有方法 pig.gongBaiCai(); } }
除了构造方法不能被继承其他都可以继承过来
但是,私有化成员不能直接通过子类对象直接访问,但是可以通过继承过来的公共方法间接访问 代码如下:
public class Animal { String str; private int a; static int b; public Animal() { System.out.println("无参构造..."); } public Animal(int a) { System.out.println("有参构造..."); } public void test() { System.out.println("普通方法"); } public static void testStatic() { System.out.println("静态方法.."); } private void testPrivate() { System.out.println("私有化方法.."); } public int getA() { return a; } public void setA(int a) { this.a = a; } } public class Person extends Animal{ /** * 人类独有方法 */ public void coding() { System.out.println("敲代码..."); } } 测试代码: /** * 测试继承哪些成员 */ public class AnimalTest { public static void main(String[] args) { //创建子类对象 Person person = new Person(); //通过子类对象调用父类继承过来的普通成员变量 person.str = "张三"; //通过子类对象调用父类继承过来的私有化成员变量 // person.a = 1;//不能通过子类对象直接调用父类私有化成员 //通过子类对象调用父类继承过来的静态成员变量 // person.b = 2;//不要这样用。 这里编译的时候,会将person对象直接编译为类名的方式 //通过子类对象调用父类继承过来的普通方法 person.test(); //通过子类对象调用父类继承过来的静态方法 // person.testStatic();//不要这样用。 这里编译的时候,会将person对象直接编译为类名的方式 //通过子类对象调用父类继承过来的私有化方法 // person.testPrivate();//不能直接调用私有化方法 //子类调用可以通过父类公共方法间接调用父类中私有化的成员 person.setA(69); int a = person.getA(); System.out.println(a);//69 //调用Object继承过来的方法 int hashCode = person.hashCode(); System.out.println(hashCode); } }
① 单继承(一个类只能够有一个直接父类)
② 多重继承(多层级的继承), 一个类可以有子类,子类还可以子类...
示例:
class A{}
class B extends A{}
class C extends B{}
class D extends C{}
③ 每一个类都有一个直接父类,如果没有看到显示的继承代码,那么就隐式继承Object
重载Overload:同类同名不同参
保证业务逻辑合理性
直接将父类中要重写的方法复制到子类后,重写方法体即可
1)重写只能出现在继承关系之中。当一个类继承它的父类方法时,都有机会重写该父类的方法。
前提是父类的方法没有被被final(中文意思:最终的,以后讲)修饰
2)子类方法和父类方法的方法签名(方法名+参数列表)完全一致;
3)访问权限 : 子类方法的访问权限 大于等于父类方法的访问权限
4)static/private 方法不能够被重写 (java语法)
5)返回值类型 : 子类方法的返回值类型可以是父类方法的返回值类型的子类或者相等
6)子类抛出的异常(Exception)下是父类相应方法抛出的异常或者相等
实例代码: public class Animal { public void eat() { System.out.println("吃"); } } public class Person extends Animal{ @Override//注解,编译期起作用,校验代码 public void eat() { System.out.println("吃猪"); } } public class Pig extends Animal{ public void eat() { System.out.println("吃白菜。。。。"); } } 测试代码 /** * 方法重写测试类 */ public class AnimalTest { public static void main(String[] args) { //创建子类对象 Person person = new Person(); Pig pig = new Pig(); person.eat();//执行子类重写后方法 pig.eat();//执行子类重写后方法 } }
1. 并不是每一个继承过来的方法都要重写
2. 并不是每一个子类都要重写父类继承过来的方法