目录
一、类和对象的基本概念
1.概述
类是现实世界中一类具有共同属性和行为的事物的抽象。
可以认为类是一种数据结构,用属性来表示一类事物的共同特征,方法来表示这类事物的行为.。类是抽象的,对象是具体的。eg.游戏是抽象的,永劫无间是具体的。
2.类定义
修饰符 class 类名{
// 此处的修饰符仅可为 public或者默认修饰符
属性 ...
行为 ...}
3.创建对象
通过new关键字进行对象的创建、
eg.
public class DemoTest{
public static void main(String []args){
Demo demo = new Demo();
}
}
class Demo{
}
二、类的基本组成
1.成员变量
1)访问修饰符:用来控制访问权限的标识符
同类中 | 同一个包下 | 不同包下的子类 | 不同包下非子类 | |
public | ✔️ | ✔️ | ✔️ | ✔️ |
protected | ✔️ | ✔️ | ✔️ | ❌ |
默认修饰符(什么都不写) | ✔️ | ✔️ | ❌ | ❌ |
private | ✔️ | ❌ | ❌ | ❌ |
2)成员变量和局部变量
成员变量定义在类中方法外
局部变量定义在类中方法内或代码块内
a.成员变量不赋值有初始值,局部变量不赋值无初始值,需先赋值后使用。
b.成员变量可以用访问修饰符修饰,局部变量不能使用访问修饰符修饰。
c.成员变量随着对象的创建而创建,随着对象的销毁而销毁。局部变量随着方法的调用而创建,随着方法调用结束而销毁。
d.局部变量可以和成员变量重名,在访问时遵循就近原则
3)类变量
此类的所有对象共享的变量,定义格式为
定义格式
static 访问修饰符 数据类型 变量名;
或
访问修饰符 static 数据类型 变量名;
调用
类名.变量名
对象名.变量名
2.成员方法
1)成员方法的定义和调用
访问修饰符 返回值类型 变量名(参数列表){
方法体}
调用:
对象名.方法名()
注意:先创建对象,后调用方法
2) 类方法的定义和调用
访问修饰符 static 返回值类型 方法名(参数列表){
方法体}
调用:
类名.方法名()
对象名.方法名()
3)方法重载和重写
方法重载:在同一个类中多个重名但参数列表不同的方法
方法重写:发生在父子类中,子类对父类方法实现的改写。
方法名 | 参数列表 | 访问修饰符 | 返回值、抛出的异常 | |
重载 | 必须相同 | 不同 | 无要求 | 无要求 |
重写 | 必须相同 | 相同 | 不能缩小父类的访问权限 | 是父类返回值(抛出的异常)的子类或者相同 |
3. 可变参数
(1)基本概念
java 允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。
就可以通过可变参数实现
(2)基本语法
访问修饰符 返回类型 方法名(数据类型... 形参名) {
}
(3)案例
public class VarParameter01 {
//编写一个 main 方法
public static void main(String[] args) {
HspMethod m = new HspMethod();
System.out.println(m.sum(1, 5, 100)); //106
System.out.println(m.sum(1,19)); //20
}
}
class HspMethod {
//可以计算 2 个数的和,3 个数的和 , 4. 5, 。。
//可以使用方法重载
// public int sum(int n1, int n2) {//2 个数的和
// return n1 + n2;
// }
// public int sum(int n1, int n2, int n3) {//3 个数的和
// return n1 + n2 + n3;
// }
// public int sum(int n1, int n2, int n3, int n4) {//4 个数的和
// return n1 + n2 + n3 + n4;
// }
//..... //上面的三个方法名称相同,功能相同, 参数个数不同-> 使用可变参数优化
//1. int... 表示接受的是可变参数,类型是 int ,即可以接收多个 int(0-多)
//2. 使用可变参数时,可以当做数组来使用 即 nums 可以当做数组
//3. 遍历 nums 求和即可
public int sum(int... nums) {
//System.out.println("接收的参数个数=" + nums.length);
int res = 0;
for(int i = 0; i < nums.length; i++) {
res += nums[i];
}
return res;
}
}
(4) 注意事项和使用细节
public class VarParameterDetail {
//编写一个 main 方法
public static void main(String[] args) {
//细节: 可变参数的实参可以为数组
int[] arr = {1, 2, 3};
T t1 = new T();
t1.f1(arr);
}
}
class T {
public void f1(int... nums) {
System.out.println("长度=" + nums.length);
}
//细节: 可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后
public void f2(String str, double... nums) {
}
//细节: 一个形参列表中只能出现一个可变参数
//下面的写法是错的. // public void f3(int... nums1, double... nums2) {
// }
}
4. 作用域
(1)基本使用
public class VarScope {
//编写一个 main 方法
public static void main(String[] args) {
}
}
class Cat {
//全局变量:也就是属性,作用域为整个类体 Cat 类:cry eat 等方法使用属性
//属性在定义时,可以直接赋值
int age = 10; //指定的值是 10
//全局变量(属性)可以不赋值,直接使用,因为有默认值,
double weight; //默认值是 0.0
public void hi() {
//局部变量必须赋值后,才能使用,因为没有默认值
int num = 1;
String address = "北京的猫";
System.out.println("num=" + num);
System.out.println("address=" + address);
System.out.println("weight=" + weight);//属性
}
public void cry() {
//1. 局部变量一般是指在成员方法中定义的变量
//2. n 和 name 就是局部变量
//3. n 和 name 的作用域在 cry 方法中
int n = 10;
String name = "jack";
System.out.println("在 cry 中使用属性 age=" + age);
}
public void eat() {
System.out.println("在 eat 中使用属性 age=" + age);
//System.out.println("在 eat 中使用 cry 的变量 name=" + name);//错误
}
}
(2) 注意事项和细节使用
//编写一个 main 方法
public static void main(String[] args) {
Person p1 = new Person();
/*
属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。
局部变量,生命周期较短,伴随着它的代码块的执行而创建,
伴随着代码块的结束而销毁。即在一次方法调用过程中
*/
//p1.say();//当执行 say 方法时,say 方法的局部变量比如 name,会创建,当 say 执行完毕后
//name 局部变量就销毁,但是属性(全局变量)仍然可以使用
//
T t1 = new T();
t1.test(); //第 1 种跨类访问对象属性的方式
t1.test2(p1);//第 2 种跨类访问对象属性的方式
}
}
class T {
//全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
public void test() {
Person p1 = new Person();
System.out.println(p1.name);//jack
}
public void test2(Person p) {
System.out.println(p.name);//jack
}
}
class Person {
//细节: 属性可以加修饰符(public protected private..)
// 局部变量不能加修饰符
public int age = 20;
String name = "jack";
public void say() {
//细节 属性和局部变量可以重名,访问时遵循就近原则
String name = "king";
System.out.println("say() name=" + name);
}
public void hi() {
String address = "北京";
//String address = "上海";//错误,重复定义变量
String name = "hsp";//可以
}
}
4 .构造器
1)无参构造器
访问修饰符 类名(){
方法体;}
// 创建对象时,由系统调用
2)有参构造
访问修饰符 类名(参数列表){
方法体}
3)this关键字
用于表示当前对象的引用
class A{
String name;
int age;
// 无参构造器
A(){
this(" ", 17);
// 可以使用this(参数列表)访问本类的其他构造器,使用必须放在构造器的第一行
}
A(int age, String name){
this.name = name;
this.age = age;
// 此处,局部变量name和age与成员变量名相同,如果想为成员变量赋值,可以使用this表示当前对象引用
}
}
4)IDEA快捷键Alt+Insert
5)注意事项
a.不提供构造器,系统提供默认的无参构造方法。
b.一旦提供了有参构造方法,就会覆盖系统提供的无参构造器,需要手动创建无参构造器。