第二节:Java类和对象之封装包和static成员
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二节:Java类和对象之封装包和static成员相关的知识,希望对你有一定的参考价值。
文章目录
一:封装
(1)什么是封装
封装:面向对象方法学中封装是指将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互,例如生活中的一些电子设备,对于我们使用者来说是无需关心实现细节的
(2)访问限定符
访问限定符:Java中是通过类和访问限定符来实现封装的
- 类:将数据以及封装数据的方法结合在一起,更符合人类对事物的认知
- 访问限定符:用于控制数据和方法是否可以被使用
Java提供了如下四种访问限定符,各自作用范围如下表所示
范围 | private | default | protected | public |
---|---|---|---|---|
同一包中的同一类 | ✔ | ✔ | ✔ | ✔ |
同一包中的不同类 | ✔ | ✔ | ✔ | |
不同包中的子类 | ✔ | ✔ | ||
不同包中的非子类 | ✔ |
public class TestDemo
private int a;//只能在本类内访问
int b;//default属性
public int c;
public TestDemo(int a, int b, int c)
this.a = a;
this.b = b;
this.c = c;
public static void main(String[] args)
TestDemo t = new TestDemo(1, 2, 3);
二:包
(1)包的概念
包:为了更好的管理类,把多个类收集在一起成为一组,称其为软件包。包是对类、接口等的封装机制的体现,是一种对类或接口等的很好的组织方式。在同一工程中允许存在相同名称的类,只要处在不同的包中即可。类似于系统中的目录
(2)创建包
IDEA创建包步骤如下
- 右键
src
,选择new
,然后选择Package
- 在弹出的对话框中,输入包名,
.
号可以作为分隔符,.
号两边的包具有层级关系,左边的层级较大
- 创建好之后默认会这样显示
- 可以点击上面的小齿轮,将
Compact Middle Packages
前面的√去掉,以目录树的方式显示层级关系
这样一来就创建好了包,接着在PackAge1
这个包下创建一个与TestDemo
同名的类,它们虽然同名,但是由于处在不同的包中,所以互不干扰
另外在刚创建的TestDemo
中,会有如下默认语句,它用于声明当前java文件是在哪个包底下
(3)导入包
Java提供了很多现成的类供我们使用,他们功能强大且丰富,如下
在Java中导入包可以使用import
语句,有两种常用的导入方法
- 只导入特定包:例如
import java.util.Date
- 导入该包下的所有包:例如
import java util *
。这种方式不推荐使用,容易产生冲突
import java.util.Date;
public class TestDemo
public static void main(String[] args)
Date date = new Date();
System.out.println(date.getTime()); //显示时间戳
(4)Java的import和C/C++中#include区分
Java的import和C/C++中#include是没有任何关系的
①:Java中的import
package
相当 “姓”,class
相当于“名”,当有多层包时可以理解为“复姓”
- 例如
java.lang.String
:可以理解为复姓为java.lang
,名字叫做String
如果规范取名**,理论上每个人创建的类名字都不会相同,也就不会发生命名冲突**。但是这个时候就出现问题了,复杂的程序和继承使得很多类的名字非常长,这样在写程序的时候就会变得麻烦,随意import
就是在程序开始的时候说明会用到哪些类,写的时候就可以直接写它的名字,而不用写它的姓了
- 例如
java.lang.String
:如果没有import java.lang.String
,那么我们在每次创建String
对象时都得写java.lang.String string = new blah blah
。而现在只需String string=new blah blah
所以,这就是import的作用,简化代码,编程方便,就这么简单,编译器也不会把import
所导入的类写到.class
中
②:C++中的#include
C++中,include
是预处理器的一部分,所谓预处理,就是指在编译器之前运行。一个源文件,.c
.cpp
和它所包含的文件一起,在经过预处理之后就形成一个源码文件,标准的叫法是translation unit
(编译单元),它包括一系列的声明和定义。一个程序由若干编译单元组成。编译器将各个编译单元编译为目标代(.obj
),通过链接器将这些目标代码连接成完整的指令序列(可执行文件、静态库、动态库等)。所以:#include
后的头文件名,预处理过后是写到了编译单元里的,这和java有着本质的不同
(5)常用的包
以后的学习中,会经常使用以下包
java.lang
:系统常用的基础类(自动导入)java.lang.reflect
:java反射编程包java.net
:网络编程java.sql
:数据库开发java.util
:工具程序包java.io
:I/O编程
三:staic成员
(1)static修饰的成员变量(静态成员变量/类变量)
static修饰的成员变量(静态成员变量/类变量):被static所修饰的变量称之为静态成员变量或类变量,其最大特征为类变量不属于某个具体的对象,是所有对象共享的,此外还有如下特点
- 类变量既可以通过对象访问也可以通过类名访问,但推荐使用类名
- 类变量存储在方法区中
- 类变量随类的加载而被创建,随类的卸载而被销毁
类变量是具有实际意义的。 例如,下面是一个学生类Student
,其中的name
和age
自然而然是每个对象独有的,因为它是一个人的特征信息,所以是成员变量;但其中classes
这个变量不应该设置为成员变量,因为只要是一个班级的同学,它的classes
肯定是相同的,所以可以设置为类变量,只保存一份
public class Student
public String name;
public int age;
public static String classes = "三年二班";//类变量
public Student(String name, int age)
this.name = name;
this.age = age;
public static void main(String[] args)
//类变量可以通过类名访问
System.out.println(Student.classes);
Student s1 = new Student("张三", 27);
Student s2 = new Student("李四", 22);
//类变量也可以通过对象访问,是它们共享的
System.out.println(s1.classes);
System.out.println(s2.classes);
(2)static修饰的成员方法
static修饰的成员方法(静态成员方法):被static所修饰的方法称之为静态成员方法,它是类方法,不是某个对象所特有的,静态成员一般会通过静态成员方法来访问
class Student
public String name;
public int age;
private static String classes = "三年二班";//类变量
public Student(String name, int age)
this.name = name;
this.age = age;
public static String getClasses()
return classes;
public class TestDemo
public static void main(String[] args)
System.out.println(Student.getClasses());
和C++一样,在静态成员方法中不要使用非静态成员变量或调用非静态成员方法,否则会报错
- 静态的没有this引用
- 非静态的有this引用
注意,不要使用不代表着不能用,可以通过下面的方式达到目的
在第五章:Java中的方法和方法重载、递归问题探讨这一小节中,当时由于我们对类还不是特别理解,所以在创建方法时说过默认直接写public staitc
即可。现在,想必大家已经明白这样写的含义了。因为被staitc
修饰后该方法成为类方法,所以在类中可以直接使用,如果你不加static,那么就必须实例化对象后才能使用
//有static
public class TestDemo
public static void fun()
public static void main(String[] args)
//直接调用
fun()
//无static
public class TestDemo
public void fun()
public static void main(String[] args)
//先实例化再调用
TestDemo test = new TestDemo();
test.fun();
以上是关于第二节:Java类和对象之封装包和static成员的主要内容,如果未能解决你的问题,请参考以下文章