类
介绍
- 想要创造对象必须要有类的存在
- 类使一组相关属性和行为的集合,可以理解为对象的设计图
类和对象的关系
- 根据类创造对象
- 一个类可以创造多个对象
类的组成
类的本质:对事物进行描述
属性(名词描述)
用成员变量表示,在类中方法外
行为(动词描述)
用成员变量表示,和方法定义一样,去掉static
public class Student{
String name = "张三";
int age =18;
public void study() {
System.out.println("学习");
}
public void eat() {
System.out.println("吃吃吃");
}
对象 (根据对象创建的实体 )
创建对象
格式 类名 对象名 = new 类名()
使用对象成员变量
格式 对象名.成员变量
使用对象成员方法
格式 对象名.成员方法()
public class StudentTest{
/*
创建Student类的对象进行使用
*/
public static void main(String[] args){
Student stu1 = new Student();
}
}
对象的使用细节
- 打印对象名,可以看到对象的内存地址
- 创建类时成员变量没有赋值会产生默认值
方法
局部变量
- 在方法体中申明的变量和方法的参数被称作局部变量
- 局部变量只在方法内有效
- 方法被调用后在栈内存(与主方法平行),未被调用时在方法区的字节码中
形参和实参
方法重载
例子(println方法)
方法的参数传递及例题
参数为基本数据类型时,将重新开辟一份地址进行储存。此时方法中的number和变量number地址不同。
public class ArgsTest1 {
public static void main(String[] args) {
int number = 100;
System.out.println("调用change方法前:" + number); //100
change (number);
System.out.println("调用change方法后:" + number); // 100
}
public static void change(int number) {
number = 200;
}
}
参数为引用数据类型时,使用同一份地址,改变原arr的值
public static void main(String[] args){
int[] arr = {11, 22, 33, 44, 55};
System.out.println("调用change方法之前:" + arr[0]); //11
change(arr);
System.out.println("调用change方法之后:" + arr[0]); // 66
}
public static void change(int[] arr) {
arr[0] = 66;
}
成员变量和局部变量的区别
注:
- 主方法也属于方法;
- 类构造对象存在于方法中随方法弹栈而消失,属于局部变量
This关键字
问题案例
public class Student {
String name;
int age;
public void sayHello(String name){
System.out.println(name);
}
/*
成员变量name与局部变量name出现重名的情况使用就近原则
此时输出为"小刚"
*/
}
public class StudentTest{
public static void main(String[] args{
Student stu = new Student();
stu.name = "小明";
stu.sayHello("小刚");
}
}
此情况下若需精确指定某个变量,使用this关键字
public class Student {
String name;
int age;
public void sayHello(String name){
System.out.println(this.name);
}
}
public class StudentTest{
public static void main(String[] args{
Student stu = new Student();
stu.name = "小明";
stu.sayHello("小刚");
}
}
/*
成员变量name与局部变量name出现重名的情况
使用this后,可访问到成员变量"小明"
*/
作用
this可以调用本类成员(变量,方法)
this.的省略规则
- 本类成员方法:没有前提条件,this.可省略
- 本类成员变量: 方法中没有重命变量,this.才可以省略
this的概念
- this代表当前类对象的地址
- 哪一个对象调用方法,方法中的this代表的就是哪一个对象
public class ThisTest{
public void print(){
System.out.println("print方法输出this"+this);
}
}
public class Test{
public static void main(String[] args{
ThisTest t1 = new ThisTest;
t1.print();
ThisTest t2 = new ThisTest;
t2.print();
}
}
/* 分别输出了t1和t2的地址 */
构造方法
初始化一个新建的对象、构建、创造对象的时候,所调用的方法
格式
- 方法名与类名相同,大小写一致
- 没有返回值类型,连void也没有
- 没有具体的返回值(不能由return带回结果数据)
public 类名(可定义参数) {
........
}
*/调用方法*/
类名 对象名 = new 类名();
构造方法的执行时机:
- 在创建对象时被调用执行
- 每创建一次对象,就执行一次构造方法
构造方法的作用
- 本质作用:创建对象
- 结合执行时机:在创建对象的时候给对象中的数据初始化(直接给其定义变量且给变量赋值)
注意事项
- 一个类中如果没有编写构造方法,系统会提供默认无参的构造方法
- 若手动编写了构造方法,则系统不再提供无参构造
- 构造方法容许方法重载
- 构造方法不能手动调用(不能用对象名 . 构造方法)
构造方法可快捷生成
封装
使用类设计对象时,将需要处理的数据及处理方法设计到对象中
好处
- 更好维护数据
- 使用者无需关心内部实现,只要知道如何使用
设计规范
合理隐藏 合理暴露
权限修饰符(修饰成员变量和成员方法)
private
只能在同一个类中(可以保证数据安全性)
public class Student {
private int age;
public void setage(int age){
if(age>=1&&age<=120){
this.age=age;
}else{
System.out.println("wrong number");
}
}
*/当类体外想对age进行赋值(访问)时只能通过setage方法,
从而保证可以对输入的数值进行判断*/
public int getAge() {
return age;
}
}
*/可用getAge()方法调用数据*/
(default)默认权限不用前缀
同一个包当中,同一个类当中
protected
同一个包当中,同一个类当中,不同包的子类当中(涉及继承)
public
可在任意位置访问(不能跨模块跨项目)
JavaBean案例
概念
- Javabean:实体类:封装数据的类
- 此类成员变量都要私有(private),并且对外提供
getXxx,setXxx方法(快捷方法:右键—>Genarate–>constructor构造方法–>选择成员变量)
public void setXxx(...){
this.Xxx=Xxx;
}
public void getXxx(){
return Xxx;
}
无参,带参构造方法(快捷方法:右键—>Genarate–>constructor构造方法–>选择参数)
public Student(){} /*无参*/
public Student(string name,int age){
this.name=name; /*带参*/
this.age=age;
}
应用场景
JavaBean只负责数据存储,数据处理交给其他类。
参考课程B站黑马程序员
感谢阅读。