写在开头

包、类、接口、方法、变量、参数、代码块,这些都是构成Java程序的核心部分,即便最简单的一段代码里都至少要包含里面的三四个内容,这两天花点时间梳理了一下,理解又深刻了几分。

Java中的包

Java 定义了一种名字空间,称之为包:package。一个类总是属于某个包,类名(比如Person)只是一个简写,真正的完整类名是包名.类名,这才是唯一确定一个类路径的写法,不同包中的类名允许重复。包名推荐使用倒置的域名,例如org.apache

包的定义

//包名
package hello; public class Person {
// 包作用域:
public void hello() {
System.out.println("Hello!");
}
}

包的作用域

通过访问修饰符,可以确认类中方法与属性相对于包的作用域,这在前面的文章中已经提过了,不再赘言,直接贴图。

Java中包的引入通过import关键字实现,在写import的时候,可以使用*,表示把这个包下面的所有class都导入进来(但不包括子包的class):

import java.util.ArrayList;
public class test {
public static void main(String[] args) {
ArrayList<Object> objects = new ArrayList<>();
}
}

当然处理import导入外,也可以通过完成的包名.类名的方式进行引入,但太麻烦了,很少用到。

Java中的类

Java中有个从1995年就喊出的口号“一切皆对象”,而对象在程序中的具象就是通过类(class)来实现!

类的创建

比如有这样一个Person对象,拥有姓名,性别,年龄等特性,行为方式有吃饭,睡觉和跑步,那我们就可以在Java中如下定义:

public class Person {
//姓名
private String name;
//年龄
private int age;
//性别
private int sex;
/**
* 吃饭
*/
private void eat() {
}
/**
* 睡觉
*/
private void sleep() {
}
/**
* 跑步
*/
private void run() {
}
}

类创建好了,如何用呢?这时候需要通过new关键字去创建一个类对应的对象

Person person = new Person();

类的初始化赋值

这行代码创建了一个Person对象,并在堆内存中分配一定的空间,person被称为对象Person的引用,通过这个引用可以对对象进行初始化赋值操作

通过引用变量赋值

示例代码:

public class Person {
private String name;
private int age;
private int sex; public static void main(String[] args) {
Person person = new Person();
person.name = "JavaBuild";
person.age = 18;
person.sex = 1; System.out.println(person.name);
System.out.println(person.age);
System.out.println(person.sex);
}
}

通过构造方法赋值

示例代码:

public class Person {
private String name;
private int age;
private int sex; public Person(String name, int age, int sex) {
this.name = name;
this.age = age;
this.sex = sex;
} public static void main(String[] args) {
Person person = new Person("JavaBuild", 18, 1); System.out.println(person.name);
System.out.println(person.age);
System.out.println(person.sex);
}
}

内部类

根据上面的内容,我们已经熟悉了Java中的类,实际上在类的内部依旧可以创建一个类,这样的类就被称之为:内部类,内部类根据创建的位置,关键字等修饰符分为如下几类:

1、成员内部类

编译之后会生成两个class文件:OuterClass.class和OuterClass$InnerClass.class

class OuterClass {
class InnerClass {} //成员内部类
}

2、方法内部类

编译之后会生成两个class文件:OuterClass.class和OuterClass$1InnerClass.class

只能在定义该内部类的方法内实例化,方法内部类对象不能使用该内部类所在方法的非final局部变量

当一个方法结束,其栈结构被删除,局部变量成为历史。但该方法结束后,在方法内创建的内部类对象可能仍然存在于堆中

class OuterClass {
public void doSomething(){
class Inner{
}
}
}

3、匿名内部类

编译后生成两个class文件:Fish.class和Fish$1.class

public class Fish {
/**
* 游泳方法
*/
public void swim() {
System.out.println("我在游泳!");
} public static void main(String[] args) {
//创建鱼对象
Fish fish = new Fish() {
//重写swim方法
public void swim() {
System.out.println("我在游泳,突然发生海啸,我撤了!");
}
}; fish.swim();
}
}

4、静态内部类

静态嵌套类,并没有对实例的共享关系,仅仅是代码块在外部类内部

静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它

静态嵌套类仅能访问外部类的静态成员和方法

在静态方法中定义的内部类也是静态嵌套类,这时候不能在类前面加static关键字

class OuterFish {
static class InnerFish {
}
} class TestStaticFish {
public static void main(String[] args) {
//创建静态内部类对象
OuterFish.InnerFish iFish = new OuterFish.InnerFish();
}
}

内部类的特点

1、内部类提供了某种进入其继承的类或实现的接口的窗口
2、与外部类无关,独立继承其他类或实现接口
3、内部类提供了Java的"多重继承"的解决方案,弥补了Java类是单继承的不足
4、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号
5、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的
6、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量

Java中的接口

在讲OOP时,我们提到过面向对象的四大特性,其中抽象就是那个第四大特性,而抽象的体现在Java中主要为抽象类和接口!

接口是通过interface 关键字修饰的,用来对一类具有共性对象的一种抽象,通过不同的类进行实现,来满足各自需求。

接口的特性

1、接口中允许定义变量
2、接口中允许定义抽象方法
3、接口中允许定义静态方法(Java 8 之后)
4、接口中允许定义默认方法(Java 8 之后)
5、接口不允许直接实例化
6、接口可以是空的
7、不要在定义接口的时候使用 final 关键字
8、接口的抽象方法不能是 private、protected 或者 final
9、接口的变量是隐式 public static final(常量)

接口的典型案例

我们在之前聊到对象的浅拷贝与深拷贝时提到过Cloneable接口,这就是一个典型的接口应用案例,Cloneable 和 Serializable 一样,都属于标记型接口,它们内部都是空的。实现了 Cloneable 接口的类可以使用 Object.clone() 方法,否则会抛出 CloneNotSupportedException。

接口与抽象类的区别

1、抽象类可以有构造方法;接口中不能有构造方法(因为不允许直接实例化)。
2、抽象类中可以有普通成员变量;接口中没有普通成员变量。
3、抽象类中可以包含非抽象普通方法;JDK1.8 以前接口中的所有方法默认都是抽象的,JDK1.8 开始方法可以有 default 实现和 static 方法。
4、抽象类中的抽象方法的访问权限可以是 public、protected 和 default;接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
5、抽象类中可以包含静态方法;JDK1.8 前接口中不能包含静态方法,JDK1.8 及以后可以包含已实现的静态方法。
6、抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量可以是任意访问权限;接口中变量默认且只能是 public static final 类型。
7、一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类。
接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。

未完待续......

一文搞清楚Java中的包、类、接口的更多相关文章

  1. 一文搞懂 Java 中的枚举,写得非常好!

    知识点 概念 enum的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, ...

  2. 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?

    Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...

  3. 一文彻底搞懂Java中的环境变量

    一文搞懂Java环境变量 记得刚接触Java,第一件事就是配环境变量,作为一个初学者,只知道环境变量怎样配,在加上各种IDE使我们能方便的开发,而忽略了其本质的东西,只知其然不知其所以然,随着不断的深 ...

  4. 一文搞懂Java/Spring/Dubbo框架中的SPI机制

    几天前和一位前辈聊起了Spring技术,大佬突然说了SPI,作为一个熟练使用Spring的民工,心中一紧,咱也不敢说不懂,而是在聊完之后赶紧打开了浏览器,开始的学习之路,所以也就有了这篇文章.废话不多 ...

  5. 理解Java中【包】的概念

    Java中用package关键字定义一个包,下面通过几个实验,理解Java中的包的概念和作用. 实验1:先看一个无包的情形 在G盘下新建一个Test.java,如图1: 写下面这些代码 <spa ...

  6. java 中的包概念

    Java 中的包package, 就是电脑中的文件夹.我们平时在工作中,文件太多时,都会新建文件夹进行分类管理,java 中的包也是类似的道理,当我们的类太多时,也需要进行分类管理,这时我们就会把类文 ...

  7. Java中带包(创建及引用)的类的编译

    Java中带包(创建及引用)的类的编译与调试 java源程序的编译大家都知道,也就是cmd中到源文件所在目录下javac **.java即可,当程序中有包声明还能简简单单的直接javac **.jav ...

  8. 一文搞懂 js 中的各种 for 循环的不同之处

    一文搞懂 js 中的各种 for 循环的不同之处 See the Pen for...in vs for...of by xgqfrms (@xgqfrms) on CodePen. for &quo ...

  9. Java基础(43):Java中的Object类与其方法(转)

    Object类 java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. O ...

  10. Java中的Unsafe类111

    1.Unsafe类介绍 Unsafe类是在sun.misc包下,不属于Java标准.但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty.Hadoo ...

随机推荐

  1. LeetCode:不用加号的加法(位运算)

    解题思路:位运算,只能用位运算符.a.b同号比较好处理.主要是异号的情况,考虑 a>0,b<0,因为 a,b的绝对值都不会超过2^32,因此取模数为2^32.根据同余方程可知 (a+b)% ...

  2. 牛客小白月赛2 D题虚虚实实

    题目链接:https://www.nowcoder.com/acm/contest/86/D 解题思路:这题目就是判断是否存在欧拉路径.由无向图存在欧拉路径的充分必要条件可知先判断是否联通,再判断是否 ...

  3. 春秋云镜 - CVE-2022-28060

    Victor CMS v1.0 /includes/login.php 存在sql注入 找到页面的登录框,看介绍应该是post类型的表单注入. 上sqlmap用原本的梭发现ctf的那个表是空的,换用- ...

  4. 听说生鲜领军企业k8s集群都上云了,鱼会飞了?

    在这个中秋都和国庆在一起的双节里,我们的小明还在辛辛苦苦的找工作,听说他经历了一段"难忘"的面试. 小明面对着面试官的"层层拷问",游刃有余的化解了这些难题. ...

  5. Android 事件分发介绍

    目录 一.目的 二.环境 三.相关概念 3.1 事件分发 四.详细设计 4.1应用布局 4.1.1 应用布局结构 4.1.2 LayoutInspector 4.2 关键View&方法 4.2 ...

  6. Quartz.Net系列(五):Quartz五大构件Job之JobBuilder解析

    所有方法图: 1.Create,OfType 在JobBuilder中有五种方法执行Action: var job1 = JobBuilder.Create().OfType<FirstJob& ...

  7. curl使用小记(一)

    目录 1. 概述 2. 实例 2.1. 访问网页 2.2. 显示头信息 2.3. 保存网页 2.4. 下载图片 2.5. 用户代理设置 2.6. 代理设置 3. 参考 1. 概述 curl也就是com ...

  8. 云图说丨云数据库GaussDB(for MySQL)事务拆分大揭秘

    摘要:数据库代理提供事务拆分的功能,能够将事务内写操作之前的读请求转发到只读节点,降低主节点负载. 本文分享自华为云社区<[云图说]第270期 云数据库GaussDB(for MySQL)事务拆 ...

  9. 详解NLP和时序预测的相似性【附赠AAAI21最佳论文INFORMER的详细解析】

    摘要:本文主要分析自然语言处理和时序预测的相似性,并介绍Informer的创新点. 前言 时序预测模型无外乎RNN(LSTM, GRU)以及现在非常火的Transformer.这些时序神经网络模型的主 ...

  10. PPT 工作需求:如何利用PPT做活动海报&H5?

    PPT 工作需求:如何利用PPT做活动海报? 图片素材 + 字体 + 封面排版 PPT 工作需求:如何利用PPT制作H5? https://www.maka.im/muban http://www.p ...