Java面向对象01:类与对象的关系、创建和初始化对象
1.Java入门——介绍及安装2.Java基础01:注释、标识符、数据类型3.Java基础02:类型转换、变量、常量4.Java基础03:基本运算符5.Java基础04:包机制、JavaDoc生成文档6.Java流程控制01:Scanner对象7.Java流程控制02:顺序结构和选择结构8.Java流程控制03:循环结构9.Java方法10.Java数组01:数组的定义、声明、创建、初始化和内存分析11.Java数组02:数组使用、多维数组、冒泡排序和稀疏数组
12.Java面向对象01:类与对象的关系、创建和初始化对象
13.Java面向对象02:封装和继承14.Java面向对象03:抽象类、接口和内部类15.Java异常16.SpringBoot和微服务架构17.SpringBoot基础01:创建项目和编写HTTP接口18.SpringBoot基础02:自动装配原理、yaml语法和JSR-303数据校验19.SpringBoot基础03:静态资源和首页定制20.Java多线程01:什么是线程和线程的创建21.Java多线程02:静态代理模式和Lambda表达式22.Java多线程03:线程的五大状态23.Java多线程04:线程优先级、守护线程和线程同步24.Java多线程05:死锁、LOCK和线程协作25.网络编程基础01:网络编程概述、IP和端口26.网络编程基础02:TCP实现聊天和文件上传27.Java注解和反射01:注解28.Java注解和反射02:反射基本概述和获得Class类的几种方式29.Java注解和反射03:类加载30.Java注解和反射04:Class对象的使用Java面向对象01:类与对象的关系、创建和初始化对象
面向过程和面向对象的思想
面向过程思想
- 线性思维,步骤清晰简单,第一步做什么,第二步做什么......
- 面向过程适合处理一些较为简单的问题
面向对象思想
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考,最后才对某个分类下的细节进行面向过程的思索。
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题
对于描述复杂的事物,为了从宏观上把控、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍需要面向过程的思路去处理。
什么是面向对象
- 面向对象编程(Object-Oriented Programming,OPP)
- 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据 。
- 抽象
- 三大特性:
- 封装
- 继承
- 多态
- 从认识论角度考虑是先有对象后有类。对象是具体的事物。类,是抽象的,是对对象的抽象
- 从代码运行角度考虑是现有类后有对象。类是对象的模板。
回顾方法及加深
方法的定义
- 修饰符:如public、static等
- 返回类型:如int、String等
- break:跳出switch或结束循环;
- return:结束方法,返回一个结果,void类型默认不用加return 实际可写成return;返回一个空值。
- 方法名:注意规范,驼峰命名,见名知意
- 参数列表:(参数类型,参数名)
- 异常的抛出
方法的调用
-
静态方法:带有static修饰符的方法,调用其他类的方法时,类名.方法名;同类下直接以方法名进行调用。
-
非静态方法:不带有static修饰符的方法,调用时需要进行类实例化(new)
类1:
package com.lurenj.oop; public class Demo01 { public static void main(String[] args) { //静态方法 Student.eat();//可以直接通过类名+方法名调用 //非静态方法 //实例化这个类 new //对象类型 对象名 = 对象值; Student student = new Student(); student.say(); } //static方法和类一起加载的 public static void a(){ b(); } public static void b(){ //c();报错不能正常调用,此时c未被实例化 Demo01 demo01 = new Demo01(); demo01.c();//正常调用 } public void c(){ } }
类2:
package com.lurenj.oop; public class Student { //静态方法 public static void eat(){ System.out.println("学生吃饭了"); } //非静态方法 public void say(){ System.out.println("学生说话了"); } }
-
形参和实参
-
值传递和引用传递
- 值传递
package com.lurenj.oop; //值传递 public class Demo02 { public static void main(String[] args) { int a = 1; System.out.println(a);//输出:1 Demo02.change(a); System.out.println(a);//输出:1 } //返回值为空 public static void change(int a){//只是把形式参数设置为了 a = 10;//执行到这一步时会将形参里的a变更为10 } }
- 引用传递
package com.lurenj.oop; //引用传递:对象,本质还是值传递 public class Demo04 {//一个类里只能有一个public class,class可以拥有多个 public static void main(String[] args) { Person person = new Person(); System.out.println(person.name);//null Demo04.change(person); System.out.println(person.name);//输出lurenj } public static void change(Person person){ //person是一个对象:指向的是Person这个类 ---->Person person = new Person();这是个具体的人,可以改变属性 person.name = "lurenj"; } } //定义了一个Person类,有一个属性:name class Person{ String name;//null }
-
this关键字
- 当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在类中的成员变量;
public class Hello { String s = "Hello"; public Hello(String s) { System.out.println("s = " + s);//输出为:HelloWorld! System.out.println("1 -> this.s = " + this.s);//输出为:Hello this.s = s;//把参数值赋给实例变量,实例变量的值改变 System.out.println("2 -> this.s = " + this.s);//输出为:HelloWorld! } public static void main(String[] args) { Hello x = new Hello("HelloWorld!"); System.out.println("s=" + x.s);//验证实例变量值的改变,输出为:HelloWorld! } }
- 在构造函数中,通过this可以调用同一类中别的构造函数
package com.lurenj.oop.demo02; public class HelloA { public static void main(String[] args) { A aaa = new A(); aaa.print(); B bbb = new B(aaa); bbb.print(); } } class A { public A() { new B(this).print();// 调用B的方法 } public void print() { System.out.println("HelloAA from A!"); } } class B { A a; public B(A a) { this.a = a; } public void print() { a.print();//调用A的方法 System.out.println("HelloAB from B!"); } }
输出结果为:
HelloAA from A! HelloAB from B! HelloAA from A! HelloAA from A! HelloAB from B!
- 使用this同事传递多个参数
public class TestClass { int x; int y; static void showtest(TestClass tc) {//实例化对象 System.out.println(tc.x + " " + tc.y); } void seeit() { showtest(this); } public static void main(String[] args) { TestClass p = new TestClass(); p.x = 9; p.y = 10; p.seeit(); } }
类与对象的关系
- 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一具体的事物
- Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为
- 对象是抽象概念的具体实例
- 能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念,如张三就是一个人的一个具体实例,张三家的旺财就是狗的一个具体实例
我们可以将这些思想转换为代码实现
创建与初始化对象
- 使用new关键字创建对象
- 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
Application类:
package com.lurenj.oop.demo02;
//一个项目应该只存一个main方法
public class Application {
public static void main(String[] args) {
//类是抽象的,需要实例化
//类实例化后会返回一个自己的对象!
//student对象就是一个Student类的具体实例!
Student student = new Student();
Student xiaoming = new Student();
Student xiaohong = new Student();
xiaoming.name = "小明";
xiaoming.age = 3;
System.out.println(xiaoming.name);
System.out.println(xiaoming.age);
xiaohong.name = "小红";
xiaohong.age = 3;
System.out.println(xiaohong.name);
System.out.println(xiaohong.age);
}
}
Student类:
package com.lurenj.oop.demo02;
//学生类
public class Student {
//属性:字段
String name;
int age;
//方法
public void study(){
System.out.println(this.name + "在学习");//this代表当前类
}
}
- 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的,并且构造器有一下两个特点:
- 必须和类的名字相同
- 必须没有返回值类型,也不能写void
- 构造器的作用:
- 实例化初始值
- 使用new关键词本质是在调用构造器(构造方法),因此必须要有构造器的存在
- 定义有参构造器之后,如果想使用无参构造,就必须显示的定义一个无参构造
- IDEA创建构造器快捷方式:Alt + Insert
package com.lurenj.oop.demo02;
//通过IDEA查看java文件编译后的.class文件内容
/*
1.打开项目结构
2.Modules下,选择添加一个根目录,把out目录添加进来
*/
public class Person {
//一个类即使什么也不写,它也会存在一个方法
//通过查看class文件发现默认添加了一个方法
String name;
//如下构造器,无参构造器
public Person() { /* compiled code */
//作用1:实例化初始值
this.name = "lurenj";
//作用2:使用new关键字,必须要有构造器,本质是在调用构造器
}
//有参构造器,一旦定义了有参构造,无参构造就必须显示定义
public Person(String name){
this.name = name;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通