Java 继承
Java 中的继承
注意:
1.Java 只允许单继承(多继承可以使用接口来间接实现)
2.Java 中允许多层继承
Java 中最顶层父类(最基础类) Object 类
如果类没有写继承哪个父类,默认就是继承 Object 类
继承的特点:
1.减少代码量
2.让类与类之间产生关联(产生父与子的关系)
继承的弊端:
父类中添加一个属性,子类中就继承了这个属性
注意:
1.继承时可以把多个类中相同的功能或方法抽取出来
重新构造一个类出来,把这些类建立继承关系
2.建立继承关系的同时,一定要符合逻辑(切记不要为了继承而继承)
如果是继承关系,一定要符合子类是父类(例如:程序员是员工)
继承使用关键字: extends 和 implements(为类继承接口,变相的是 java 据用多继承的特性)
继承写法:
class 子类 extends 父类{
}
子类继承父类的方法和属性
例如:
public class Demo {
public static void main(String[] args) {
Cat cat = new Cat();
cat.name = "汤姆";
cat.color = "蓝猫";
cat.sleep();
}
}
class Animal{
String name;
String color;
String kind;
public void sleep() {
System.out.println("睡觉");
}
}
class Cat extends Animal{
public void catchTheMouse() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal{
public void gnawBones() {
System.out.println("啃骨头");
}
}
例如:
class A{
String name;
}
class B extends A{
}
class C extends B{
public void name() {
System.out.println("叫");
}
}
注意:
构造方法不能被继承
为了保证继承的完整性,在创建子类对象的时候
如果不主动去调用父类的构造方法那么系统默认会去调用父类无参构造方法
例如:
public class Demo {
public static void main(String[] args) {
Son son = new Son();
son.name = "儿子";
son.sayHi();
Son son2 = new Son("名");
son2.sayHi();
}
}
class Father{
String name;
public Father() {
System.out.println("father 无参");
}
public Father(String name) {
this.name = name;
System.out.println("father 有参");
}
public void sayHi() {
System.out.println(name);
}
}
class Son extends Father{
public Son() {
super();
System.out.println("son 无参");
}
public Son(String name) {
super();
this.name = name;
System.out.println("son 有参");
}
}
super 关键字
super 代表的是父类的对象
super 调用对象: super. 对象
super 调用方法: super. 方法
super(); 调用父类的构造方法
this(); 调用的是本类的构造方法
例如:
public class Demo {
public static void main(String[] args) {
TestB testB = new TestB();
testB.fun();
}
}
class TestA{
int num1 = 10;
int num2 = 20;
}
class TestB extends TestA{
int num1 = 30;
public void fun() {
System.out.println(this.num1);
System.out.println(this.num2);
System.out.println(super.num1);
}
}
例如:
class Phone {
String name;
public Phone() {
}
public Phone(String name) {
this.name = name;
}
}
class MI extends Phone{
public MI() {
super("Note2");
}
public MI(String name) {
super(name);
this.name = name;
}
}
Override(重写) 和 Overload(重载) 的区别
思考:父类和子类的方法能不能重名?
答案:可以,方法重写
注意:
1.方法声明完全一致的时候,叫方法重写
1.方法的重写建立在类与类之间有继承关系(子类重写父类的方法)
Override(重写) 和 Overload(重载) 的区别:
1.重写前提:需要继承关系
重载前提:在同一个类中
2.重写需要方法的声明完全一致
重载只跟参数有关
例如:
public class Demo {
public static void main(String[] args) {
IOS8 ios8 = new IOS8();
ios8.siri();
System.out.println(ios8);
System.out.println(ios8.toString());
}
}
class IOS7{
public void call() {
System.out.println("打电话");
}
public void siri() {
System.out.println("说英文");
}
}
class IOS8 extends IOS7{
@Override
public void siri() {
super.siri();
}
@Override
public String toString() {
return " ";
}
}
public class Demo {
public static void main(String[] args) {
Teacher teacher = new Teacher("王", 16);
System.out.println(teacher);
Student student = new Student("酒", 20, 2018060606);
System.out.println(student);
}
}
class People{
private String name;
private int age;
public People() {
}
public People(String name, int age) {
this.age = age;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat() {
System.out.println("吃饭");
}
@Override
public String toString() {
return "我叫" + name + "年龄" + age;
}
}
class Teacher extends People{
public Teacher() {
super();
}
public Teacher(String name, int age) {
super(name, age);
}
public void teacher() {
System.out.println("讲课");
}
}
class Student extends People{
private int num;
public Student() {
super();
}
public Student(String name, int age, int num) {
super(name, age);
this.num = num;
}
public void study() {
System.out.println("学习");
}
@Override
public String toString() {
return super.toString() + "学号" + num;
}
}
http://blog.csdn.net/huzongnan/article/list