从零开始学Java【15】
从零开始学Java【15】
学习视频:https://www.bilibili.com/video/BV12J41137hu?p=60
面向过程&面向对象

我们前面学习的都是面向过程

记住一句话:以类的方式组织代码,以对象的组织封装数据
回顾方法的定义

package com.zhang.oop;
public class Demo01 {
public static void main(String[] args) {
}
/*
*一个方法的定义
* 修饰符 返回值类型 方法名字(){
* //方法体
* return 返回值;
* } */
public String sayhello(){
return "hello world!";//返回一个字符串类型
}
public void hello(){
return;//返回一个空类型
}
public int max(int a,int b){
return a>b ?a:b;//返回一个int
}
}
方法的定义这个阶段熟透。
回顾方法的调用

- 静态方法/非静态方法
- 静态方法是有static修饰符的,一般不用实例化对象,直接就可以调用,比如:

在Student类里面设置一个静态方法say,然后以Demo02为主(因为运行的话只能有一个main方法,我把main方法设置在Demo02里面)那么在Demo02里面就直接调用方法即可,格式为【类名.方法名】
- 如果是非静态方法,即没有static修饰符修饰,则需要实例化对象,比如:

Student student = new Student();//实例化对象代码,对象类型 对象名 = 对象值
实例化Student这个类,对象为student(第一个小写的字母注意),从而调用这个已经被实例化的对象student里面的方法say
- 如果是一个类里面有两个方法,如:



非静态可以调用非静态和静态
静态可以调用静态
唯独静态不可以调用非静态
具体原理是:
- 静态对象是和类一起加载的,所以静态化的内容可以不用实例化就进行调用。
- 非静态对象是类实例化之后才存在的。
可以看到,静态的优先级 > 非静态,所以非静态才可以一开始就调用静态了,而调用非静态则需要一定的条件(实例化)。
- 形参和实参

这里的(int a,int b)就是形参,实际输入的a=1,b=2就是实参,而要求就是形参和实参要一一对应,比如这里的a和b的实际输入必须是int类型的,不能是其它类型的,不然会报错。
- 值传递/引用传递
- 值传递(拷贝一份,不影响初始的值)
参考文章:https://blog.csdn.net/weixin_45505313/article/details/104234884
public static void main(String[] args) {
int a = 10;
changeTest(a);
System.out.println("main:" + a);
}
public static void changeTest(int src) {
System.out.println("changeTest before:" + src);
src++;
System.out.println("changeTest after:" + src);
}
//输出:
changeTest before:10
changeTest after:11
main:10
值传递的本质就是把a复制一份复印件到需要的地方,不影响原来的值,可以看到,a在主函数被赋值为10,changeTest需要它,那么它就拷贝一份给changeTest函数,在这个函数里面做的任何操作,都不会影响a的值
而且changeTest有返回值的时候,也不影响a的值。
public static void main(String[] args) {
int a = 10;
changeTest(a);
System.out.println("main:" + a);
}
public static int changeTest(int src) {
System.out.println("changeTest before:" + src);
src++;
System.out.println("changeTest after:" + src);
return src;
}
//输出:
changeTest before:10
changeTest after:11
main:10
- 引用传递(传递对象,改动则改变对象里面的原有数值)

首先定义一个类Person,在主函数先进行实例化成一个对象person,在对person进行操作,第一次输出的时候,是输出null空类型的(String类型的默认为null),接着再执行change方法,而传入change方法的是对象,所以修改的时候是直接影响里面的值的。
类与对象的创建
类和对象的区别

总的来说,类是一个抽象的概念,对象是实例化的东西,是类的实例化
创建与初始化对象

首先先写一个类

然后写一个主函数,放main方法,来调用这个类(先实例化,再对对象进行操作)

其中的【对象.属性】=XXX就是对具体对象的赋值
构造器详解
首先创建一个Person类,并在主函数进行实例化

而其中的new会给创建好的对象进行默认的初始化以及对类中构造器的调用。具体如下:

首先先打开Person的class文件看一下:

可以看到,class文件里面默认加了一个同名的方法,而且这个方法没有返回值,这个方法就是构造器。其实每一个类都会有一个默认的无参构造器(从它class文件可以看出,如果没有写入构造器,那么它默认会有一个无参构造器的)
构造器的作用
- 使用new关键字,必须要有构造器,如果没有构造器则报错。所以new一个对象本质是调用构造器。
- 用来初始化值。可参考无参构造器和有参构造器,其实本质就是对于方法的重载。

上图就是new了一个对象,并且调用了构造器里面的具有初始值的属性,所以输出的时候才会有初始值,假如构造器里面没有对属性的初始化,那么new一个对象之后调用了一个空的构造器,那么返回自然为这个类型的默认值(0,null等等)。
无参构造/有参构造
- 无参构造

可以看到,里面是没有形参,没有方法体的,就是上面Person的class文件中的构造器
- 有参构造

其实可以看出,有参构造其实是对无参构造的方法重载。而且,如果有有参构造的话,无参构造必须也写上去,如果不写会报错的。有了有参构造,那么new对象的时候就可以赋值了:

在实例化的时候赋值:“小黄”,那么因为new关键字,会调用构造器,此时通过赋的值可以判断传入了有参构造器的形参“String name”中,“String name”又传给等号的右边的name,然后经过等号传给了等号左边的name,this.name的意思是指当前类的name,this指代的是当前的类。然后这个Person的name属性就有了值了。打断点如下:




注:前面都是对于对象person进行的操作,并不是Person类
所以,在后面,输出person.name的时候,这个对象才能有对应的值输出。同理,如果没有赋值,那么new对象的时候就会走无参构造器,默认输出name为null.
唤出构造器的快捷键
alt+insert

选择constructor

选择“ok”,则生成有参构造器,选择“Select None”就生成无参构造器
当有很多个属性的时候,比如新增一个 int age:

可以单单选择一个age生成一个构造器,也可以同时选中age和name,来生成一个新的构造器,也就是方法的重载,形参的数量不同罢了

可以根据自己的需要来生成构造器
总结
构造器规定:
- 和类名相同
- 没有返回值
构造器作用:
- new关键字本质就是调用构造器
- 初始化对象的值
注意点:
-
定义有参构造器,必须要有一个无参构造器
-
构造器里边一般都写:this.XXX =XXX ,this指代的是所属的这个类

浙公网安备 33010602011771号