初始Java对象
1什么是面向对象编程(面向对象编程与 面向过程编程的区别)
生活中举例
1面向对象编程:当你要实现一个功能的时候,不关心具体步骤,而是找一个已经具备该功能的人来帮我做
2面向过程编程:当你要实现一个功能的时候,每一个环节都亲历亲为,详细处理每一个细节
就拿我们生活中最为常见的点外卖举例
面向过程编程:我-》打车-》去店里-》下单-》等待-》取单-》打车回家
面向外卖编程:我-》点外卖
即红色的部分都由外卖小哥这一个对象来解决,不需要我参与,这就是面向对象编程的好处
java代码举例(以输出数组内容举例)
1 public class Test {
2 public static void main(String[] args) {
3 int[] arr={1,2,3,4,5} ;
4 //面向过程
5 System.out.println("面向过程编程");
6 System.out.print('[');
7 for (int i = 0; i < arr.length; i++) {
8 if(i!=0){
9 System.out.print(","+arr[i]);
10 }
11 else{
12 System.out.print(arr[i]);
13 }
14 }
15 System.out.println("]");
16 //面向过程
17 System.out.println("====================");
18 System.out.println("面向对象编程");
19 System.out.println(Arrays.toString(arr));
20
21 }
22 }
结果可见,两者的输出结果是相同的。但是使用面向对象编程大大的方便了我们编写代码
面向对象编程思想的好处:将复杂的事情简单化,把我们从执行者变成了指挥者
面向对象有四大基本特征:抽象,封装,多态,继承,我后面会撰写文章概述,在本章中我会先介绍封装
2类和对象的的关系
什么是类?
类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该
类事物。
现实中,描述一类事物:
属性:就是该事物的状态信息。
行为:就是该事物能够做什么。
什么是对象?
对象:是一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。
我们拿最近刷爆抖音的爱心鸡蛋早餐来举例子(单身狗自己烤),这个烤鸡蛋的模板就是一个类,而使用这个烤鸡蛋爱心
模具烤出来的一个个心型的爱心鸡蛋就是一个个对象
由此我们可以总结出对象与类的对应关系
类是对一类事务的描述,是抽象的
对象是具体的实例,是具体的(即一个个心型烤鸡蛋)
类是对象的模板,对象的类的实例
3类的定义
比如定义一个鸡蛋类
首先我们来复习一下前面提到的属性和行为
属性:就是该事物的状态信息。
行为:就是该事物能够做什么。
这个类的属性就是 size,weight 方法就是:cook() eat();
1 public class egg {
2 int size;//大小
3 int weight;//重量
4 //烤鸡蛋方法
5 public void cook(){
6 System.out.println("烤鸡蛋啦!!!");
7 }
8 //吃鸡蛋方法
9 public void eat(){
10 System.out.println("吃鸡蛋啦!!!");
11 }
12
13 }
4对象的创建
创建对象的格式
类名 对象名=new 类名();
egg eggone = new egg();
对象方法与属性的调用
对象名.属性值
对象名.方法名
public class Main {
public static void main(String[] args) {
egg eggone = new egg();
eggone.size=100;
eggone.weight=100;
eggone.cook();
eggone.eat();
}
}
5对象使用的一些细节
仍然以之前的egg对象来举例
public class egg {
int size;//大小
int weight;//重量
//烤鸡蛋方法
public void cook(){
System.out.println("烤鸡蛋啦!!!");
}
//吃鸡蛋方法
public void eat(){
System.out.println("吃鸡蛋啦!!!");
}
}
ublic class Main {
public static void main(String[] args) {
egg eggone = new egg();
eggone.size=100;
eggone.weight=100;
eggone.cook();
eggone.eat();
}
}
5.1对象在内存中的产生及分布
需要注意的点
堆中new对象中的方法存储的是地址值,通过地址值去找方法,有效的节省了空间
接下来将语句的执行步骤及出栈入栈的相关知识
对象要调用方法首先要通过图中黑色的线找到该对象在堆中的位置,再通过堆中存储的地址值找到方法区中存储的
方法,然后将该方法入栈执行
图中的1,2,3表示栈中的方法的出栈顺序,即在栈顶的方法先出栈(学过数据结构的同学理解起来应该会很简单)
5.2两个对象使用同一个方法的内存分布情况
5.3两个引用指向同一个对象
两个引用指向同一个对象与数组的情况基本相似,这里不做赘述,需要的可以去看完数组的那篇文章
链接点击链接跳转
5.4使用对象作为参数
package cn.itcast;
public class Main {
public static void main(String[] args) {
egg eggone = new egg();
eggone.size=100;
eggone.weight=100;
print(eggone);
}
public static void print(egg eggone){
System.out.println("鸡蛋大小是:"+eggone.size);
System.out.println("鸡蛋的重量是:"+eggone.weight);
}
}
结果
5.5使用对象作为返回值
public class Main {
public static void main(String[] args) {
egg eggone=createegg();
System.out.println("鸡蛋的大小:"+eggone.size);
System.out.println("鸡蛋的重量:"+eggone.weight);
}
public static egg createegg(){
egg eggone=new egg();
eggone.size=100;
eggone.weight=100;
return eggone;
}
}
结果
6类的封装性(介绍private 关键字与this关键字)
什么是类的封装性?
就是把该隐藏的隐藏起来,把该暴露的暴露出来。
封装的优越性
private关键字的介绍
使用private方法修饰的变量需要添加该变量的set和get方法
下面用一段代码来演示,在代码中我们加入了对age参数的限制,这也是使用封装的一大原因所在
package cn.itcast;
class Main2{
public static void main(String[] args) {
Person person = new Person();
Person person1 = new Person();
person.setAge(100);
person.setName("zhangsan");
System.out.println(person.getName());
System.out.println(person.getAge());
person1.setName("lisi");
person1.setAge(-10);
System.out.println(person1.getName());
System.out.println(person1.getAge());
}
}
class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
if (age<0){
System.out.println("年龄不合法");
}
else{
this.age = age;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
this关键字介绍
为什么使用this关键字?为了解决方法的重名问题,如图标红色的变量名,当传入的变量名与成员变量冲突时使用
1 class Person {
2 private int age;
3 private String name;
4
5 public int getAge() {
6 return age;
7 }
8 public void setAge(int age) {
9 if (age<0){
10 System.out.println("年龄不合法");
11 }
12 else{
13 this.age = age;
14 }
15
16 }
17
18 public String getName() {
19 return name;
20 }
21
22 public void setName(String name) {
23 this.name = name;
24 }
25 }
this的含义
表示当前所在类的当前对象的引用,即调用该方法的对象
this使用格式
this.变量名
7构造方法
当一个对象被创建时调用构造方法初始化该对象
这里肯定有读者就会问我之前创建的类也没有写啥构造方法啊!!
这是因为java给我们默认提供了一个无参数的构造方法但是一旦你自己自定义了一个构造方法,java
提供的默认无参构造方法就会失效
构造方法的定义格式
修饰符 构造方法名(参数列表){
// 方法体
}
下面我们用一段代码来带领大家开启构造方法
package cn.itcast;
class Main2{
public static void main(String[] args) {
Person person = new Person(18, "姚明");
System.out.println("名字:"+person.getName());
System.out.println("年龄:"+person.getAge());
}
}
class Person {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age<0){
System.out.println("年龄不合法");
}
else{
this.age = age;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
结果
由结果可见我们在初始化的时候已经给了该对象的属性赋值了,这就是构造方法的好处,构造方法中的参数由自己自行决定
注意事项
当你自己定义了构造方法之后,系统默认的构造方法自动失效,如果此时你还要使用无参构造,可以自行定义无参的构造
8JavaBean
什么是JavaBean?
JavaBean 是 Java语言编写类的一种标准规范。符合 JavaBean 的类,要求类必须是具体的和公共的,并且具有无
参数的构造方法,提供用来操作成员变量的 set 和 get 方法。
下面我来写一段标准的符合JavaBean规范的代码
class Person {
private int age;
private String name;
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age<0){
System.out.println("年龄不合法");
}
else{
this.age = age;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
以上就是我觉得有关java对象的一些基本的知识点,如果由错误还请大家批评指正