第二节:Java类和对象之封装包和static成员

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二节:Java类和对象之封装包和static成员相关的知识,希望对你有一定的参考价值。

文章目录

一:封装

(1)什么是封装

封装:面向对象方法学中封装是指将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互,例如生活中的一些电子设备,对于我们使用者来说是无需关心实现细节的

(2)访问限定符

访问限定符:Java中是通过类和访问限定符来实现封装的

  • :将数据以及封装数据的方法结合在一起,更符合人类对事物的认知
  • 访问限定符:用于控制数据和方法是否可以被使用

Java提供了如下四种访问限定符,各自作用范围如下表所示

范围privatedefaultprotectedpublic
同一包中的同一类
同一包中的不同类
不同包中的子类
不同包中的非子类
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,其中的nameage自然而然是每个对象独有的,因为它是一个人的特征信息,所以是成员变量;但其中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成员的主要内容,如果未能解决你的问题,请参考以下文章

java基础-类和对象详解

Java——类和对象超详细总结

Java第二节课总结

Java类和对象-学习笔记(超级详细~~~)

JAVA中对类和对象的认识

java static