java类和对象2

一、Java实例变量和类变量

实例变量和类变量的定义

在声明成员变量时,用关键字static给予修饰的称作类变量,类变量也称为static变量或静态变量,而没有用关键字static给予修饰的称作实例变量。

class Main {
    
    
    float x; //实例变量
    static int y; //类变量
}

注意:

关键字static需要放在变量的类型前。

实例变量和类变量的区别

  1. 不同对象的实例变量互不相同:
    一个类通过使用new运算符可以创建多个不同的对象,这些对象将被分配不同的成员变量,分配给不同的对象的实例变量占有不同的内存空间,改变其中一个对象的实例变量不会影响其他对象的实例变量。

  2. 所有对象共享类变量:

如果类中有类变量,当使用new运算符创建多个不同的对象时,分配给这些对象的这个类变量占有相同的一处内存,改变其中一个对象的这个类变量会影响其他对象的这个类变量,也就是说对象共享类变量。

  1. 通过类名直接访问类变量:

当Java程序执行时,类的字节码文件被加载到内存,如果该类没有创建对象,类中的实例变量不会被分配内存。但是,类中的类变量,在该类被加载到内存时,就分配了相应的内存空间。如果该类创建对象,那么不同对象的实例变量互不相同,即分配不同的内存空间,而类变量不再重新分配内存,所有的对象共享类变量,即所有的对象的类变量是相同的一处内存空间,类变量的内存空间直到程序退出运行,才释放所占有的内存。

扫描二维码关注公众号,回复: 15096729 查看本文章

因此,类变量不仅可以通过某个对象访问,也可以直接通过类名访问,而对象的实例变量可以通过该对象访问,但不能使用类名访问。

二、Java实例方法和类方法

实例方法和类方法的定义

在方法声明时,方法类型前面不加关键字static修饰的是实例方法加关键字static修饰的是类方法,也称为静态方法

例如:

class Main {
    
    
    int a;
    float max(float b,float c) {
    
     //实例方法
        ……
    }
    static float max(float d,float e) {
    
     //类方法
        ……
    }
}

实例方法和类方法的区别

  1. 对象调用实例方法:

当类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,只有该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行。

注意:

当我们创建第一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。

实例方法中不仅可以操作实例变量,还可以操作类变量。当对象调用实例方法时,该方法中出现的实例变量和类变量都是分配给该对象的变量,只不过类变量和其他所有的对象共享而已。

  1. 类名调用类方法:

对于类中的类方法,在该类被加载到内存时,就分配了相应的入口地址,从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。类方法的入口地址直到程序退出才被取消。

注意:

实例方法不能通过类名调用,只能由对象来调用。而且因为在类创建对象之前,实例成员变量还没有分配内存,所以类方法不可以操作实例变量。

  1. 类方法的设计原则:

如果一个方法不需要操作类中的任何实例变量,就可以满足程序的需要,就可以考虑将这样的方法设计为一个static方法。

对于static方法,不必创建对象就可以用类名直接调用它,如果创建对象会导致类中的实例变量被分配内

三、Java方法重载

Java中存在两种多态:重载(Overload)和重写(Override),方法重载是两种多态的一种。

例如:你让一个人执行“求面积”操作时,他可能会问你求什么面积?

功能多态性就是指可以向功能传递不同的消息,以便让对象根据相应的消息来产生相应的行为。对象的行为通过类中的方法来体现,那么行为的多态性就是方法的重载。

方法重载的语法规则:

方法重载意味着一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同。要么参数的个数不同,要么参数个数相同,但参数列表中对应的某个参数的类型不同。

例如:

class People {
    
    
    float hello(int a,int b) {
    
    
        return a+b;
    }
    float hello(long a,int b) {
    
    
        return a-b;
    }
    double hello(double a,int b) {
    
    
        return a*b;
    }
}
public class Main {
    
    
    public static void main(String args[]) {
    
    
        People tom = new People();
        System.out.println(tom.hello(10,10));
        System.out.println(tom.hello(10L,10));
        System.out.println(tom.hello(10.0,10));
    }
}

在这里插入图片描述注意:

如果两个方法的名字相同,即使返回类型不同,也必须保证参数不同。

四、Java this关键字

this是Java的一个关键字,表示某个对象。this可以出现在实例方法和构造方法中,但不可以出现在类方法中

在构造方法中使用this

this关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象。

public class People {
    
    
    int leg,hand;
    String name;
    People(String s) {
    
    
        name = s;
        this.init(); //可以省略this.,即写成init();
    }
    void init() {
    
    
        leg = 2;
        hand = 2;
        System.out.println(name+"有"+hand+"只手"+1eg+"条腿");
    }
    public static void main(String args[]) {
    
    
        People boshi = new People("布什");
    }
}

在实例方法中使用this

实例方法只能通过对象来调用,不能通过类名来调用。当this关键字出现在实例方法中时,就代表正在调用该方法的当前对象。

实例方法可以操作类的成员变量,当实例成员变量在实例方法中出现时,一般格式为:

this.成员变量;

当static成员变量在实例方法中出现时,一般格式为:

类名.成员变量;
class A {
    
    
    int x;
    static int y;
    void a() {
    
    
        this.x = 10;
        A.y = 20;
    }
}

该A类中的实例方法a中出现了this,this代表使用a的当前对象所以“this.x”就表示当前对象的变量x,当对象调用方法a时,将10赋给该对象的变量x。当一个对象调用方法时,方法中的实例成员变量就是指分配给该对象的实例成员变量,而static变量和其他对象共享。因此,通常情况下,可以省略实例成员变量名字前面的“this.”以及static变量前面的“类名.”。

class A {
    
    
    int x;
    static int y;
    void a() {
    
    
        x = 10; //省略this.
        y = 20; //省略类名.
    }
}

注意:

当实例成员变量的名字和局部变量的名字相同时,成员变量前面的“this.”或“类名.”就不可以省略。

类的实例方法可以调用类的其他方法,对于实例方法调用的一般格式为:

this.方法;

对于类方法调用的一般格式为:

类名.方法;
class B {
    
    
    void b() {
    
    
        this.c();
        B.d();
    }
    void c() {
    
    
        System.out.println("hi");
    }
    static void d() {
    
    
        System.out.println("ok");
    }
}

该B类中的方法b中出现了this,this代表调用方法b的当前对象,所以方法b的方法体中this.c()就是当前对象调用方法c,也就是说,在某个对象调用方法b的过程中,又调用了方法c。由于这种逻辑关系非常明确,一个实例方法调用另-个方法时可以省略方法名字前面的“this.”或“类名.”。

例如:

class B {
    
    
    void b() {
    
    
        c(); //省略this.
        d(); //省略类名.
    }
    void c() {
    
    
        System.out.println("hi");
    }
    static void d() {
    
    
        System.out.println("ok");
    }
}

注意:

this不能出现在类方法中,这是因为类方法可以通过类名直接调用,这时可能还没有任何对象诞生。

五、Java包

包(package)是Java语言管理类的一个机制,不同Java源文件中可能出现名字相同的类,如果想区分这些类,就需要使用包名。

包语句

通过关键字package声明包语句,包语句作为Java源文件的第一条语句,指明该源文件定义的类所在的包即为该源文件中声明的类指定包名,package语句的一般格式为:

package 包名;

如果源程序中省略了package语句,源文件中所定义命名的类被认为是无包名的一部分,只要这些类的字节码被存放在相同的目录中,那么它们就属于同一个包,但没有包名

包名可以是一个合法的标识符,也可以是若干个标识符加“.”构成,例如:

package sunrise;
package sun.com.cn;

存储目录

如果一个类有包名,那么就不能在任意位置存放它,否则虚拟机将无法加载这样的类。

程序如果使用了包语句,例如:

package tom.jiafei;

那么存储文件的目录结构中必须包含如下结构:…\tom\jiafei,比如:C:\1000\tom\jiafei,并且要将源文件编译得到的类的字节码文件保存在目录C:\1000\tom\jiafei中,源文件可以任意存放。

如果主类的包名是tom.jiafei,那么主类的字节码一定存放在…\tom\jiafei目录中,那么必须到tom\jiafei的上一层目录中去运行主类,假设C:\1000\tom\jiafei,运行格式如下:

C:\1000> java tom\jiafei.主类名

六、Java import语句

一个类可能需要另一个类声明的对象作为自己的成员或方法中的局部变量,如果这两个类在同一个包中,自然没有问题,但是,如果这两个类不在同一个包中,这时必须使用import语句。

引入类库中的类

使用import语句可以引入包中的类,在编写源文件时,除了自己编写类外,经常需要使用Java提供的许多类,这些类可能在不同的包中。

为了能使用Java提供的类,可以使用import语句引入包中的类。在一个Java源程序中可以有多个import语句,它们必须写在package语句(假如有package语句的话)和源文件中类的定义之间,Java提供了大约130多个包。

例如:

java.lang包含所有的基本语言类

java.io包含所有的输入输出类

java.util包含实用类

java.sql包含操作数据库的类

java.net包含所有实现网络功能的类

如果要引入一个包中的全部类,则可以用通配符号星号(*)来代替,例如:

import java.util.*; //表示引入java.util包中所有的类
import java.util.Date; //表示引入java.util包中的Date类

引入自定义包中的类

用户程序也可以使用import语句引入非类库中有包名的类,例如:

import tom.jiafei.*;

用户为了使自己的程序能使用tom.jiafei包中的类,可以在classpath中指明tom.jiafei包的位置,假设包tom.jiafei的位置是C:\1000,即包名为tom.jiafei的类的字节码存放在C:\1000\tom\jiafei目录中。用户可以更新classpath的值,例如:

set classpath=C:\jdk1.6\jre\lib\rt.jar;.;C:\1000
/*表示可以加载C:\1000目录中的无名包类且C:\1000目录下的子孙目录可以作为包的名字来使用*/

如果用户不想更新classpath的值,那么用户可以在用户程序所在目录下建立和包相对应的子目录结构。

例如:用户程序中某个类所在目录是C:\2000,该类想使用import语句引入tom.jiafei包中的类,那么根据包名建立目录结构C:\2000\tom\jiafei,就不用去修改classpath的值,因为默认的classpath的值为:

C:\jdk1.6\jre\lib\rt.jar;.;
/*“.;”表示可以加载应用程序当前目录中的无名包类且当前目录下的子孙目录可以作为包的名字来使用*/

七、Java访问权限

所谓访问权限是指对象是否可以通过“.”运算符操作自己的变量或调用类中的方法。访问限制修饰符有private、protected和public,这些都是Java的关键字,用来修饰成员变量或方法。

注意:

在编写类的时候,类中的实例方法总是可以操作该类中的实例变量和类变量;类方法总是可以操作该类中的类变量,与访问限制符没有关系。

私有变量和私有方法

用关键字private修饰的成员变量和方法被称为私有变量和私有方法。

class Tom {
    
    
    private float weight; //weight是private的float型变量
    private float t(float a,float b) {
    
     //方法t是私有方法
        return a+b;
    }
}

注意:

当在另外一个类中用类Tom创建了一个对象后,该对象不能访问自己的私有变量,调用类中的私有方法。

共有变量和共有方法

用关键字public修饰的成员变量和方法被称为共有变量和共有方法。

class Tom {
    
    
    public float weight; //weight是public的float型变量
    public float t(float a,float b) {
    
     //方法t是共有方法
        return a+b;
    }
}

注意:

当在任何一个类中用类Tom创建了一个对象后,该对象能访问自己的共有变量,调用类中的共有方法。

受保护的成员变量和受保护的方法

用关键字protected修饰的成员变量和方法被称为受保护的成员变量和受保护的方法。

class Tom {
    
    
    protected float weight; //weight是protected的float型变量
    protected float t(float a,float b) {
    
     //方法t是受保护的方法
        return a+b;
    }
}

注意:

当在另外一个类中用类Tom创建了一个对象后,如果这个类与Tom类在同一个包中,那么该对象能访问自己的protected变量,调用类中的protected方法。

友好变量和友好方法

不用关键字private、public、protected修饰的成员变量和方法被称为友好变量和友好方法。

class Tom {
    
    
    float weight; //weight是友好的float型变量
    float t(float a,float b) {
    
     //方法t是友好方法
        return a+b;
    }
}

注意:

当在另外一个类中用类Tom创建了一个对象后,如果这个类与Tom类在同一个包中,那么该对象能访问自己的友好变量,调用类中的友好方法。

当在另外一个类中用类Tom创建了一个对象后,如果这个类与Tom类在同一个包中,那么该对象能访问自己的protected变量,调用类中的protected方法。

八、Java基本类型的类封装

Java的基本数据类型包括:boolean、byte、short、char、int、long、float和double。Java同时也提供了与基本数据类型相关的类,实现了对基本数据类型的封装。这些类在java.lang包中,分别是:Byte、Integer、Short、Long、Float、Double和Character类。

Double和Float类

Double类和Float类实现了对double和float基本类型数据的类包装。可以使用Double类的构造方法Double(double num)创建一个Double类型的对象;使用Float类的构造方法Float(float num)创建一个Float类型的对象。Double对象调用doubleValue()方法可以返回该对象含有的double型数据;Float对象调用floatValue()方法可以返回该对象含有的float型数据。

Byte、Short、Integer、Long类

Byte、Short、Integer和Long类的构造方法分别为Byte(byte num)、Short(short num)、Integer(int num)和Long(long num)。Byte、Short、Integer和Long对象分别调用byteValue()、shortValue()、intValue()和longValue()方法返回该对象含有的基本类型数据。

Character类

可以使用Character类的构造方法Character(char c)创建一个Character类型的对象。Character对象调用charValue()方法可以返回该对象含有的char型数据。Character类还包括一些类方法,这些方法可以直接通过类名调用,用来进行字符分类。

九、Java jar文件

Java应用程序在运行时,需要将使用到的类的字节加载到内存,因此,对字节码文件所在的位置有一定要求,一般分为以下四种情形:

在这里插入图片描述有包名的类

假设下列TestOne和TestTwo类的包名为moon.star。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述学习来自“https://www.dotcpp.com”

总结

当外物的纷争全部涌入你的内心,“忧虑”,“急躁”等,它们都无济于事,唯有“平静”与自然万物融为一体,方能解忧,超脱自我。

猜你喜欢

转载自blog.csdn.net/weixin_51884452/article/details/130666436