上海建设银行网站,企业网站建设单位,地方网站系统,加微信群网站怎么做的面向对象#xff08;中#xff09;
一、 面向对象之继承性
继承性的好处 减少代码的冗余#xff0c;提高了代码的复用性。 便于功能的扩展。 为多态性的使用#xff0c;提供了前提。 继承性的格式 class A extends B{} A#xff1a;子类、派生类、subclass B#xff1a…面向对象中
一、 面向对象之继承性
继承性的好处 减少代码的冗余提高了代码的复用性。 便于功能的扩展。 为多态性的使用提供了前提。 继承性的格式 class A extends B{} A子类、派生类、subclass B父类、超类、基类、superclass 体现 一但子类A继承父类B以后子类A中就获取了父类B中声明的所有的属性和方法。 特别的父类中声明为private的属性或方法子类继承父类以后仍然认为获取了父类中私有的结构。 只是因为封装性的影响使得子类不能直接调用父类的结构而已。 子类继承父类以后还可以声明自己特有的属性或方法实现功能的扩展。子类和父类的关系不同于子集和集合的关系。 extends 延展、扩展。 Java中关于继承性的规定 一个类可以被多个子类继承。 Java中的单继承性 一个类只能有一个父类。 子父类是相对的概念。 子类直接继承的父类称为直接父类。间接继承的父类称为间接父类。 如果我们没有显式的声明一个类的父类的话则此类继承于java.lang.Object类 所有Java类除java.lang.Object类之外都直接或间接的继承于java.lang.Object类 意外着所有的java类具有java.lang.Object类声明的功能。 代码父类
package com.atguigu.java;public class Person{String name;
private int age;public Person(){}public Person(String name,int age){
this.name name;
this.age age;
}public void eat(){
System.out.println(吃饭);
sleep();
}private void sleep(){
System.out.println(睡觉);
}public int getAge() {
return age;
}public void setAge(int age) {
this.age age;
}}代码子类
package com.atguigu.java;public class Student extends Person{//String name;
//int age;
String major;public Student(){}
public Student(String name,int age,String major){
this.name name;
//this.age age;
setAge(age);
this.major major;
}
//public void eat(){
//System.out.println(吃饭);
//}
//
//public void sleep(){
//System.out.println(睡觉);
//}public void study(){
System.out.println(学习);
}public void show(){
System.out.println(name: name ,age: getAge());
}}
代码测试类
public class ExtendsTest {
public static void main(String[] args) {Person p1 new Person();
//p1.age 1;
p1.eat();
System.out.println(*****************);Student s1 new Student();
s1.eat();
//s1.sleep();
s1.name Tom;
s1.setAge(10);
System.out.println(s1.getAge());s1.breath();Creature c new Creature();
System.out.println(c.toString());
}
}二、方法的重写override / overwrite
重写说明 子类继承父类以后可以对父类中同名参数的方法进行覆盖操作。 应用 重写以后当创建子类对象以后通过子类对象调用子父类中的同名同参的方法是实际执行的是子类重写父类的方法。 重写的规定 方法的声明: 权限修饰符 返回值类型 方法名(形参列表) throw 异常的类型{ // 方法体 } 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符 特殊情况 子类不能重写父类中声明为private权限的方法 返回值类型 父类被重写的方法的返回值类型是void则子类重写的方法的返回值只能是void 父类被重写的方法的返回值类型是A类型则子类重写的方法的返回值类型可以是A类或A类的子类 父类被重写的方法的返回值类型是基本数据类型比如double则子类重写的方法的返回值类型必须是相同的基本数据类型也必须是double 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型 注意 子类和父类中的同名听参数的方法要么都声明为非static的考虑重写要么都声明为static的不是重写。
三、super关键字的使用
super理解为父类的 super可以用来调用属性、方法、构造器 super的使用 super调用属性和方法 我们可以在子类的方法中或构造器中。通过使用super.属性和super.方法的方式显式的调用父类中的属性或方法。但是通常情况下我们习惯省略super. 特殊情况当子类和父类中定义了同名的属性时我们要想在子类中调用父类中声明的属性则必须显式的使用super.属性的方式表明调用的是父类中声明的属性。 特殊情况当子类和父类中定义了同名的方法时我们要想在子类中调用父类中声明的属方法则必须显式的使用super.方法的方式表明调用的是父类中声明的方法。 super调用构造器 我们可以在子类的构造器中显式的使用super(形参列表)的方式调用父类中声明的指定的构造器。 super(形参列表)的使用必须声明在子类构造器的首行。 我们在类的构造器中针对于this(形参列表)“或“super(形参列表)”只能二选一不能同时出现。 在构造器的首行没有显式的声明this(形参列表)“或super(形参列表)”则默认调用的是父类中空参的构造器super()。 在类中的多个构造器中至少有一个类的构造器中使用了super(形参列表)”调用父类中的构造器。
四、子类对象实例化的全过程
从结果上来看继承性 子类继承父类以后就获取了父类中声明的属性或方法。 创建子类的对象在堆空间中就会加载所有父类中声明的属性。 从过程上来看 当我们通过子类的构造器创建子类对象时我们一定会直接或间接的调用其父类的构造器进而调用父类的父类的构造器… 直到调用了java.lang.Object类中空参的构造器为止正因为加载过所有的父类的结构所以才可以看到内存中有父类中结构子类对象才可以考虑进行调用。 明确 虽然创建子类对象时调用了父类的构造器但是自始至终就创建过一个对象即为new的子类对象。