Java SE Day-06

1、类和对象

1、什么是类

是一类具有相同特性的事物的抽象描述,是一组相关属性行为的集合。

  • 属性:就是该事物的状态信息。
  • 行为:就是在你这个程序中,该状态信息要做什么操作,或者基于事物的状态能做什么。

2、什么是对象

对象是一类事物的一个具体个体(对象并不是找个女朋友)。即对象是类的一个实例,必然具备该类事物的属性和行为。
万物皆对象 万物皆对象 万物皆对象

3、类与对象的关系

  • 类是对一类事物的描述,是抽象的
  • 对象是一类事物的实例,是具体的
  • 类是对象的模板,对象是类的实体
  • 类只有通过对象才可以使用,而在开发之中应该产生类,之再产生对象。类不能直接使用对象是可以直接使用的

4、类与对象的定义格式

关键字:class(小写)

class 类名称 {
         属性 (变量) ;
         行为 (方法) ;
}

类的定义格式举例:

class Person {     // 类名称首字母大写
    String name ;
    int age ;
    public void tell() {        // 没有static
          System.out.println("姓名:" + name + ",年龄:" + age) ;
         }
}

对象的创建

类定义完成之后,肯定无法直接使用。如果要使用,必须依靠对象,那么由于类属于引用数据类型,所以对象的产生格式(两种格式)如下:

(1)格式一:声明并实例化对象

类名称 对象名称 = new 类名称 () ;

(2)格式二:先声明对象,然后实例化对象:

类名称 对象名称 = null ;
对象名称 = new 类名称 () ;

引用数据类型与基本数据类型最大的不同在于:引用数据类型需要内存的分配和使用。所以,关键字new的主要功能就是分配内存空间,也就是说,只要使用引用数据类型,就要使用关键字new来分配内存空间。
对象.属性:表示调用类之中的属性;
对象.方法():表示调用类之中的方法。

关键字:new

new 类名()//也称为匿名对象

//给创建的对象命名
//或者说,把创建的对象用一个引用数据类型的变量保存起来,这样就可以反复使用这个对象了
类名 对象名 = new 类名();

小结:要使用一个方法需要先创建类,然后调用,方法是在类里面的;


2、包和使用特点

1、什么是包?

简单的来说可以理解为文件夹,在我们的电脑上,所有的文件都是存放在文件夹内部,文件夹内部可以是文件也可以是文件夹,这里的包可以理解为存放子级包或者直接存放类文件的文件夹。
有什么用处?

通过合理的使用包,我们能将一个项目进行简单的结构梳理,通过不同的名称来区别每个包中存放什么文件,能大幅度降低我们对项目的书写和维护成本。

2、包的作用

(1)可以避免类重名:有了包之后,类的全名称就变为:包.类名

(2)可以控制某些类型或成员的可见范围

​ 如果某个类型或者成员的权限修饰缺省的话,那么就仅限于本包使用。

(3)分类组织管理众多的类

3、怎么定义包?

当我们在创建一个包后,我们在其内部创建好文件以后,需要在类的开头进行声明

比如我们在pack包下存放了一个Hello.java文件
则需要在此文件的开头进行声明

package pack;

如果说存在着包的嵌套,那么我们将以.进行级别的划分

如果我们在pack/pack2包内部存放着一个Hello.java文件
则我们应该在此文件的开头进行声明

package pack.pack2;

小结:充分了解了包,有助于后期在项目阶段进行一个代码的梳理不至于,使得寻找代码更加简洁;


3、方法

1、方法的概念

方法也叫函数,是一组代码语句的封装,从而实现代码重用,从而减少冗余代码,通常它是一个独立功能的定义,方法是一个类中最基本的功能单元。

Math.random()random()方法
Math.sqrt(x)sqrt(x)方法
System.out.println(x)println(x)方法

Scanner input = new Scanner(System.in);
input.nextInt()nextInt()方法

2 、方法的特点

(1)必须先声明后使用

类,变量,方法等都要先声明后使用

(2)不调用不执行,调用一次执行一次。

3、如何声明方法

1、声明方法的位置

声明方法的位置必须在类中方法外,即不能在一个方法中直接定义另一个方法。

声明位置示例:

{
    方法1(){
    }
    方法2(){
    }
}

错误示例:

{
    方法1(){
        方法2(){  //位置错误
   		}
    }
}

2、声明方法的语法格式

【修饰符】 返回值类型 方法名(【形参列表 】)throws 异常列表】{
        方法体的功能代码
}

(1)一个完整的方法 = 方法头 + 方法体。

  • 方法头就是 【修饰符】 返回值类型 方法名(【形参列表 】)【throws 异常列表】,也称为方法签名,通常调用方法时只需要关注方法头就可以,从方法头可以看出这个方法的功能和调用格式。
  • 方法体就是方法被调用后要指定的代码,也是完成方法功能的具体实现代码,对于调用者来说,不了解方法体如何实现的,并影响方法的使用。

(2)方法头可能包含5个部分,但是有些部分是可能缺省的

  • 修饰符:可选的。方法的修饰符也有很多,例如:public、protected、private、static、abstract、native、final、synchronized等,后面会一一学习。其中根据是否有static,可以将方法分为静态方法和非静态方法。其中静态方法又称为类方法,非静态方法又称为实例方法。实例方法

返回值类型: 表示方法运行的结果的数据类型,方法执行后将结果返回到调用者

  • 基本数据类型
  • 引用数据类型
  • 无返回值类型:void

方法名:给方法起一个名字,见名知意,能准确代表该方法功能的名字

参数列表:表示完成方法体功能时需要外部提供的数据列表

  • 无论是否有参数,()不能省略
  • 如果有参数,每一个参数都要指定数据类型和参数名,多个参数之间使用逗号分隔,例如:
    • 一个参数: (数据类型 参数名)
    • 二个参数: (数据类型1 参数1, 数据类型2 参数2)
  • 参数的类型可以是基本数据类型、引用数据类型
  • throws 异常列表:可选,在异常章节再讲(非常规部份)

(3)方法体:方法体必须有{}括起来,在{}中编写完成方法功能的代码

关于方法体中return语句的说明:

  • return语句的作用是结束方法的执行,并将方法的结果返回去
  • 如果返回值类型不是void,方法体中必须保证一定有 return 返回值; 语句,并且要求该返回值结果的类型与声明的返回值类型一致或兼容。
  • 如果返回值类型为void时,方法体中可以没有return语句,如果要用return语句提前结束方法的执行,那么return后面不能跟返回值,直接写return ; 就可以。
  • return语句后面就不能再写其他代码了,否则会报错:Unreachable code

3、方法调用语法格式

对象.非静态方法(【实参列表】)

小结:理解的声明格式,进行一个方法的创建,然后在进行一个使用,最后调用是得先实例化对象


4、访问修饰符

Java面向对象的基本思想之一是封装细节并且公开接口。Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节。访问控制分为四种级别:

public: 公共的

public: 用public修饰的类、类属变量及方法,包内及包外的任何类(包括子类和普通类)均可以访问;

private: 私有的

private: 用private修饰的类、类属变量及方法,只有本类可以访问,而包内包外的任何类均不能访问它。

package/friendly/default :不写 (缺省)

default: 如果一个类、类属变量及方法没有用任何修饰符(即没有用public、protected及private中任何一种修饰),则其访问权限为default(默认访问权限)。默认访问权限的类、类属变量及方法,包内的任何类(包括继承了此类的子类)都可以访问它,而对于包外的任何类都不能访问它(包括包外继承了此类的子类)。default重点突出包;

protected:受保护的

protected: 用protected修饰的类、类属变量及方法,包内的任何类及包外那些继承了该类的子类才能访问,protected重点突出继承;

在这里插入图片描述

比如public 表示公共的

public String name;

maxHP 没有修饰符即代表package/friendly/default

float maxHP

小结:public:公用的所以任何类都可以调用,其他的暂时了解的不深。


5、带有返回值的方法特点

方法调用表达式是一个特殊的表达式:

  • 如果被调用方法的返回值类型是void,调用时不需要也不能接收和处理(打印或参与计算)返回值结果,即方法调用表达式只能直接加;成为一个独立语句。
  • 如果被调用方法有返回值,即返回值类型不是void,
    • 方法调用表达式的结果可以作为赋值表达式的值,
    • 方法调用表达式的结果可以作为计算表达式的一个操作数,
    • 方法调用表达式的结果可以作为另一次方法调用的实参,
    • 方法调用表达式的结果可以不接收和处理,方法调用表达式直接加;成为一个独立的语句,这种情况,返回值丢失。

在处理返回值注意事项:

(1) 返回值可有可没有,如果没有,使用void代替
(2) 在有返回值的方法方法体中,返回值必须只能有一个
(3) 返目值返回的数据也很广泛,可以是常量,变量,也可以是一个表达式,比如return 1+2;return a+b
(4)方法体中,返回的数据类型一定要和定义方法是返回值的类型保持完全一致。

小结:方法声明时如果有void则不需要return,反之什么类型就return什么类型的值


6、带参的方法和参数特点

方法

方法的参数传递机制:实参给形参赋值,那么反过来形参会影响实参吗?

  • 方法的形参是基本数据类型时,形参值的改变不会影响实参;
  • 方法的形参是引用数据类型时,形参地址值的改变不会影响实参,但是形参地址值里面的数据的改变会影响实参,例如,修改数组元素的值,或修改对象的属性值。
    • 注意:String、Integer等特殊类型容易错

参数特点

1、值类型参数特点:

当方法的参数是值类型时,因为值类变量里存放的即变量的值
形参和实参会完成变量值的拷贝。当方法内代码完成形参值的改变时,实参不会同步改变。

2、引用类型变量赋值特点:

当引用类型变量完成相互赋值时,即完成对象地址的拷贝,而非对象属性的拷贝。

3、引用类型参数特点:

当引用类型作为方法参数使用时,因为参数的数据类型为引用类型,变量里存放的是对象的内存地址,所以形参和实参实际是同一个对象,改变实参的值,形参也会改变。

小结:方法内所带的形参与实参应保持同一类型。


7、基础类型和引用类型传参

基础类型作为形参——值传递

基本类型作为形参传递的时候,传递的是值,在函数体内修改基本类型的值是不会改变原本的函数体外的变量的值。

public class MyCode {
    public static void main(String[] args) {
        int a=1,b=2;
        MyCode myCode=new MyCode();
        myCode.change(a,b);
        System.out.println(a+" "+b);
    }
    public void change(int a,int b){
        int temp;
        temp=a;
        a=b;
        b=temp;
    }
}

1 2

可以看到,我们在函数体内修改了a,b的值,但是函数体外的值并没有受到影响,因此,基本类型在作为形参传递的时候,只是将值传递进去,并没有将变量传进去。

引用类型作为形参传递——本质也是值传递

引用类型在作为形参传递的时候,很多人认为这是一个地址传递,因为引用类型在传入函数体后,我们操作引用的对象,对象的数据是改变了的,因此很多人认为这是一个地址传递,但引用和地址存在着本质的区别。我们来看下面这个例子。

public class Mycode2 {

    public static void main(String[] args) {
        Node node=new Node("A");
        Node node2=new Node("B");
        System.out.println(node.name+"的原始地址为"+node);
        System.out.println(node2.name+"的原始地址为"+node2);

        Mycode2 mycode2=new Mycode2();
        mycode2.change(node,node2);
        System.out.println(node.name+"方法体处理后地址"+node);
        System.out.println(node2.name+"方法体处理后地址"+node2);
    }

    public void change(Node node,Node node2){
        System.out.println(node.name+"刚传进来的地址为"+node);
        System.out.println(node2.name+"刚传进来的地址为"+node2);
        node=new Node("C");
        node2.name="D";
        System.out.println(node.name+"方法体内的地址"+node);
        System.out.println(node2.name+"方法体内的地址"+node2);
    }
}

class Node{
    public String name;
    public Node(String name){
        this.name=name;
    }
}

运行结果:

A的原始地址为wttext3.Node@1540e19d
B的原始地址为wttext3.Node@677327b6
A刚传进来的地址为wttext3.Node@1540e19d
B刚传进来的地址为wttext3.Node@677327b6
C方法体内的地址wttext3.Node@14ae5a5
D方法体内的地址wttext3.Node@677327b6
A方法体处理后地址wttext3.Node@1540e19d
D方法体处理后地址wttext3.Node@677327b6

参考资料

小结:主要理解类型的传入,什么类型转入就需要什么类型


总结:使用对象或者方法的前提是需要类的,类体内进行一个方法的构造让我们不用一直重复的编写代码,减少代码的繁杂,利于我们对代码的理解;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值