java类和对象(中.1)(继承性详解)

简介: 我们都知道类是java中最重要的东西,“万事万物皆对象”一直是java的口号,对对象的功能进行扩展是十分重要的,这就引入了我们今天讲的 继承性!

面向对象特征之二:继承性(inheritance)



 我们都知道类是java中最重要的东西,“万事万物皆对象”一直是java的口号,对对象的功能进行扩展是十分重要的,这就引入了我们今天讲的 继承性

 b182c7fb7575458bb8d2da140c089e68.png7b5d52e6a5584a769993e3e344be7968.png0197f979d6014eacb18f4f0cfb8a04c0.pngb0b786b86d6744999351d0f618796db0.png

(废话扯一波)我们知道定一个person类,包括了string name,int age 等,有了这个类以后,我们如果想定义一个student类,如果没有现在的知识点,我们是不是又得重新去定义一个学生类中的name age呢?这是不是十分冗余呢?所以继承性诞生了,少说废话,进正题吧!


为什么要有继承?


多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中, 那么多个类无需再定义这些属性和行为,只要继承那个类即可。

此处的多个类称为子类(派生类),单独的这个类称为父类(基类 或超类)。可以理解为:“子类 is a 父类”


类继承语法规则 :


class Subclass extends SuperClass{ }


作用:


继承的出现减少了代码冗余,提高了代码的复用性。

继承的出现,更有利于功能的扩展。

继承的出现让类与类之间产生了关系,提供了多态的前提。


注意:


不要仅为了获取其他类中某个功能而去继承

子类继承了父类,就继承了父类的方法和属性。

在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和 方法。

在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,

而是对父类的“扩展”。

ba0e9624cfa2413da428312627ed704a.png

83a800b43f264275ae732ee95f8cf669.png


讲到这里,你也差不多明白了子父类的关系了。那我们顺便说一下一个特别重要的东西


方法的重写(override/overwrite)


定义 :


在子类中可以根据需要对从父类中继承来的方法进行改造,也称 为方法的 重置、覆盖 。在程序执行时,子类的方法将覆盖父类的方法。


要求 :

1. 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表

2. 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型

3. 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限

子类不能重写父类中声明为private权限的方法

4. 子类方法抛出的异常不能大于父类被重写方法的异常


注意:


子类与父类中同名同参数的方法必须同时 声明为非static的(即为重写),或者同时声明为

static的(不是重写) 。因为 static 方法是属于类的,子类无法覆盖父类的方法

 

23c02ebff33e4cab995eae228689f6fe.pngec3ea726b6ec4f3ea8d99b82981a9297.pngcfff7ce951d9439b9a3186018ac9474d.png

那我们想要掉用父类中的方法呢?这就要提到我们的关键字super了


在Java类中使用super来调用父类中的指定操作:


super可用于访问父类中定义的属性

super可用于调用父类中定义的成员方法

super可用于在子类构造器中调用父类的构造器


注意:

尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员

super的追溯不仅限于直接父类

super和this的用法相像,this代表本类对象的引用,super代表父类的内存

空间的标识

class Person {
  String name = "张三";
  protected int age;
  public String getInfo() {
    return "Name: " + name + "\nage: " + age; } }
class Student extends Person {
  protected String name = "李四";
  private String school = "New Oriental";
  public String getSchool() {
    return school; }
  public String getInfo() {
    return super.getInfo() + "\nschool: " + school;
  }
    }
public class text {
public static void main(String[] args) {
  Student st = new Student();
  System.out.println(st.getInfo());
}}

Name: 张三

age: 0

school: New Oriental


调用父类的构造器


子类中所有的构造器默认都会访问父类中空参数的构造器


 当父类中没有空参数的构造器时,子类的构造器必须通过this(参 数列表)或者super(参数列表)语句指定调用本类或者父类中相应的 构造器。同时,只能”二选一”,且必须放在构造器的首行


如果子类构造器中既未显式调用父类或本类的构造器,且父类中又 没有无参的构造器,则编译出错

public class Person {
private String name;
private int age;
private Date birthDate;
public Person(String name, int age, Date d) {
this.name = name;
this.age = age;
this.birthDate = d; }
public Person(String name, int age) {
this(name, age, null);
}
public Person(String name, Date d) {
this(name, 30, d);
}
public Person(String name) {
this(name, 30);
} }
class Student extends Person {
private String school;
public Student(String name, int age, String s) {
super(name, age);
school = s; }
public Student(String name, String s) {
super(name);
school = s; }
// 编译出错: no super(),系统将调用父类无参数的构造器。
public Student(String s) { 
school = s; } }
class person{
  int age;
  public preson(int age)
  {
    this.age=age;
  }
}
class student extends person
{
  String name;
  public student(String nameString)//报错!!!
  {
    this.name=nameString;
  }
}

0c65fba1e1714476be781c0b869d8463.png


相关文章
|
6天前
|
存储 Java
Java中判断一个对象是否是空内容
在 Java 中,不同类型的对象其“空内容”的定义和判断方式各异。对于基本数据类型的包装类,空指对象引用为 null;字符串的空包括 null、长度为 0 或仅含空白字符,可通过 length() 和 trim() 判断;集合类通过 isEmpty() 方法检查是否无元素;数组的空则指引用为 null 或长度为 0。
|
6天前
|
安全 Java 编译器
JAVA泛型类的使用(二)
接上一篇继续介绍Java泛型的高级特性。3. **编译时类型检查**:尽管运行时发生类型擦除,编译器会在编译阶段进行严格类型检查,并允许通过`extends`关键字对类型参数进行约束,确保类型安全。4. **桥方法**:为保证多态性,编译器会生成桥方法以处理类型擦除带来的问题。5. **运行时获取泛型信息**:虽然泛型信息在运行时被擦除,但可通过反射机制部分恢复这些信息,例如使用`ParameterizedType`来获取泛型参数的实际类型。
|
6天前
|
安全 Java 编译器
JAVA泛型类的使用(一)
Java 泛型类是 JDK 5.0 引入的重要特性,提供编译时类型安全检测,增强代码可读性和可维护性。通过定义泛型类如 `Box<T>`,允许使用类型参数。其核心原理是类型擦除,即编译时将泛型类型替换为边界类型(通常是 Object),确保与旧版本兼容并优化性能。例如,`Box<T>` 编译后变为 `Box<Object>`,从而实现无缝交互和减少内存开销。
|
25天前
|
Java
Java快速入门之类、对象、方法
本文简要介绍了Java快速入门中的类、对象和方法。首先,解释了类和对象的概念,类是对象的抽象,对象是类的具体实例。接着,阐述了类的定义和组成,包括属性和行为,并展示了如何创建和使用对象。然后,讨论了成员变量与局部变量的区别,强调了封装的重要性,通过`private`关键字隐藏数据并提供`get/set`方法访问。最后,介绍了构造方法的定义和重载,以及标准类的制作规范,帮助初学者理解如何构建完整的Java类。
|
24天前
|
安全 Java
Object取值转java对象
通过本文的介绍,我们了解了几种将 `Object`类型转换为Java对象的方法,包括强制类型转换、使用 `instanceof`检查类型和泛型方法等。此外,还探讨了在集合、反射和序列化等常见场景中的应用。掌握这些方法和技巧,有助于编写更健壮和类型安全的Java代码。
38 17
|
28天前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
103 15
|
1月前
|
Java
java代码优化:判断内聚到实体对象中和构造上下文对象传递参数
通过两个常见的java后端实例场景探讨代码优化,代码不是优化出来的,而是设计出来的,我们永远不可能有专门的时间去做代码优化,优化和设计在平时
32 15
|
3月前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
280 60
|
3月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
200 58
|
2月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。

热门文章

最新文章