【Java 基础】面向对象(一)

类和对象

类的理解

  • 类是对现实生活中一类具有共同属性和行为事物的抽象,在客观世界是不存在的,只是用于描述对象信息的。比如对现实事物的抽象,是一个框架、一个模板、一张图纸。简单来讲,类是对现实事物的一种描述。
  • 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合。

类的组成

  • 类的属性,是指事物的特征,例如:手机事物(品牌,价格,尺寸)。
  • 类的行为,是指事物能执行的操作,例如:手机事物(打电话,发短信)。

对象的理解

万物皆对象,客观存在的事物皆为对象。现实事物的个体,在有些场景下也可以理解为一个关系比较紧密的集合。

类和对象的关系

  • 类是对现实生活中一类具有共同属性和行为的事物的抽象。
  • 对象是能够看得到摸的着的真实存在的实体。
  • 类是对事物的一种描述,对象则为具体存在的事物(类是对象的抽象,对象是类的实体)。

注:类是对象的抽象,对象是类的实体。类比设计图纸与实体建筑物之间关系。

多个对象

  • 多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份。
  • 当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。

示例:多个对象指向相同

/*
    多个对象指向相同
 */
public class StudentTest03 {
    public static void main(String[] args) {
        // 创建第一个对象并使用
        Student s1 = new Student();

        s1.name = "林青霞";
        s1.age = 30;
        System.out.println(s1.name + "," + s1.age); // 林青霞,30

        // 把第一个对象的地址赋值给第二个对象
        Student s2 = s1;

        s2.name = "张曼玉";
        s2.age = 28;
        System.out.println(s1.name + "," + s1.age); // 张曼玉,28
        System.out.println(s2.name + "," + s2.age); // 张曼玉,28
    }
}

成员变量与局部变量

  • 类中位置不同:成员变量(类中方法外),局部变量(方法内部或方法声明上(方法形参位置上))。
  • 内存中位置不同:成员变量(堆内存),局部变量(栈内存)。
  • 生命周期不同:成员变量(随着对象的存在而存在,随着对象的消失而消失),局部变量(随着方法的调用而存在,随着方法的调用完毕而消失)。
  • 初始化值不同:成员变量(有默认初始化值),局部变量(没有默认初始化值,必须先定义,赋值才能使用)。

修饰符

Java 的修饰符根据修饰的对象不同,分为类修饰符、方法修饰符和变量修饰符,其中每种修饰符又分为访问控制修饰符和非访问控制修饰符。

访问控制存在的原因:

  • 让客户端调用者无法触及他们不应该触及的部分。

  • 允许库设计者可以改变类内部的工作方式而不用担心影响到客户端调用者。

类修饰符

类修饰符为三个,分别是一个访问修饰符:公共类修饰符 public 和两个非访问控制符:抽象类修饰符 abstract 、最终类修饰符 final。

访问控制修饰符:公共类修饰符 public。非访问控制修饰符:抽象类修饰符 abstract 、最终类修饰符 final。

  • 公共类修饰符 public : Java 语言中类的访问控制符只有 public 即公共的。每个 Java 程序的有且只有一个类是 public,它被称为主类 ,其他外部类无访问控制修饰符,具有包访问性。注意:一个类的内部类可以被其他访问控制修饰符 protected、default、private 修饰,相当于类的成员。
  • 抽象类修饰符 abstract :用 abstract 修饰符修饰的类,被称为抽象类。
  • 最终类修饰符 final :当一个类不能被继承时可用修饰符 final 修饰为最终类。被定义为 final 的类通常是一些有固定作用、用来完成某种标准功能的类。
  • 类缺省访问控制符:如果一个类没有访问控制符,说明它具有缺省的访问控制符特性。此时,这个类只能被同一个包中的类访问或引用。这一访问特性又称为包访问性。

方法修饰符

访问控制修饰符:公共访问控制符 public、保护访问控制符 protected、缺省默认 default、私有访问控制符 private。

非访问控制修饰符:抽象方法控制符 abstract 、静态方法控制符 static 、最终方法控制符 final 、本地方法控制符 native 、同步方法控制符synchronized。

  • 抽象方法控制符 abstract :用修饰符 abstract 修饰的方法称为抽象方法。抽象方法仅有方法头,没有方法体和操作实现。
  • 静态方法控制符 static :用修饰符 static 修饰的方法称为静态方法。静态方法是属于整个类的类方法;而不使用static 修饰、限定的方法是属于某个具体类对象的方法。 由于 static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,即 static 方法只能处理 static的域。
  • 最终方法控制符 final :用修饰符 final修饰的方法称为最终方法。最终方法是功能和内部语句不能更改的方法,即最终方法不能重写覆盖。final 固定了方法所具有的功能和操作,防止当前类的子类对父类关键方法的错误定义,保证了程序的安全性和正确性。所有被 private 修饰符限定为私有的方法,以及所有包含在 final 类 ( 最终类) 中的方法,都被认为是最终方法。
  • 本地方法控制符 native :用修饰符 native 修饰的方法称为本地方法。为了提高程序的运行速度,需要用其它的高级语言书写程序的方法体,那么该方法可定义为本地方法用修饰符 native 来修饰。
  • 同步方法控制符 synchronized :该修饰符主要用于多线程程序中的协调和同步。

变量修饰符

访问控制修饰符:公共访问控制符public 、保护访问控制符protected 、缺省默认访问控制符default、私有访问控制符private 。
非访问控制修饰符:静态域修饰符static 、最终域修饰符 final 、易失 ( 共享 ) 域修饰符volatile 、暂时性域修饰符 transient。

  • 公共访问控制符 public :用 public 修饰的域称为公共域。由于 public 修饰符会降低运行的安全性和数据的封装性,所以一般应减少 public 域的使用。
  • 私有访问控制符 private : 用 private 修饰的成员变量 ( 域 ) 只能被该类自身所访问,而不能被任何其它类 ( 包括子类 ) 所引用。
  • 保护访问控制符 protected :用 protected 修饰的成员变量可以被三种类所引用:①该类自身;②同一个包中的其它类;③其它包中的子类。使用修饰符 protected 的主要作用是允许其它包中的子类来访问父类的特定属性。
  • 缺省默认修饰符 :没有访问控制修饰符或用修饰符 default修饰的成员变量可以被该类本身或同一包中的其他类访问。
  • 静态域修饰符 static :用 static修饰的成员变量仅属于类的变量,而不属于任何一个具体的对象,静态成员变量的值是保存在类的内存区域的公共存储单元,而不是保存在某一个对象的内存区间。该类的任一对象访问它时取到的都是相同的数据;该类的任一对象修改它时 , 也都是对同一个内存单元进行操作。
  • 最终域修饰符 final :最终域修饰符 final 是用来定义常量的。一个类的域 ( 成员变量 ) 如果被修饰符 final 说明,则它的取值在程序的整个执行过程中都是不变的。
  • 易失 ( 共享 ) 域修饰符 volatile :易失 ( 共享 ) 域修饰符 volatile是用来说明这个成员变量可能被几个线程所控制和修改。也就是说在程序运行过程中,这个成员变量有可能被其它的程序影响或改变它的取值。通常 volatile 用来修饰接受外部输入的域。
  • 暂时性域修饰符 transient :暂时性域修饰符 transient 用来定义一个暂时性变量。其特点是:用修饰符transient 限定的暂时性变量,将指定 Java虚拟机认定该暂时性变量不属于永久状态,以实现不同对象的存档功能。否则,类中所有变量都是对象的永久状态的一部分,存储对象时必须同时保存这些变量。

注,上述修饰符的总结内容出处来自Java修饰符的总结(最全),因总结实在太好,我就直接借鉴过来用以记录和回顾,感谢本内容的作者。

this 关键字

this 修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题)。

  • 方法的形参如果与成员变量同名,不带 this 修饰的变量指的是形参,而不是成员变量。
  • 方法的形参没有与成员变量同名,不带 this 修饰的变量指的是成员变量。
 public class Student { 
    private String name; 
    private int age;
    public void setName(String name) {
        this.name = name;  // 方法的形参如果与成员变量同名,不带 this 修饰的变量指的是形参,而不是成员变量
}
    public String getName() {
        return name; // 方法的形参没有与成员变量同名(无形参),不带 this 修饰的变量指的是成员变量。
}
    public void setAge(int age) {
        this.age = age;
}
    public int getAge() {
        return age;
}
    public void show() {
        System.out.println(name + "," + age);
} 
}

this 除了修饰变量用于指代成员变量外,还代表所在类的对象引用,this 代表当前调用方法的引用,哪个对象调用的方法,this 就代表哪一个对象。

public class StudentDemo {
public static void main(String[] args) {
    Student s1 = new Student(); 
    s1.setName("wangxiong1"); // setName 方法被 s1 这个对象调用,this 就代表 s1 这个对象。
    Student s2 = new Student(); 
    s2.setName("wangxiong2");  // setName 方法被 s2 这个对象调用,this 就代表 s2 这个对象。
} 
}

上面代码的运行内存原理分析(栈内存和堆内存中的分析):

  • 代码执行 main 方法开始,main 方法进入栈内存。
  • 在堆内存创建 s1 对象(堆内存出现一个内存空间,将地址 001 赋值给 s1)。
  • s1 开始调用 setName 方法,setName 方法加载进栈内存,s1 通过 this 关键字,从栈内存中进入堆内存修改 name 的值为 wangxiong1,setName 方法调用完毕之后便从栈内存消失。
  • 紧接着,在堆内存创建 s2 对象(堆内存出现一个内存空间,将地址 002 赋值给 s2)。
  • s2 开始调用 setName 方法,setName 方法加载进栈内存,s2 通过 this 关键字,从栈内存中进入堆内存修改 name 的值为 wangxiong2,setName 方法调用完毕之后便从栈内存消失。
  • main 方法执行完毕,从栈内存消失。

结论:从上面的内存分析中我们可以得出,s1 对象调用 setName 方法,s2 对象调用 setName 方法,setName 方法被哪个对象调用,this 就代表哪一个对象。

构造方法

概念:JAVA 构造方法 ,是一种特殊的方法,特别的,一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造方法的重载。

作用:主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与 new 运算符一起使用在创建对象的语句中。

格式:

public class 类名{
修饰符 类名( 参数 ) {
}
}

示例代码:

class Student {
    private String name; 
    private int age;
    //构造方法
    public Student() {
        System.out.println("无参构造方法"); 
    }
    public void show() {
        System.out.println(name + "," + age);
    } 
}
    /*
    测试类
    */
public class StudentDemo {
    public static void main(String[] args) {
        //创建对象
        Student s = new Student(); 
        s.show();
    } 
}

注意事项:

  • 构造方法的创建,如果没有定义构造方法,系统将给出一个默认的无参数构造方法,如果定义了构造方法,系统将不再提供默认的构造方法。构造方法的名称必须与类名相同,包括大小写。
  • 构造方法的重载,如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法。
  • 构造方法的使用,无论是否使用,都手工书写无参数构造方法。
  • 构造方法的作用,可以使用带参构造,为成员变量进行初始化。

相关推荐

微信扫一扫,分享到朋友圈

【Java 基础】面向对象(一)
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close