粗通类、对象和方法

发布时间:2026/6/26 9:51:58
粗通类、对象和方法 方法和变量的修饰符修饰符在 Java 中无处不在声明或定义类、方法和变量也常常用到它。可以说阅读一个 Java 程序时最先映入眼帘的往往就是修饰符。因此笔者最先介绍修饰符以免带来理解困难。1. 概述Java 修饰符就是用来定义类、方法和变量权限、特性、状态的关键字相当于给代码加标签控制它们能被谁访问、怎么使用、生命周期是什么。Java 的修饰符分为两大类访问权限修饰符、非访问修饰符。前者决定类、方法和变量能不能被其他类使用后者控制功能、行为、生命周期。访问权限修饰符包含:public公共protected保护default缺省通常不写private私有非访问修饰符包含static静态final最终表示固定abstract抽象修饰符可以组合使用例如public static final表示全局常量2. 访问权限修饰符(1) public全局都能访问所有类包括其他包都能使用。在其他包使用公共类时需要先用 import 语句导入。一个 .java 文件中只能有一个用 public 修饰的公共外部类。外部类写在文件最外层的类而内部类则是被嵌套在外部类内部的类。(2) protected同一个包内的所有类都能使用不同包中只有其子类可以使用。在其他包的子类使用时需要先用 import 语句导入。子类子类通过关键字 extends 继承父类所有非私有的属性和方法形如class 子类 extends 父类{}(3) default缺省型不写即可。只有同一个包内的所有类能使用。(4) private只有当前类可以使用。可使用 getter 让外部间接访问一个私有类型的变量。(5)总结修饰符同类同包不同类不同包子类不同包非子类public√√√√protected√√√×default√√××private√×××(6)修饰类、方法和变量的异同修饰符修饰外部类修饰方法修饰成员变量public可用可用可用protected不能修饰外部类可用可用default可用可用可用private不能修饰外部类可用可用局部变量唯一可用的修饰符是 final 其余一切修饰符均不能修饰局部变量3. 非访问修饰符(1) static修饰类只有内部类可用 static。修饰方法静态方法不用 new 对象直接“类名.方法()”调用静态方法内不能用 this 关键字。修饰变量静态变量全类共享所有对象共用同一个值。(2) final修饰类类不能被继承无子类。修饰方法方法不能被子类重写。修饰变量变量变成常量赋值后不能修改。(3) abstract修饰类抽象类不能 new 对象专门用来被继承。修饰方法抽象方法没有方法体子类必须重写。不能修饰变量。二、调用方法、访问变量轻声呼唤你的名字。1. Java 中的方法和变量不同于 C 语言 C 语言中可以在主函数外定义函数和变量它们看起来“居无定所”。在 Java 中方法和变量要么属于类要么属于对象。不能在类外定义方法和变量。如果成员变量用 static 修饰则该变量称为静态变量或类变量否则称为实例变量。如果成员方法用 static 修饰则该方法称为静态方法或类方法否则称为实例方法。如果一个变量定义在类体内、方法外用 static 修饰那么它就是常说的全局变量。它是一种静态变量属于类本身。静态变量和静态方法属于类实例变量和实例方法属于对象实例。若只用 static 方法和 static 变量不创建对象数据和方法分离便能用 Java 写出面向过程风格的程序适用于实现一些简单的功能。实例方法能调用实例方法和静态方法访问实例变量和静态变量静态方法只能调用静态方法访问静态变量。2. 如何调用方法、访问变量罗列常见的访问方式直呼其名、对象名、类名、 this 关键字、 super 关键字、 getter 访问方法。1直呼其名常用于访问、调用同类的变量、方法或访问一个局部变量无法访问、调用另一个无继承关系的类的任何变量、方法无论该类是不是公共类在不在同包。能访问的变量局部变量最优先当前类的实例变量无歧义时如果局部变量与实例变量重名则直呼其名访问的是局部变量。当前类的静态变量从父类继承的非私有变量能调用的方法当前类的实例方法当前类的静态方法从父类继承的非私有方法2对象名和类名实例变量、实例方法必须用对象名访问、调用形如对象名.变量名对象名.方法名。静态变量、静态方法一般用类名访问、调用形如类名.变量名类名.方法名。如果用同一个类的不同对象名访问该类下的同一个静态变量它们引用的实际上是同一个变量。访问权限由变量、方法前的修饰符决定。3this/super 关键字this 表示当前对象本身可在实例方法或构造方法访问实例成员和静态成员有以下用途解决局部变量与成员变量同名的问题形如 this. 变量名。解决方法参数与成员变量同名的问题形如 this. 变量名。重载构造方法时用来调用该类的另一个构造方法形如 this([参数列表])必须写在构造方法的第一排。super 可在子类中使用用来引用当前对象的父类对象有以下用途在子类中调用父类中被覆盖的方法形如 super. 方法名([参数列表])。在子类的构造方法中调用父类的构造方法形如 super([参数列表])。在子类中访问父类中被隐藏的成员变量形如 super. 变量名。this/super 关键字无法在静态方法中使用。4getter访问方法getter 是类中的一个实例成员方法通过调用 getter 返回成员变量达到访问的目的。通常用这种方法实现对私有型成员变量的访问。三、面向对象程序设计范式一般在写 Java 程序时不会用一个写了主方法的类来实例化对象即实现业务类和启动类的分离。业务类中只定义属性和方法没有 main 。启动类中只包含主方法负责创建对象并调用其方法。1. 业务类-类声明业务类是实现具体业务逻辑的组件是应用的核心。我们通常会定义若干业务类并用业务类创建对象从而满足业务需求。一个类的定义包括两部分类声明和类体的定义。类声明[修饰符] class 类名 { //1.成员变量 //2.构造方法 //3.成员方法 }使用 class 关键字定义类。花括号内的部分称为类体。类体中通常包括三部分内容成员变量、成员方法和构造方法。构造方法用于创建类实例成员变量定义对象状态属性成员方法定义对象行为。设计举例开发一个处理银行业务的应用程序需要设计一个表示账户的类。一个账户应该有账号、姓名以及余额等属性它们定义为成员变量。另外账户应该有取款操作和存款操作它们定义为成员方法。程序 1-1 定义一个账户类 Account。程序 1-1Account.javapackage com.fish4174;//包用于把功能相关的类和接口分组管理 public class Account {//次行格式YYDS //成员变量的定义private 进行封装用 getter/setter 进行访问、修改 private int id; private String name; private double balance;//余额 //构造方法 public Account(){}//默认构造方法 public Account(int id, String name, double balance)//构造方法重载带参数构造方法 { this.id id; this.name name; this.balance balance; } //访问方法与修改方法 public int getId() { return id; } public void setId(int id) { this.id id; } public String getName() { return name; } public void setName(String name) { this.name name; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance balance; } //存款方法 public void deposit(double amount) { balance balance amount; System.out.println(目前账户余额是 balance); } //取款方法 public void withdraw(double amount) { balance balance - amount; System.out.println(目前账户余额是 balance); } }编译该程序可得到一个 Account.class 类文件。2. 启动类启动类是包含 main 方法的入口类我们在 main 方法中创建对象、输入参数、调用对象的方法执行操作并得到输出信息。创建和使用对象为了使用对象一般还要声明一个对象名即声明对象的引用然后使用 new 运算符调用类的构造方法创建对象。例如下面两行声明并创建 Account 类的一个实例 myAccount 。Account myAccount; myAccount new Account();对象的声明和创建对象可以使用一个语句完成。Account myAccount new Account();下面程序 4-2 使用 Account 类创建一个对象并访问、调用它的变量和方法。程序 1-2AccountDemo.javapackage com.fish4174; public class AccountDemo { public static void main(String[] args) { Account myaccount;//声明一个 Account 类型的引用变量 myaccount new Account(1001, Tian Wang, 2000);//调用构造方法创建对象 myaccount.deposit(5000);//调用对象方法 myaccount.withdraw(3000); //访问对象成员输出账户信息 System.out.println(账户ID myaccount.getId()); System.out.println(姓名 myaccount.getName()); System.out.println(余额 myaccount.getBalance()); } }运行结果如下。3. 业务类-类体的定义1成员变量的定义格式[修饰符] 类型 变量名[ 初值];2构造方法的定义构造方法也叫构造器是类的一种特殊方法作用是创建对象并初始化对象的状态。它和普通方法的区别如下构造方法的名称必须与类名相同。构造方法不能有返回值也不能返回 void。构造方法必须在创建对象时用 new 运算符调用。格式[public/protected/private]类名([参数列表]) { //方法体 }无参数构造方法如果在定义类时没有为类定义任何构造方法则编译器自动为类添加一个默认构造方法。默认构造方法是无参数构造方法方法体为空。为 Account 类定义无参数构造方法亦即自动添加的默认构造方法public Account(){}//默认构造方法不带参数方法体为空创建对象Account myaccount new Account();新建对象的成员变量值都被赋予默认值。带参数构造方法可在创建对象时就将其成员变量设置为某个值。一旦为类定义了带参数的构造方法编译器就不再提供默认构造方法。创建 Account 对象时指定账户 ID 、姓名和余额public Account(int id, String name, double balance) { this.id id; this.name name; this.balance balance; }创建对象Account account new Account(1001, Tina Wang, 2000);构造方法的重载构造方法和普通方法都可以重载所谓重载是名称相同、参数不同的方法。创建对象时会根据输入参数的数量和类型不同调用不同的构造方法。3成员方法的定义方法用于实现对象的动态特征也是在对象上可完成的操作。方法必须定义在类体内。格式修饰符 返回值类型 方法名([形式参数列表])//方法头 { //方法体 }方法的第一行为方法头包含方法的修饰符、返回值类型、方法名和方法的参数。而方法名、参数个数、参数类型和参数顺序的组合方法名([形式参数列表])称为方法签名它是一个方法区别于其他方法的标签。方法签名将用在方法重载、方法覆盖和构造方法中。方法的调用方法的调用主要使用在三种场合用对象引用调用类的实例方法。对象名.方法名类中的方法调用本类的其他方法。直呼其名用类名直接调用 static 方法。类名.方法名要调用类的实例方法应先创建一个对象然后通过对象引用调用如下所示Account myAccount new Account(); myAccount.deposit(3000);如果要调用类的静态方法通常使用类名调用如下所示double rand Math.random();方法重载方法重载机制允许在一个类中定义多个同名的方法。实现方法重载要求同名的方法要么参数个数不同要么参数类型不同仅返回值不同不能区分重载的方法。方法重载就是在类中允许定义签名不同的方法。通过方法重载可实现编译时多态静态多态编译器根据参数的不同调用相应的方法具体调用哪个方法是由编译器在编译阶段静态决定的。方法参数的传递Java 中方法的参数传递是按值传递即在调用方法时将实际参数的值复制传递给方法中的形式参数方法调用结束后实际参数的值并不改变。形式参数是局部变量其作用域只在方法内部离开方法后自动释放。基本数据类型如 int, double的参数和引用数据类型如类、接口、数组的参数的传递有所不同。对于基本数据类型的参数是将实际参数值复制传递给方法方法调用结束后对原来的值没有影响。当参数是引用类型时实际传递的是引用值因此在方法的内部有可能改变原来的对象。下面程序 1-3 演示了方法参数的两种传递按值传递和按引用传递。程序 1-3PassByValue.javapackage com.fish4174; public class PassByValue { public static void changeValue(int num) { num 200; System.out.println(num);//输出200 } public static void changeValue(Account account0) { //在方法体中修改账户的余额 account0.setBalance(10000); } public static void main(String[] args) { int number 100; changeValue(number);//把number的值100传递给参数num System.out.println(number);//输出的number值仍为100不改变 Account account new Account(); account.setBalance(8000); System.out.println(account.getBalance());//输出8000.0 changeValue(account);//将对象传递给方法account与参数account0指向同一个对象 System.out.println(account.getBalance());//输出10000.0 } }注意如果方法传递的是不可改变的引用类型对象如 String对象对象在方法内部不可能被改变。四、杂项1. UML图类名————————————————访问权限成员变量名1类型访问权限成员变量名2类型访问权限成员变量名3类型—————————————————访问权限构造方法[参数名1类型...]访问权限成员方法名1[参数名1类型...]返回值类型访问权限成员方法名2[参数名1类型...]返回值类型访问权限说明 代表 public 成员- 代表 private 成员# 代表 protected 成员不加则代表缺省型成员。2. 对象的引用赋值对于基本数据类型的变量赋值是将变量的值的一个复制赋给另一个变量。例如int x 10; int y x;//将x的值10复制给变量y对象包括数组等引用数据类型的变量的赋值是将对象的引用地址赋给变量。例如Account account new Account(); Account account2 account;//将account的引用赋给account2上面的赋值语句会使 account 和 account2 指向同一个对象。这时如果修改 account 对象的成员变量值account2 的对应变量值也会被修改。3.栈区、堆区、方法区JVM 将内存大致分为三部分栈区、堆区、方法区。栈区存放局部变量的值、方法的参数值当变量的生存期结束后系统自动释放栈区内存。堆区存放 new 创建的对象和数组。如果一个对象没有引用指向它它的内存将被回收。方法区存放类的成员方法代码。4. 成员变量默认值定义在类体内、方法外的变量即是成员变量若在类的定义中没有为变量赋初值编译器会为每个成员变量指定一个默认值。实例变量的默认值使在创建对象时赋予的静态变量的默认值是在类首次加载时赋予的且全局只有一份。引用数据类型的变量默认值为 null基本数据类型的变量默认值如下表变量类型初始值变量类型初始值byte0float0.0Fshort0double0.0Dint0booleanfalselong0Lchar\u00005. 局部变量类型推断var在局部变量的类型可推断时可以用 var 声明之不必写出具体的类型名。使用 var 进行声明时必须同时赋值初始化否则编译器无法推断类型。应用场景简化对象的创建var myAccount new Account();下面的语句是错误的。var myAccount;//错误此时不能推断myAccount的类型字符串也是引用类型可用 varvar name Tina Wang;数组也是引用类型可用 varvar nums new int[]{0, 1, 2};下面的语句是错误的。var nums {0, 1, 2};//错误不能推断元素类型for 循环和增强的 for 循环中也可以用 var 声明变量。for(var i 0; i number.length; i) { System.out.print(number[i] ); } for(var i : number) { System.out.print(i ); }6. 垃圾回收对象名存放的是对象的引用。对象名变量不会被回收失去引用的对象可能被回收对象名变量继续指向新对象。当对象不再被引用时该对象就会被销毁其所占的内存空间也会被释放这个过程称为垃圾回收。这个操作是在后台自动进行的。对象何时有可能被回收当一个对象不再被引用时该对象才有可能被回收。例如Account account new Account(); Account account2 new Account(); account2 account;上面的代码段创建了两个 Account 对象 account、account2 然后让 account2 指向 account这时 account2 原来指向的对象没有任何引用指向它了也没有任何办法得到或操作该对象了该对象就有可能被回收了。不过 account2 这个对象名仍可使用它是原本 account 所引用的对象的引用。现在 account 和 account2 便是同一个对象的两个引用了。通过为对象引用赋 null 值可以明确删除一个对象的引用。例如account2 null;//原来的account2对象可被回收注意与上面代码的区别原本 account2 所引用的对象被回收引用变量本身仍存在值为 null 。一个对象可能有多个引用只有在所有的引用都被删除时对象才有可能被回收。免责声明本内容来自平台创作者博客园系信息发布平台仅提供信息存储空间服务。好文要顶 关注我 收藏该文 微信分享Fish4174粉丝 - 5 关注 - 1加关注00升级成为会员« 上一篇 新叶集1» 下一篇 OOP2数组posted 2026-05-04 21:26 Fish4174 阅读(103) 评论(0) 收藏 举报