继承
package Inherit; class Dog { public String name; public int age; public void barks() { System.out.println(name + "汪汪叫!"); } public void eat() { System.out.println(name + "正在吃饭!"); } } class Cat{ public String name; public int age; public void eat() { System.out.println(name + "正在吃饭!"); } public void CatchMouse() { System.out.println(name + "正在抓老鼠"); } } public class Test{ public static void main(String[] args) { } }
对比狗和猫这两个类,我们会发现它们有共同的属性,name,age 和 eat.
我们可以把它们相同的抽离出来,放到同一个Animal类里面.
通过extends(继承)关键字,让子类继承父类
当子类继承父类之后,就会把属性和方法全部继承.
继承:就是抽取共性,从而达到代码的复用[重复使用]
package Inherit; class Animal{ public String name; public int age; public void eat() { System.out.println(name + "正在吃饭!"); } } class Dog extends Animal{ public void barks() { System.out.println(name + "汪汪叫!"+"年龄"+ age); } } class Cat extends Animal{ public void CatchMouse() { System.out.println(name + "正在抓老鼠"); } } public class Test{ public static void main(String[] args) { Dog dog = new Dog(); //属性继承 dog.name = "旺财"; dog.age = 10; dog.barks(); //方法继承 dog.eat(); } }
注意:
1.子类会将父类中的成员变量或成员方法继承到子类中.
2.子类继承父类之后,必须要新添加自己特有的成员,体现它与父类的不同,否则没有必要进行继承.
私有成员变量在继承中的使用
注意:私有的成员 可以被继承 但是不能访问.
若想访问,我们可以通过 get和 set方法进行访问
代码如下:
package Inherit; class Animal{ private String name; public int age; public void eat() { System.out.println(name + "正在吃饭!"); } public String getName() { return name; } public void setName(String name) { this.name = name; } } class Dog extends Animal{ public void barks() { System.out.println(getName() + "汪汪叫!"+"年龄"+ age); } } class Cat extends Animal{ public void CatchMouse() { System.out.println(getName() + "正在抓老鼠"); } } public class Test{ public static void main(String[] args) { Dog dog = new Dog(); //属性继承 dog.setName("旺财"); dog.age = 10; dog.barks(); //方法继承 dog.eat(); Cat cat = new Cat(); //属性继承 cat.setName("喵喵"); cat.age = 10; cat.CatchMouse(); //方法继承 cat.eat(); } }
当子类和父类变量不重名时:
package Inherit; /** * 子类和父类不存在同名变量时 */ class Base{ int a; int b; } public class Derived extends Base{ int c; public void method(){ a = 10;//来自父类 b = 20;//来自父类 c = 30; System.out.println(a); System.out.println(b); System.out.println(c); } public static void main(String[] args) { Derived derived = new Derived(); derived.method(); } }
控制台运行结果:
当子类和父类重名时:
package Inherit; /** * 子类和父类存在同名变量时 */ class Base{ int a; int b; public void methodA() { System.out.println("Base 中的methodA()"); } } public class Derived extends Base{ int a = 60;// 与父类成员 a 同名,类型相同 char b = 'o';//与父类成员 b 同名,不同类 int c; public void methodB() { System.out.println("Derived 中的 methodB()方法"); } public void methodC() { methodB();//访问子类自己的methodB() methodA();//访问父类继承的methodA() // methodD();//编译失败,在整个继承过程中没有发现方法 } public void method(){ // a = 10;//来自父类 b = 20;//来自父类 c = 30; System.out.println(super.a); System.out.println(a); System.out.println(b); System.out.println(c); } public static void main(String[] args) { Derived derived = new Derived(); derived.method();
父类与子类重合,优先访问子类
控制台运行结果:
📝总结:
继承的含义:
抽取共性,通过子类继承(extends)父类,达到代码复用
toString方法的作用:
在JAVA中,toString()方法是Object类中的一个方法,它的作用是返回一个表示对象的字符串。当我们需要将一个对象转换为字符串时,可以使用toString()方法。
如果我们没有重写该方法,则默认返回对象的类名和哈希码。
下面是一个toString()方法的代码案例:
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } public static void main(String[] args) { Person person = new Person("Tom", 20); System.out.println(person.toString()); } }
在上面的代码中,我们定义了一个Person类,并重写了toString()方法,返回了一个包含name和age属性的字符串。在main方法中,我们创建了一个Person对象,并使用toString()方法将其转换为字符串并输出。
重写和重载的区别
JAVA官方语法文档链接🔗👉:The Java® Language Specification
通过ctrl + F 找到 overload重载
重写和重载都是面向对象程序设计中的概念,它们的作用都是实现多态。但是它们的含义和实现方式是不同的。
重载(Overload):指的是在同一个类内部或者父子类之间,方法名相同,但是参数列表不同(参数类型、参数个数、参数顺序),返回值类型可以是相同的也可以不同的。这样的方法就叫做重载方法。
编译器根据调用时传递的不同参数,来确定调用的具体方法。
重写(Override):是指子类重写父类的方法,方法名、参数列表、返回值类型都与父类相同。这时候子类中的方法会覆盖掉父类中的方法,实现多态。
下面是一些示例代码:
重载:
public class OverloadExample { public int add(int a, int b) { return a + b; } public int add(int a, int b, int c) { return a + b + c; } }
重写:
public class OverrideExample { public static void main(String[] args) { Animal animal = new Dog(); animal.eat(); } } class Animal { public void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { @Override public void eat() { System.out.println("Dog is eating"); } }
在上面的重写示例中,Dog 类继承自 Animal 类,重写了 eat() 方法。使用多态的方式创建了一个 Animal 类对象 animal,然后调用 eat() 方法,实际调用的是 Dog 类中重写的 eat() 方法,输出 "Dog is eating"。