最新【Java 基础语法】万字解析 Java 的包和继承,中级java面试题及答案

最后

面试题文档来啦,内容很多,485页!

由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。

1111道Java工程师必问面试题

MyBatis 27题 + ZooKeeper 25题 + Dubbo 30题:

Elasticsearch 24 题 +Memcached + Redis 40题:

Spring 26 题+ 微服务 27题+ Linux 45题:

Java面试题合集:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

}

}

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

4. 创建包

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

基本规则:

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

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

创建及使用步骤:

  1. 右键 src ,点击new ,选择创建一个package在这里插入图片描述
  1. 创建包名,包名全部小写
![在这里插入图片描述](https://img-blog.csdnimg.cn/0bef4bd826054ef8a2a651e2ac7fd2db.png#pic_center)
  1. 创建之后我们就可以看到这些,并且包名和代码的路径一致在这里插入图片描述
  1. 点击 demo1,创建一个 Java 文件在这里插入图片描述
大家发现没,我创建了一个叫 TestDemo 的类,而这个名字在 src 中已经有了。这就是包的作用!并且这个文件上面有 `package pers.dmw.demo1;` 指定了该代码的位置
  1. 使用创建的类在这里插入图片描述
当我们输入 Test 的时候,它出现了两个 TestDemo,下面哪个就是我们创建的类。按照我们以上所学的,先导入包,再使用这个类![在这里插入图片描述](https://img-blog.csdnimg.cn/184d00ceb31c4da48f64cef68e3d511b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5ZCe5ZCe5ZCQ5ZCQ5aSn6a2U546L,size_15,color_FFFFFF,t_70,g_se,x_16#pic_center)
完成啦!

在这里插入图片描述

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 后自动导入。
  1. java.lang.reflflect:java 反射编程包
  1. java.net:进行网络编程开发包
  1. java.sql:进行数据库开发的支持包
  1. java.util:是 Java 提供的工具程序包
  1. java.io:I/O 编程开发包

二、继承


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

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

学习继承之前我们首先回忆一下类与对象,之前我举了一个洗衣服的例子,不记得的朋友可以去 爆肝1W字只为弄懂类和对象 这章看看

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

谜语:

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

谜底:

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

我们可以发现

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

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

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. 抽取共性,放到基类当中
  1. 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.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 关键字

我们对之前学的关键字 public、private、默认以及即将要学的关键字 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){

技术学习总结

学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。

最后面试分享

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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){

技术学习总结

学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。

[外链图片转存中…(img-5yr05poJ-1715653222107)]

[外链图片转存中…(img-1jorgTrB-1715653222108)]

[外链图片转存中…(img-2ErZuaxA-1715653222108)]

最后面试分享

大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!

[外链图片转存中…(img-0a54hda4-1715653222108)]

[外链图片转存中…(img-WwvYzf04-1715653222109)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值