Java基础(九):类的使用

一、类、对象、属性

类就是一种数据类型,对象就是一个具体的实例,属性(成员变量)是类的一部分,是一种数据类型。

注意事项和使用细节

  1. 属性的定义语法同变量,例:访问修饰符 数据类型 属性名;
  2. 属性的定义类型可以是任意类型
  3. 属性可不赋值,默认初始值

二、构造器

  1. 构造器无返回值,也不能写void
  2. 构造器名称和类名一样
  3. 一个类可有多个不同构造器,即构造器重载
  4. 构造器是完成对象的初始化,而不是创建对象
  5. 在创建对象时,系统自动调用该类的构造方法
  6. 若没定义构造器,系统自动生成默认无参构造方法
  7. 一旦定义构造器,系统不再生成默认无参构造,除非显式定义(例:public Person(){})

三、方法(method)

1. 方法的定义

class Exercise{
	public static void main(String[] args){
		Person person = new Person();//实例化对象
		person.setNameAndAge("小明", 18);
		person.printNameAndAge();
	}
}
//类
class Person{
	//属性
	String name;
	int age;
	//构造器及其重载
	public Person(){
	}
	public Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	//方法的定义
	public void setNameAndAge(String name, int age){
		this.name = name;
		this.age = age;
	}
	public String printNameAndAge(){
		return "我的名字是" + name + ",年龄是" + age;
	}
	
}

注意事项和使用细节

  1. 一个方法最多有一个返回值
  2. 返回类型可以是任意数据类型
  3. 方法要求返回时,必须返回(return 值);方法不要求(即void),无须返回(或者只写return;)
  4. 同一个类的方法直接调用
  5. 跨类调用方法:需要通过对象名调用。
  6. 方法不能嵌套定义

2. 方法的传参机制

在方法的传参列表中:基本数据类型传的是值(值的拷贝),形参改变不影响实参;引用数据类型传的是地址,形参改变影响实参。

3. 方法重载(OverLoad)

java中允许同一个类中 ,多个同名方法的存在,但要求形参列表不一致。

注意事项和使用细节
1)方法名必须相同
2)形参至少一个不同
3)返回类型无要求

4. 方法重写/覆盖(override)

(一)方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的方法

(二)使用细则

  1. 子类的方法的参数,方法名称,要和父类方法的参数,方法名称完全一样。
  2. 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类
    比如父类返回类型是Object ,子类方法返回类型是String
  3. 子类方法不能缩小父类方法的访问权限

(三)重载与重写的比较
在这里插入图片描述

5. 可变参数(Variable parameter)

java中允许将同一个类中 多个同名同功能参数个数不同的方法,封装成一个方法

public static void main(String[] args){
	int[] arr = {1, 3, 5};
	System.out.println(sum(1, 5, 100))
	System.out.println(sum(arr))// 3.
}
// 1.int...表示可以接收多个int
// 2.使用可变参数时,形参可以将其当成数组使用
// 3.可变参数的实参可以为数组
// 4.可变参数可以和普通参数混合使用,但是保证可变参数在最后
// 5.形参列表只能出现一个可变参数
public int sum(int... nums){// 1. 2.
	int res = 0;
	for(int i = 0; i < nums.length; i++){
		res += nums[i];
	}
	return res;
}
public void f1(double num, int... nums){// 4.
}

四、对象赋值

一个对象赋值给另一个队象在默认下是引用传递,赋的是地址。

Person p1 = new Person();
p1.setNameAndAge("liming", 18);
//p1将地址给p2,p3,p4
Person p2 = p1;
Person p3 = p1;
Person p4 = p1;

p2 = null;//p2的指向null,但是p1没改变

p3.setNameAndAge("liming", 20);//p3改变了p1的年龄

p4 = new Person();//p4指向一个新的地址,不会影响p1
p4.setNameAndAge("liming", 40);

五、内存分配机制

  1. 栈:一般存放基本数据类型(局部变量)
  2. 堆:存放对象
  3. 方法区:常量池、类加载信息

每调用一次方法,栈开辟一次空间

六、作用域(scope)

全局变量:作用域在整个类中,可以被其他类使用;默认赋值,可不赋值直接使用;可以加访问修饰符。
局部变量:作用域在定义它的代码块中;必须赋值后才能使用;不能使用访问控制符。

注意事项和使用细节

  1. 全局变量和局部变量可以重名,访问时就近原则
  2. 同一作用域局部变量不能重名,例如同一个方法中
  3. 属性:生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。局部变量:生命周期较短,伴随着它的代码块的执行而创建,伴随着代码块的结束而销毁,即在一次方法调用过程中。

七、this的使用

  1. this关键字可以用来访问本类的属性、方法、构造器
  2. this用于区分当前类的属性和局部变量
  3. 访问成员方法的语法:this.方法名(参数列表);
  4. 访问构造器语法:this(参数列表);注意只能在构造器中使用(即只能在构造器中访问另外一个构造器,必须放在第一条语句
  5. this不能在类定义的外部使用,只能在类定义的方法中使用。

八、访问修饰符

java提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围):

  1. 公开级别:用public修饰,对外公开
  2. 受保护级别:用protected修饰,对子类和同一个包中的类公开
  3. 默认级别:没有修饰符号,向同一个包的类公开.
  4. 私有级别:用private修饰,只有类本身可以访问,不对外公开

四种访问修饰符的访问范围:
在这里插入图片描述

使用的注意事项
1)修饰符可以用来修饰类中的属性,成员方法以及类
2)只有默认的和public才能修饰类!并且遵循上述访问权限的特点
3)成员方法的访问规则和属性完全一样.

九、final关键字

final可以修饰类、属性、方法和局部变量。
使用场景:
1)不希望类被继承
2)不希望父类的某个方法被子类覆着/重写(override)
3)不希望类的的某个属性的值被修改
4)不希望某个局部变量被修改

使用细则:

  1. final修饰的属性又叫常量,一般用XX_XX_XX来命名
  2. final修饰普通属性时,必须赋初值,并且以后不能再修改,初始化的位置:
    1)定义时:如 public final double TAX_RATE = 0.08;
    2)在构造器中
    3)在代码块中
  3. final修饰静态属性时,初始化的位置:
    1)定义时
    2)在静态代码块
  4. final类不能继承,但是可以实例化对象
  5. 如果类不是final类,但是含有final方法,则该方法虽然不能重写,但是可以被继承
  6. 如果一个类已经是final类了,就没有必要再将方法修饰成final方法
  7. final不能修饰构造器
  8. final和static往往搭配使用,效率更高,底层编译器做了优化处理,此时static变量无法被修改
  9. 包装类(Integer,Double,String等)都是final类

特别说明
本文章是个人整理的学习笔记,参考b站韩顺平老师的课程(【零基础 快速学Java】韩顺平 零基础30天学会Java)。老师讲的非常好,有兴趣的可以去看一下。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
无论是工作学习,不断的总结是必不可少的。只有不断的总结,发现问题,弥补不足,才能长久的进步!!Java学习更是如此,知识点总结目录如下: 目录 一、 Java概述 3 二、 Java语法基础 5 数据型 5 运算符号 14 语句 15 函数 15 方法重载(Overloadjing)与重写(Overriding) 16 数组 17 总结 18 三、 常见关键字 20 四、 面向对象★★★★★ 21 五、 封装(面向对象特征之一)★★★★ 23 六、 继承(面向对象特征之一)★★★★ 25 七、 接口(面向对象特征之一)★★★★ 28 八、 多态(面向对象特征之一)★★★★ 30 java.lang.Object 31 十、 异常★★★★ 34 十一、 包(package) 37 十二、 多线程★★★★ 39 为什么要使用多线程 39 创建线程和启动 39 线程的生命周期 44 线程管理 45 线程同步 49 线程通信 52 线程池 58 死锁 64 线程相关 65 十三、 同步★★★★★ 67 十四、 Lock接口 70 十五、 API 71 String字符串:★★★☆ 71 StringBuffer字符串缓冲区:★★★☆ 73 StringBuilder字符串缓冲区:★★★☆ 74 基本数据型对象包装★★★☆ 75 集合框架:★★★★★,用于存储数据的容器。 76 Collection接口 77 Iterator接口 78 List接口 78 Set接口 80 Map接口 81 把map集合转成set的方法 82 使用集合的技巧 83 Collections--集合工具 83 Arrays—数组对象工具 84 增强for循环 85 可变参数(...) 86 枚举:关键字 enum 86 自动拆装箱 86 泛型 87 System 89 Runtime 90 Math 90 .Date:日期,月份从0—11 92 Calendar:日历 93 十六、 IO流:用于处理设备上数据 ★★★★★ 94 IO流的概念 95 字符流与字节流 98 流对象 101 File 102 Java.util.Properties 103 介绍IO包中扩展功能的流对象 103 十七、 网络编程 110 网络基础之网络协议篇 111 UDP传输 124 TCP传输 126 十八、 反射技术 127 十、 Ajax原理及实现步骤★★★★★ 130 Ajax概述 130 Ajax工作原理 130 Ajax实现步骤 130 详解区分请求型: GET或POST 131 $.ajax标准写法 134 二十、 正则表达式:其实是用来操作字符串的一些规则★★★☆ 135 二十一、 设计模式★★★★★ 136 设计模式简介 136 单例设计模式:★★★★★ 156 工厂模式★★★★★ 159 抽象工厂模式★★★★★ 163 建造者模式 170 原型模式 177 适配器模式 182 桥接模式 188 过滤器模式 192 组合模式 193 装饰器模式★★★★★ 196 外观模式 201 享元模式 204 代理模式★★★★★ 208 责任链模式 212 命令模式 216 解释器模式 219 迭代器模式 222 中介者模式 224 备忘录模式 226 观察者模式 230 状态模式 233 空对象模式 236 策略模式★★★★★ 238 模板模式 240 访问者模式 244 设计模式总结★★★★★ 247 二十二、 Java其他总结 248 Java JVM知识点总结 248 equals()方法和hashCode()方法 270 数据结构 273 Array方法汇总 304 Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程:Thread和Runnable 315 Java锁小结 321 java.util.concurrent.locks包下常用的 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java 性能优化 362
好的,这是一个简单的CourseDB.java文件示例,实现了一个模拟数据库中课程的单例,可以初始化至少10门课程: ```java import java.util.ArrayList; import java.util.List; public class CourseDB { // 单例模式,保证只有一个实例 private static CourseDB instance = null; private List<Course> courses; // 构造函数私有化,保证外部无法直接实例化 private CourseDB() { courses = new ArrayList<>(); // 初始化至少10门课程 courses.add(new Course("001", "Java基础", "张三", 3)); courses.add(new Course("002", "Java高级", "李四", 4)); courses.add(new Course("003", "面向对象设计", "王五", 3)); courses.add(new Course("004", "数据结构与算法", "赵六", 4)); courses.add(new Course("005", "数据库原理", "钱七", 3)); courses.add(new Course("006", "计算机网络", "孙八", 4)); courses.add(new Course("007", "操作系统", "周", 3)); courses.add(new Course("008", "编译原理", "吴十", 4)); courses.add(new Course("009", "软件工程", "陈十一", 3)); courses.add(new Course("010", "人工智能", "刘十二", 4)); } // 获取单例实例 public static CourseDB getInstance() { if (instance == null) { synchronized (CourseDB.class) { if (instance == null) { instance = new CourseDB(); } } } return instance; } // 获取所有课程 public List<Course> getCourses() { return courses; } } ``` 在这个示例中,采用了双重检查锁定的方式实现单例模式,保证了线程安全。CourseDB定义了一个List型的courses属性,用于存储课程信息。在构造函数中初始化至少10门课程,通过公开的getCourses()方法,可以获取所有课程的列表。这个可以被其他模块调用,提供课程信息的访问服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值