返回顶部
首页 > 资讯 > 后端开发 > Python >Java 基础语法之解析 Java 的包和继承
  • 428
分享到

Java 基础语法之解析 Java 的包和继承

2024-04-02 19:04:59 428人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、包1. 概念2. 使用方式3. 静态导入4. 创建包5. 包的访问权限6. 常见的系统包二、继承1. 概念2. 语法规则(含 super 使用)3. protected 关键

一、包

1. 概念

根据定义:包是组织类的一种方式

那么为什么要组织类呢?

简单来讲就是保证类的唯一性,就比如在以后的工作中,如果大家一起开发一个项目,大家可能在自己的代码中都写到了一个 Test 类,而如果出现了两个同名的类的话,就会冲突,导致代码不能编译通过。

用一份代码理解下


import java.util.*;
public class TestDemo{
    public static void main(String[] args){
        // 得到一个毫秒级的时间戳
        Date date=new Date();
    }
}

上面一份代码,导入了 util 包,并使用了其中的 Date 类,目的是为了得到一个毫秒级的时间戳。而如果我们再导入一个 sql


import java.sql.*;
import java.util.*;
public class TestDemo{
    public static void main(String[] args){
        // 得到一个毫秒级的时间戳
        Date date=new Date();
    }
}

上述代码就会编译错误,会显示 Reference to 'Date' is ambiguous, both 'java.sql.Date' and 'java.util.Date' match ,即两个包中都有 Date 类,不知道该和哪个匹配。稍微修改下,确定该 Date 是和谁匹配就行,修改方式如


java.util.Date date=new java.util.Date();

或者修改这里也行


import java.sql.*;
import java.util.Date;

2. 使用方式

Java 中已经提供了很多现成的类供我们使用,如上述代码中的 Date 类,还有我们经常使用的 Scanner 类、Arrays 类等等。

而这些类被放置在各个包中,比如 util 包中就有很多我们常用的类

虽说 Java 有这么多已经包装好的类供我们使用,但是并不是上面有的我们就可以直接使用。

其中 lang 包中的一些类可以直接使用,如 StringShortByteFloat 等等(因为这些类会被自动导入),写一个代码理解下


public class TestDemo{
    public static void main(String[] args){
        // 输出 long 的最大值
        System.out.println(Long.MAX_VALUE); 
    }
}

上述代码是输出 long 类型的最大值,其中使用了 Long 类的 Max_VALUE 方法。并且不需要手打导入 lang

而其它包使用时都需要手动导入,并且导入一般有以下几种方法

方法一: 直接在使用时,类前加包名,如


public class TestDemo{
    public static void main(String[] args){
        // 得到一个毫秒级的时间戳
        java.util.Date date=new java.util.Date();
    }
}

这种写法比较麻烦,不简洁

方法二: 使用 impot 语句直接导入某包中的某个类,如


import java.util.Date;
public class TestDemo{
    public static void main(String[] args){
        // 得到一个毫秒级的时间戳
        Date date=new Date();
    }
}

注意:

导入包时也可以直接使用**通配符 *** ,直接导入 util 包中的所有,如


import java.util.*;

但是这个并不是直接将该包中的所有类全部导入,而是你用到哪个类就会导入哪个类。

但是会出现导入的两个包都使用通配符,并且两个包都包含同名类的话,则在使用时就会出现错误,如


import java.sql.*;
import java.util.*;
public class TestDemo{
    public static void main(String[] args){
        // 得到一个毫秒级的时间戳
        Date date=new Date();
    }
}

因此更推荐导入某个指定的类

方法三(下面会讲解,不常使用): 静态导入

了解到这里我们就会发现,Java 中的 import c++ 中的 #include 差别很大,后者必须使用 #include 来引入其他文件内容,但是 Java 不需要。

3. 静态导入

其实之前讲方法那一章就提到过静态方法,而静态导入跟静态方法一样,都通过关键字 static 修饰,使用 import static 导入包。

而静态导入可以使我们不用写类名,这在某些时候会更加方便,例如


import static java.util.lang.Math.*;
public class TestDemo{
    public static void main(String[] args){
        double x=3;
        double ans=pow(x,2);
    }
}

其实 pow 方法就省略了类名 Math

4. 创建包

既然理解了 Java 中的包,那么我们自己可以创建一个包吗?因为这样的话,我们就可以在和别人一起开发的时候,使用同一个类名了!

基本规则:

  • 包中的文件最上方要加上一个 package 语句,来指定该代码在哪个包中
  • 包名要和代码路径相匹配
  • 如果一个类没有 package 语句,则会被放到一个默认的包中
  • 包名需要全部小写,并尽量指定成唯一的名字(一般取名如下)
  1. 个人项目:pers.发起者名.项目名.模快名
  2. 团队项目:pers.团队名.项目名.模快名
  3. 公司项目:com.公司名.项目名.模快名

为了方便上述规则的理解,接下来让我来手动创建一个包吧!

创建及使用步骤:

右键 src ,点击new ,选择创建一个package

创建包名,包名全部小写

创建之后我们就可以看到这些,并且包名和代码的路径一致

点击 demo1,创建一个 Java 文件

大家发现没,我创建了一个叫 TestDemo 的类,而这个名字在 src 中已经有了。这就是包的作用!并且这个文件上面有 package pers.dmw.demo1; 指定了该代码的位置

使用创建的类

当我们输入 Test 的时候,它出现了两个 TestDemo,下面哪个就是我们创建的类。按照我们以上所学的,先导入包,再使用这个类

完成啦!

5. 包的访问权限

之前学类时,我们学过 public private,其中被 public 修饰的成员在整个工程都可以使用,而被 private 修饰成员的则只能在自己的类中使用

而都不被这两者修饰的成员,则可以在这个包的其他类中使用,但是不能在其他包中使用

比如我们个人创建的包中定义两个类 TestDemo1 TestDemo2,而 TestDemo 是其他包中的

其中 TestDemo2 代码如下


package pers.dmw.demo1;
public class TestDemo2 {
    public int a=10;
    private int b=20;
    int c=30;
}

Testdemo1 代码如下


package pers.dmw.demo1;
public class TestDemo1 {
    public static void main(String[] args) {
        TestDemo2 testDemo2=new TestDemo2();
        System.out.println(testDemo2.a);
        System.out.println(testDemo2.b);
        System.out.println(testDemo2.c);
    }
}

其中 b 不能打印,因为 b 被 private 修饰,只能在自己的类中使用

TestDemo 代码如下


package pers.dmw.demo1;
public class TestDemo {
    public static void main(String[] args) {
        TestDemo2 testDemo2=new TestDemo2();
        System.out.println(testDemo2.a);
        System.out.println(testDemo2.b);
        System.out.println(testDemo2.c);
    }
}

其中 b 和 c 都不能打印,b 是被 private 修饰的类,而 c 没有被修饰,只能在自己的包中使用

6. 常见的系统包

包大概的知识已经介绍完了,最后让我们来了解下那些常见的系统包吧!

  1. java.lang:系统常用基础类(String、Object),此包从 jdk1.1 后自动导入。
  2. java.lang.reflflect:java 反射编程
  3. java.net进行网络编程开发包
  4. java.sql:进行数据库开发的支持包
  5. java.util:是 Java 提供的工具程序包
  6. java.ioI/O 编程开发包

二、继承

我们知道面向对象的基本特征就是:继承、封装、多态

我们已经了解过封装了,接下来就开始学习继承

学习继承之前我们首先回忆一下类与对象,之前我举了一个洗衣服的例子,不记得的朋友可以去看看之前的文字Java 基础语法让你弄懂类和对象

而今天我再用一个谜语更好的帮大家去理解类和对象

谜语:

年纪不大,胡子一把。客人来啦,就喊妈妈(打一动物)

谜底:

诶!?先猜,谜底我已经放到本章的最后了,猜完的小伙伴可以到下面去验证哈

我们可以发现

  • 谜语就是一种抽象
  • 谜底就是一个具体
  • 类就是一个事物的抽象
  • 对象就是一个抽象的具体

回顾了类与对象之后,我们开始学习继承,那么继承是什么呢?

1. 概念

其实这里的继承和我们生活中的继承很类似,比如谁继承了长辈的产业。我们也可以用这样的比喻去写一个代码。

首先我们看一幅图

图片里有一只羊和一只狼,然后它们都属于动物对吧,那我们可以根据动物去写一个类


class Animal{
    public String name;
    public int age;
    public void eat(){
        System.out.println("我要睡觉啦!");
    }
    public void bark(){
        System.out.println("我要叫啦!");
    }
}

该类中,定义了动物的名字、年龄属性以及睡觉、叫的行为。我们再继续对狼和羊定义一个类


class Wolf{
    public String name;
    public int age;
    public void eat(){
        System.out.println("我要睡觉啦!");
    }
    public void bark(){
        System.out.println("我要叫啦!");
    }
    public void hunt(){
        System.out.println("我要猎食啦!");
    }
}


class Sheep{
    public String name;
    public int age;
    public int cleatNum;
    public void eat(){
        System.out.println("我要睡觉啦!");
    }
    public void bark(){
        System.out.println("我要叫啦!");
    }
}

我们发现,在羊和狼的类的定义时,由于它们都属于动物,所以动物的一些属性和行为它们都有,所以我们可以通过继承,将羊和狼的类的代码变得更加简介


class Wolf extends Animal{
    public void hunt(){
        System.out.println("我要猎食啦!");
    }
}


class Sheep extends Animal{
    public int cleatNum;
}

如上述代码中的 A extends B 就是继承。其中

A:叫做子类或者派生类
B:叫做父类、基类或者超类

当子类继承了父类之后,子类就拥有了父类的方法和属性

因此继承的意义就是

为了代码的重复使用

继承的思想就是

  1. 抽取共性,放到基类当中
  2. extends

2. 语法规则(含 super 使用)

这里我们再更加详细的介绍继承的语法规则,以便于解决一些疑惑的地方

语法:


class 子类 extends 父类{
    
}

规则:

  • Java 中一个子类只能继承一个父类(C++/python 等语言支持多继承)
  • 子类会继承父类的所有 public 的字段和方法
  • 对于父类的 private 的字段和方法,子类无法访问(可以继承)
  • 子类的实例中,也包含着父类的实例,可以使用 super 关键字得到父类实例的引用

注意:

由于 Java 当中只能单继承,为了解决这个问题,后面可以通过接口来实现类似于“多继承”的关系

那么上述关键字 super 是什么意思呢?首先我们看这样一段代码


class Animal{
    public String name;
    public void eat(){
        System.out.println(this.name + "要睡觉啦!");
    }
    public void bark(){
        System.out.println(this.name + "要叫啦!");
    }
}
class Wolf extends Animal{
    public void hunt(){
        System.out.println(this.name + "要猎食啦!");
    }
}
public class TestDemo{
    public static void main(String[] args){
        Wolf wolf=new Wolf();
        wolf.name="灰太狼";
        wolf.eat();
        wolf.bark();
        wolf.hunt();
    }
}

这就是一个简单的子类继承父类的使用。

我们知道创建一个对象分为两步:为对象分配内存和调用构造类。当我们没有定义构造方法时,系统会自动为我们构造一个无参的构造方法。

那如果我们在父类中主动的创建一个构造方法


class Animal{
    public String name;
    public Animal(Stirng name){
        this.name=name;
    }
    public void eat(){
        System.out.println(this.name + "要睡觉啦!");
    }
    public void bark(){
        System.out.println(this.name + "要叫啦!");
    }
}

那么我们要记住:子类继承父类,需要先帮父类构造。那么怎么构造呢,就要用到 super


class Wolf extends Animal{
    public Wolf(String name){
        super(name); // 显示的调用父类的构造方法
    }
    public void hunt(){
        System.out.println(this.name + "我要猎食啦!");
    }
}

其中 super 就是调用父类的构造方法,这就满足子类继承父类之前,要先构造父类的构造方法

再具体理解下 super

  • super:表示当前对象的父类的引用(但这个说法不严谨,这是和 this 类比的结论)
  • super():调用父类的构造方法
  • super.父类属性:调用父类的属性
  • super.父类方法:调用父类的方法

注意:

  • 当我们不主动创建构造方法时,但不是也有系统主动创建的构造方法吗?因为当我们不主动创建时,系统也主动使用了 super
  • super 不能和 this 一起使用,因为它们都要放在第一行
  • super 不能放在被 static 修饰的方法中使用,因为它依赖于对象
  • super 只会指向最直接的父类,不会指向父类的父类

3. protected 关键字

我们对之前学的关键字 publicprivate、默认以及即将要学的关键字 protected 做一个比较,就可以得到下面的表格

num 范围 private 默认(包访问权限) protected public
1 同一包中的同一类
2 同一包中的不同类
3 不同包中的子类
4 不同包中的非子类

我们发现在上述代码中,我使用的继承时,父类代码的属性都是用 public 修饰的。这样子类就可以正常使用这些属性,但是这就违背了“封装”的思想。但是如果用 private 修饰,不同包的子类又不能访问

因此出现了一个关键字 protected,使用它的话

  • 对于不同包的非子类: protected 修饰的字段和方法是不能访问的
  • 对于不同包的子类和同一包的其他类:protected 修饰的字段和方法是能访问的

学到这里,我们可以开始解决之前一些未提及的问题了:如果父类和子类都含有同一个参数,那调用时是使用哪个呢?我们来看下面的代码


class Base{
    public int a=1;
}
class Derieve extends Base{
    public int a=3;
    public void func(){
        System.out.println(a);
    }
}
public class TestDemo{
    public static void main(String[] args){
        Derieve derieve=new Derieve();
        derieve.func();
    }
}
// 结果为:3

也就是说,调用时也是依靠了一个就近原则,默认为子类中的。那么调用时想调用父类该怎么办呢?这时我们就可以使用 super 来调用父类的属性。将 Derieve 类 改成这样即可


class Derieve extends Base{
    public int a=3;
    public void func(){
        System.out.println(super.a);
    }
}
// 结果为:1

至于方法同名的问题下章将讲解!

4. 更复杂的继承关系

以上的继承关系都比较简单,如果关系变得更复杂时,如这个样子,我们该怎么办呢?

emmm,其实一般建议是不希望超过三层的继承关系的,如果继承层次太多了,就需要考虑重构代码。

而有时我们不知不觉就写了很多的继承关系,所以为了在语法上进行限制继承,就可以使用关键字 final

5. final 关键字

之前我们了解过 final,它可以修饰一个变量或者字段,使其变成常量,不可以被修改,如


final int a=10;
// a 为常量不可以被修改

而在这里,final 也能修饰类,此时被修饰的类就不能被继承了,被叫做密封类,如


final class A{
    
}

此时 A 就不能被继承了

final 也可以修饰方法,被修饰的方法叫做密封方法,至于此时 final 有什么作用,下章将会讲解!

三、组合

上述重点讲解了继承相关的内容,而继承的意义就是:使代码可以重复使用

而组合也是一种表达类之间关系的方式,也能够达到代码重用的效果

顾名思义,组合就是将各种东西组合成一个东西。比如学习,学校就是由老师、学生、教学楼等等组合而成的,我们可以写一个代码


class Teacher{
    // ...
}
class Student{
    // ...
}
public class School{
    public Teacher[] teachers;
    public Student[] students;
}

上述代码就是将老师和学生的类封装成了对象,并且作为了另一个类的字段

四、总结(含谜底)

今天这章重点讲解了包和继承相关的内容,概念比较多,自己的理解也可能很不到位,所以写的不好,希望大家可以理解吧!最后来揭晓我们的谜底吧!

我是谜底:

其实我自己在猜的时候一直搞不懂羊为啥叫妈妈,羊不都是 miemie~ 的叫嘛,直到我想到了 giegie~

到此这篇关于Java 基础语法之解析 Java 的包和继承的文章就介绍到这了,更多相关 Java 的包和继承内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

nal 有什么作用,下章将会讲解!

--结束END--

本文标题: Java 基础语法之解析 Java 的包和继承

本文链接: https://lsjlt.com/news/135684.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java 基础语法之解析 Java 的包和继承
    目录一、包1. 概念2. 使用方式3. 静态导入4. 创建包5. 包的访问权限6. 常见的系统包二、继承1. 概念2. 语法规则(含 super 使用)3. protected 关键...
    99+
    2024-04-02
  • Java语言之包和继承详解
    目录一、包包名类的导入与静态导入在包中添加类包访问权限二、继承类、超类与子类重写方法(override)this与super的区别:子类构造器protected关键字阻止继承:fin...
    99+
    2024-04-02
  • Java基础-封装和继承
    目录一. 封装1.1 封装的目的1.2 封装的好处1.3 封装的步骤1.4 封装的例子1.5 小结二. 继承2.1 继承的介绍2.2 生活中的继承2.3 继承的好处2.4 继承的格式...
    99+
    2024-04-02
  • java 继承的基础(转)
    java 继承的基础(转)[@more@]继承是面向对象编程技术的一块基石,因为它允许创建分等级层次的类。运用继承,你能够创建一个通用类,它定义了一系列相关项目的一般特性。该类可以被更具体的类继承,每个具体的类都增加一些自己特有的东西。在J...
    99+
    2023-06-03
  • Java基础知识总结之继承
    目录一、继承的基本概念二、继承的好处和弊端三、继承中变量访问的特点四、super关键字五、继承中构造方法的访问特点六、继承中成员方法的访问特点七、方法重写八、包九、修饰符十、stat...
    99+
    2024-04-02
  • java继承学习之super的用法解析
    继承supersuper关键字的用法和this关键字的用法相似this:代表本类对象的引用super:代表父类存储空间的标识(可以理解为父类对象引用) package com.it...
    99+
    2024-04-02
  • 【Java 基础】引用型数组、Java 继承、super 关键字详解
    《Java 零基础入门到精通》专栏持续更新中。通过本专栏你将学习到 Java 从入门到进阶再到实战的全套完整内容,所有内容均将集中于此专栏。无论是初学者还是有经验的开发人员,都可从本专栏获益。 ...
    99+
    2023-08-31
    java 开发语言 后端
  • Java面向对象基础知识之封装,继承,多态和抽象
    目录一、封装二、继承三、多态四、抽象总结一、封装 封装:是面向对象方法的重要原则,就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或...
    99+
    2024-04-02
  • Java基础之包装类的示例分析
    这篇文章将为大家详细讲解有关Java基础之包装类的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点...
    99+
    2023-06-15
  • JAVA面向对象之继承 super入门解析
    目录1 继承1.1概念1.2 特点1.3 练习:继承入门案例2 super3 继承的用法3.1 练习:super之继承中成员变量使用3.2 练习:super之继承中构造方法的使用4 ...
    99+
    2024-04-02
  • 【JAVA零基础入门系列】Day13 Java类的继承与多态
    继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽)  开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟方法,被继承的类被称为父类或者基类,继...
    99+
    2023-06-03
  • Java基础之面向对象机制(多态、继承)底层实现
    目录一、Java的前世二、多态三、Java中多态的底层实现四、重载 五、重写一、Java的前世 为什么会产生Java?Java的特点是什么? 从C语言开始讲,C语言是一种结构化语言,...
    99+
    2024-04-02
  • java基础之方法详解
    目录一、什么是方法二、方法的定义三、方法的调用四、方法的重载五、递归一、什么是方法 Java方法是语句的集合,他们在一起执行一个功能。 1.方法是解决一类问题的步骤的有序...
    99+
    2024-04-02
  • Java基础语法之二维数组详解
    目录一、二维数组二、二维数组的声明与初始化2.1 声明2.2 初始化2.2.1 静态初始化2.2.2 动态初始化三、二维数组的遍历四、二维数组的内存图分析五、数组操作的常见异常六、总...
    99+
    2024-04-02
  • Java 封装与继承:面向对象的编程基础
    封装 封装是指将一个对象的内部细节与其外部接口分离。通过封装,我们可以控制对对象内部状态的访问,从而提高代码的安全性、可读性和维护性。 作用域:封装允许我们定义成员变量和方法的访问修饰符(如 private、protected 和 pu...
    99+
    2024-03-12
    面向对象编程(OOP)是计算机科学中广泛使用的一种编程范式 它以对象为基础。封装和继承是 OOP 中至关重要的概念 它们允许代码的可重用性、可维护性和灵活性。
  • java基础之方法的示例分析
    这篇文章将为大家详细讲解有关java基础之方法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JAVA 异常分类及处理 异常分类Throwable 是 Java 语言中所有错误或异常的超类。下一层...
    99+
    2023-06-20
  • Java面向对象编程之继承和多态以及包的解析与使用范例
    目录1.继承1.1继承的基本使用1.2 protected 关键字1.3 final 关键字2.多态2.1向上转型2.2动态绑定2.3方法重写2.4向下转型2.5super 关键字2...
    99+
    2024-04-02
  • 如何深入解析Java 8 默认方法和多继承
    本篇文章给大家分享的是有关如何深入解析Java 8 默认方法和多继承,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。以前经常谈论的Java对比c++的一个优势是Java中没有多继...
    99+
    2023-06-17
  • Java中继承和多态的示例分析
    这篇文章给大家分享的是有关Java中继承和多态的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言首先我们如果要使用Java中存在的包,可以程序中使用import语句导入包。包说通俗点就是一个文件夹,为了...
    99+
    2023-06-20
  • Java 继承的继承体系:揭示超类和子类之间的关系
    Java 继承是一种面向对象编程特性,允许一个类(子类)继承另一个类(超类)的属性和方法。这为代码重用和多态性提供了强大的机制。 超类和子类关系 超类:也称为父类或基类,是提供属性和方法的原始类。 子类:也称为派生类或后代类,从超类继承...
    99+
    2024-03-12
    Java 继承体系
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作