Java学习笔记5
先休息一下眼睛😁
面向对象
类和对象
类(设计图):是对象共同特征的描述
对象:是真实存在的具体实例
在Java中,必须先设计类,才能获得对象。
如何定义类
public class 类名{
1.成员变量(代表属性,一般是名词)
2.成员方法(代表行为,一般是动词)
3.构造器
4.代码块
5.内部类
}
类名 对象名 = new 类名();
拿到对象可以干什么?
对象.成员变量;
对象.成员方法(...);
定义类的补充注意事项
用来描述一类事物的类,专业叫做:Javabean类。
在Javabean类中,是不写main方法的。
在以前,编写main方法的类,叫做测试类。
我们可以在测试类中创建Javabean类的对象并进行赋值调用。
类名首字母建议大写,需要见名知义,驼峰模式。
一个Java文件中可以定义多个class类,且只能一个类是修饰public修饰,而且public修饰的类名必须成为代码文件名。实际开发中建议还是一个文件定义一个class类。
成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;一般无需指定初始化值,存在默认值。
例子
public class GirlFrind {
String name;
double age;
double weight;
String address;
public void sleep(){
System.out.println("女朋友在睡觉");
}
public void eat(){
System.out.println("女朋友在吃东西");
}
}
public class GirlFrindTest {
public static void main(String[] args) {
GirlFrind gf1 = new GirlFrind();
gf1.name = "美杜莎";
gf1.age = 18;
gf1.weight = 90;
System.out.println(gf1.name);
System.out.println(gf1.age);
System.out.println(gf1.weight);
}
}
快捷键:Alt+鼠标左键托/按住鼠标滚轮托
可以同时选中同一列的东西
封装
面向对象三大特征:封装,继承,多态。
封装:告诉我们,如何正确设计对象的属性和方法。对象代表什么,就得封装对应的数据,并提供数据对应的行为。
例如:画圆(园提供属性和画圆的方法,人调用了这个方法 )
关门(门提供属性和关门的方法,人调用了这个方法)
private关键字是一个权限修饰符
可以修饰成员(成员变量和成员方法)
被private修饰的成员只能在本类中才能访问
针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
提供"setXxx(参数)"方法,用于给成员变量赋值,方法用public修饰
提供"getXxx()"方法,用于获取成员变量的值,方法用public修饰
例如
public class GirlFrind {
private String name;
private int age;
private double weight;
//针对于每一个私有化的成员变量,都要提供get和set方法
//set方法:给成员变量赋值
//get方法:对外提供成员变量的值
//作用:给成员变量name进行赋值的
public void setName(String name){
this.name = name;
}
//作用:对外提供name属性的
public String getName() {
return name;
}
public void setAge(int age) {
if(age>=18 && age<=50){
this.age = age;
}else{
System.out.println("非法内容");
}
}
public int getAge() {
return age;
}
public void setWeight(double weight) {
this. weight = weight;
}
public double getWeight() {
return weight;
}
public void sleep(){
System.out.println("女朋友在睡觉");
}
public void eat(){
System.out.println("女朋友在吃东西");
}
}
public class GirlFrindTest {
public static void main(String[] args) {
GirlFrind gf1 = new GirlFrind();
gf1.setName("美杜莎");
gf1.setAge(18);
gf1.setWeight(90); System.out.println(gf1.getName());
System.out.println(gf1.getAge()); System.out.println(gf1.getWeight());
gf1.eat();
gf1.sleep();
}
}
This关键字
1就近原则
System.out.println(age);
先去局部变量位置找,如果有直接用,否则去成员变量位置找
System.out.println(this.age);
直接去成员变量位置找
2this作用
可以区别成员变量和局部变量
public class GirlFrind {
private String name;
private int age;
private double weight;
//针对于每一个私有化的成员变量,都要提供get和set方法
//set方法:给成员变量赋值
//get方法:对外提供成员变量的值
//作用:给成员变量name进行赋值的
public void setName(String name){
this.name = name;
}
//作用:对外提供name属性的
public String getName() {
return name;
}
public void setAge(int age) {
if(age>=18 && age<=50){
this.age = age;
}else{
System.out.println("非法内容");
}
}
public int getAge() {
return age;
}
public void setWeight(double weight) {
this.weight = weight;
}
public double getWeight() {
return weight;
}
public void sleep(){
System.out.println("女朋友在睡觉");
}
public void eat(){
System.out.println("女朋友在吃东西");
}
}
构造方法
构造方法也叫构造器,构造函数。
作用:在创建对象的时候给成员变量进行初始化的。
构造方法格式
public class Student{
修饰符 类名(参数){
方法体;
}
}
特点:
1方法名要与类名相同,大小写也要一致
2没有返回值类型,连void都没有
3没有具体的返回值(不能由return带回结果数据)
执行时机:
1创建对象的时候由虚拟机调用,不能手动调用构造方法
2每创建一次对象,就会调用一次构造方法
例如
public class Student{
private String name;
private int age;
public Student(){
... //空参构造
}
public Student(Student name,int age){
... //带参构造
}
}
举例:有参构造
public class GirlFrind {
private int age;
private String name;
private char gender;
//无参构造
public GirlFrind(){}
//有参构造
public GirlFrind(String name,int age,char gender){
this.name = name;
this.age = age;
this.gender = gender;
}
public void setName(String name) {
this.name = name ;
}
public String getName(){
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setGender(char gender) {
this.gender = gender;
}
public char getGender() {
return gender;
}
}
有参构造
public class GirlFrindTest {
public static void main(String[] args) {
GirlFrind gf1 = new GirlFrind("美杜莎",23,'女');
System.out.println(gf1.getName());
System.out.println(gf1.getAge());
System.out.println(gf1.getGender());
}
}
构造方法注意事项
构造方法的定义
1如果没有定义构造方法,系统将给出一个默认的无参数构造方法
2如果定义了构造方法,系统将不再提供默认的构造方法
构造方法的重载
1带参构造方法,和无参构造方法,两者方法名相同,但是参数不同,这叫做构造方法的重载
推荐的使用方式
1无论是否使用,都手动书写无参数构造方法,和带全部参数的构造方法
标准的JavaBean类
类名需要见名知意
成员变量使用private修饰
提供至少两个构造方法:无参构造方法,带全部参数构造方法
成员方法:
提供每一个成员变量对应的setXxx()/getXxx()
如果还有其他行为,也需要写上
例题:写一个有用户名,密码,邮箱,性别,年龄的方法。
public class GirlFrind {
//属性
private String userName;
private String password;
private String email;
private char gender;
private int age;
//无参构造
public GirlFrind(){}
//有参构造
public GirlFrind(String userName,String password,String email,char gender,int age) {
this.userName = userName;
this.password = password;
this.email = email;
this.gender = gender;
this.age = age;
}
//get/set
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class GirlFrindTest {
public static void main(String[] args) {
GirlFrind f = new GirlFrind("美杜莎","123","zyu7832@gmail.com",'女',18);
System.out.println(f.getUserName());
System.out.println(f.getPassword());
System.out.println(f.getEmail());
System.out.println(f.getGender());
System.out.println(f.getAge());
}
}
快捷键:Alt+insert或者Alt+Fn+insert
快速生成有参,无参构造,get/set
对象内存图
一个对象的内存图
Student s = new Student();
- 加载class文件
- 声明局部变量
- 在堆内存中开辟一个空间
- 默认初始化
- 显示初始化
- 构造方法初始化
- 将堆内存中的地址值赋值给左边的局部变量
基本数据类型和引用数据类型
基本数据类型 | 引用数据类型 |
---|---|
整数类型 | 除左边的其他类型 |
浮点数类型 | |
布尔类型 | |
字符类型 |
基本数据类型:数据值是存储在自己的空间中
特点:赋值给其他变量,也是赋的真实的值
引用数据类型:数据值是存储在其他空间中,自己空间中存储的是地址值
特点:赋值给其他变量,赋的地址值
成员变量和局部变量
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中,方法外 | 方法内,方法声明上 |
初始化值不同 | 有默认初始化值 | 没有,使用之前需要完成赋值 |
内存位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的创建而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的运行结束而消失 |
作用域 | 整个类中有效 | 当前方法中有效 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通