java中的包和继承的基本介绍

简介: java中的包和继承的基本介绍

面向对象编程

  • 继承

包(package)是组织类的一种方式

使用包的主要目的是保证类的唯一性

列如你的代码写了一个Test类,你同事可能也写了一个Test类,如果出现同名的类就会冲突,导致代码编译不过。

导入包中的类

java中已经提供了很多现成的类供我们使用。

例如:得到一个毫秒级别的时间戳可以使用java.util.Data这种方式引入了java.util这个包中的Data

但是这种写法比较麻烦一些,可以使用import语句导入包

注意事项import和C++的#include差别很大。C++必须#include来引入其他文件内容,但是java不需要,import只是为了写代码的时候更方便。import更类似与C++中的namespaceusing

静态导入

使用import static 可以导入包中的静态的字段和方法

使用这种方法可以更方便的写一些代码

但是我不建议这种写法,多写一点没什么不好的

将类放到包中

基本规则

  • 在文件的最上方加一个paceage语句指定该代码在那个包中
  • 包名需要尽量指定成一个唯一的名字,通常会用公司域名的颠倒形式(例如com.bit.demo1
  • 包名要和代码路径相匹配。
  • 如果一个类没有package包,则该类被放到一个默认包中

操作步骤

1.在IDEA中先新建一个包

2.在弹出的框中输入包名

3.在包中创建类。

4.此时我们可以看到磁盘上得目录结构已经被IDEA自动创建出来了

5.同时我们也可以看到在创建的Test.java文件的最上方,就出现了一个package语句

包的访问权限控制

我们已经了解到类中的publicprivateprivate中的成员只能被类的内部使用

如果某个成员不包含publicprivate关键字,此时这个成员可以在包内部的其他类使用,但是不能在包外部的类实用

下面的代码给了一个示例。Demo1和Demo2是同一个包中,Test是其他包中

如果在同一个包中可以访问。但是如果在不同包中就会报错

常见的系统包

1.java.lang:系统常用基础类(String、Object)此包从JDK1.1之后自动导入

2.java.lang.reflect:java反射编程包

3.java.next:进行网络编程开发包

4.java.spl:进行数据库开发的支持包

5.java.util:是java提供的工具程序包(集合类等)非常重要

6.java.io: I/O编程开发包

继承

背景

代码中创建的类,主要是为了抽象现实中的一些事物(包含属性和方法),有的时候客观事物之间存在一些关联联系,那么在表示成类和对象的时候也会存在一定的联系

例如:设计一个类表示动物

在这个代码中我们发现了大量的冗余代码我们发现AnimalCatBird这几个类中存在一定的关联和联系、

  • 这三个类都有一个eat方法,而且行为是完全一样的
  • 这三个类都有一个name属性,而且意义是完全一样的
  • 从逻辑上讲Cat和Bird是一种Animal(is - a 语义)

此时我们就可以让Cat 和Bird分别继承Animal类来达到代码重用的效果

Animal这样被继承的类我们称之为父类基类超类 ,对于Cat和Bird这样的类,我们称之为子类派生类,和现实中儿子继承父亲的财产类似,子类也会继承父类的字段和方法,一达到代码重用的效果

语法规则

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

protected关键字

刚才我们发现,如果把字段设为private,子类不能访问,但是设为public,又违背了我们“封装”的初衷。两全其美的办法就是protected关键字

  • 对于类的调用者来说,protected修饰的字段和方法是不能访问的
  • 对于类的子类同一个包的其他类来说,protected修饰的字段和方法是可以访问的

小结:java中对于字段和方法共有四种访问权限

  • private类内部能访问,类外部不能访问
  • 默认(也叫包访问权限):类内部能访问,同一个包中的类可以访问,其他类不能访问
  • protected:类内部能访问,子类和同一个包中的类能访问,其他类不能访问
  • public:类内部和类的调用者都能访问

什么时候下用哪一种那?

我们希望类要尽量做到“封装”,即隐藏内部实现细节,只暴露出必要的信息给使用者

因此在使用的时候应该尽可能的使用比较严格的访问权限。例如一个方法能用private就尽量不用public

另外,还有一种简单粗暴的方法:将所有的字段设为private,将所有的方法设为public ,不过这种方式属于是对访问权限的滥用,还是在写代码的时候要认真思考,该类提供的方法到底给‘谁’使用(是类内部自己用,还是类的调用者使用,还是子类使用)

更复杂的继承关系

例如

如果像上图这样继承方式为多层继承,即子类还可以在进一步的派生出新的子类

时刻牢记我们写的类是现实事物的抽象,而我们真正在公司中所遇到的项目往往业务比较复杂,可能涉及到一系列复杂的概念,都需要我们使用代码来表示,所以真实的项目中所写的类也会有很多,类之间的关系也会更加的复杂

但是即使如此,我们并不希望类之间的继承层次太复杂,一般我们不希望出现超过三层的继承关系,如果继承层次太多,就需要考虑对代码进行重构了

如果想从语法上限制继承,可以使用final关键字

final关键字

曾经我们学习过final关键字,修饰一个变量或者字段的时候,表示常量(不能修改)

final关键字也能修饰类,此时表示被修饰的类不能被继承

final关键字的功能是限制类被继承

“限制”这件事意味着“不灵活”,在编程中灵活不见得是一件好事,灵活可能意味着更容易出错

是用final修饰的类被继承的时候,就会编译报错,此时就可以提示我们这样的继承是有悖这个类设计的初衷


相关文章
|
23天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
68 1
|
29天前
|
Java Android开发
Eclipse 创建 Java 包
Eclipse 创建 Java 包
31 1
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
26 3
|
2月前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
46 2
|
2月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
35 2
|
2月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
41 1
|
2月前
|
Java Apache Maven
Java/Spring项目的包开头为什么是com?
本文介绍了 Maven 项目的初始结构,并详细解释了 Java 包命名惯例中的域名反转规则。通过域名反转(如 `com.example`),可以确保包名的唯一性,避免命名冲突,提高代码的可读性和逻辑分层。文章还讨论了域名反转的好处,包括避免命名冲突、全球唯一性、提高代码可读性和逻辑分层。最后,作者提出了一个关于包名的问题,引发读者思考。
Java/Spring项目的包开头为什么是com?
|
2月前
|
Java 测试技术 编译器
Java零基础-继承详解!
【10月更文挑战第4天】Java零基础教学篇,手把手实践教学!
42 2
|
2月前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
27 5
|
2月前
|
Java
java继承和多态详解
java继承和多态详解
50 5