面向对象1

面向对象1

1.Java方法(函数)

概念

方法也叫函数,其实就是具有一定特殊功能的一段代码,将需要的在多个位置重复使用的一组代码,定义在方法内部。

意义:

1.避免重复的代码 2.增强了程序的扩展性能。

定义方法

用法:方法的定义(声明)

	public static void main(String[] args) 

语法格式:

    [修饰符1,修饰符2....] 返回值/void 方法名(参数列表){
		......
		return
    }

示例:

public class Demo1_method {
     /*
     [修饰符1,修饰符2....] 返回值/void 方法名(参数列表){
		......
        return
     }
    */
    //定义方法
    //1.定义没有返回值的方法
    //方法名:标识符,尽量见名知意,驼峰命名
    public static void getSum() {
        System.out.println("你好");
        int he = 0;
        for (int i = 0;i<=15;i++){
            he += i;
        }
        System.out.println(he);
    }

    //2.定义有返回值的方法
    public static int getSum2(){
        int he = 0;
        for (int i = 0;i<=15;i++){
            he += i;
        }
        return he;
    }

    //3.定义有返回值有参数的方法
    public static int getSum3(int num){
        int he = 0;
        for (int i = 0;i<=num;i++){
            he += i;
        }
        return he; //1.结束方法的执行。2.将返回值返回给方法的调用处
    }

    public static void main(String[] args) {
        //定义:是具有一段特殊功能的代码
        //求:1—10之间的和
        int sum = 0;
        for(int i=1;i<=10;i++){
           sum += i;
        }
        System.out.println("1-10之间的和:"+ sum);
        System.out.println("hello,world!");
        System.out.println("hello,world!!!");
        //方法的调用
        //1.没有返回值的方法: 方法名(); 注意:在同一个类中调用它的静态方法可以直接调用静态方法
        getSum();
        //注意:如果调用的是其他类中的静态方法 必须是: 类名.静态方法();
        Demo1_method.getSum();
        System.out.println("-------------");
        //2.有返回值的方法: 数据类型 变量 = 方法名();
        int result = getSum2();
        System.out.println("有返回值的方法:"+result);
        //3.有返回值有参数的方法的调用:
        int result2 = getSum3(3);
        int result3 = getSum3(4);
        System.out.println("1到3的和:"+ result2);
        System.out.println("1到4的和:"+ result3);
    }
}

调用方法

方法的调用(如果一个方法只有定义,那么方法中代码并没有被执行,只是被调用了才会执行方法,只有被调用了才会执行方法中的代码)

通过方法的名字进行调用。

static的方法 :静态方法
	类名.方法名();  //本类中类名可以省略。
非static的方法 :非静态方法
	创建该类的对象,通过对象调用方法。
	类名 对象名 = new 类名();
	对象名.方法名();

示例:

public class Demo2_method {

    public static  void print1(){
       for(int i = 0;i < 5;i++){
           System.out.println("hello,world!"+i);
       }
    }

    public void print2(){
        for(int i = 0;i < 6;i++){
            System.out.println("hello,world!"+i);
        }
    }
    public static void main(String[] args) {
        //static方法的调用:直接调用方法名
        print1();
        //如果调用其它类的static方法,需要: 类名.方法名();
        Demo2_method.print2();
        System.out.println("----------------");
        //非static方法调用:1.先创建对象, 2.对象名.方法();
        Demo2_method demo2_method = new Demo2_method();
        demo2_method.print2();

    }
}
public class Demo5_method {
    /**
     * 方法的调用
     */
    public static void test1(){
        System.out.println("test1--------------------");
    }
    public static void test2(){
        test1();
        System.out.println("test2------------------");
    }
    public static void test3(){
        test1();
        System.out.println("test3-----------");
    }
    public static void main(String[] args) {
        test1();
        System.out.println("-----------");
        test2();
        System.out.println("-----------");
        test3();
    }
}

方法返回值

如果一个方法调用之后,需要返回给调用处结果,那么表示这个方法有返回值,在方法中需要使用return语句把结果返回给调用出。

//方法定义
public static 返回值类型 方法名(){
	//......
	return 结果;
}

//方法调用处
变量 = 方法名(); //变量 = 结果

如果一个方法,没有返回值,那么写void即可。

return语句:

​ A:把方法中的返回值,返回给方法的调用处;

​ B:同时结束了这个方法的执行。

public class Demo3_return {
    //如果声明了有返回值就必须使用return
    public static int getSum(){
        return 3;
    }
    public static void main(String[] args) {
        int sum =  getSum();
        System.out.println(sum);
    }
}

注意点:

​ 1.如果一个方法声明了有返回值(非void),那么方法中一定要使用return语句返回结果。

​ 2.定义方法的时候,声明返回值的类型,一定要和return后实际上返回的数值类型一致。

​ 3.如果一个方法声明了有返回值,如果方法中有分支语句或者循环语句,那么要保证无论执行那个分支,都要有return可以被执行到。

​ 4.如果一个方法声明没有返回值(void),那么方法中也可以使用return语句,用于强制结束方法的执行。

public class Demo4_return {
    //return要注意的点
    /**
     * 1.如果声明了有返回值,那么必须声明有return
     * @return
     */
    public static double getNum(){
        return 5; //兼容的数据类型,会发生隐式类型转换
    }

    /**
     * 2.定义方法的时候,声明的返回值类型,一定要和return后实际上返回值类型一致
     * @return
     */
    public static long getNum2(){
        byte b = 34; //声明一个byte类型的变量
        return b;
    }

    /**
     * 3.如果一个方法声明了有返回值,如果方法中有分支语句或者循环语句,那么要保证无论执行那个分支,都要有return可以被执行到。
     * @return
     */
    public static int getNum3(){
        int num = 45;
        if(num > 0){
            return num;
        }else{
            System.out.println("num:"+num);
            return 0;
        }
    }

    /**
     * 4.如果一个方法声明没有返回值(void),那么方法中也可以使用return语句,用于强制结束方法的执行。
     */
    public static void getNum4(){
        int a = 12;
        if (a > 10){ //如果符合条件,那么就会进入分支结构,然后执行return,结束方法的执行
            return;
        }
        System.out.println("hello,a:"+a);
    }

    public static void main(String[] args) {
        double num = getNum();
        System.out.println(num);
        long num2 = getNum2();
        System.out.println(num2);
        int num3 = getNum3();
        System.out.println(num3);
        getNum4();
    }
}

方法参数

一个方法中,有些数据的数值不确定,我们定义为参数,由掉用处调用方法的时候,传入具体的数据。

形式参数:形参

定义方式:声明的参数,用于接收调用处传来的数据。

实际参数:实参 调用方法时,实际赋值给形参的数据。

示例:

public class Demo6_method_param {
    /**
     * 方法的参数(param)
     */
    //打印一个直角三角形
    public static void printShape(){ //无参数
        for(int i = 1; i <= 5; i++){
            for(int j = 1; j <=i; j++){
                System.out.print("*");
            }
            //换行
            System.out.println();
        }
    }

    //打印一个直角三角形
    public static void printShape(int n){ //有参数
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <=i; j++){
                System.out.print("*");
            }
            //换行
            System.out.println();
        }
    }

    public static void main(String[] args) {
        printShape();
        printShape(10); //实参形参要一一对应,参数的个数,类型,顺序都要一一对应
    }
}

实参一定要严格匹配形参,一一对应,包括顺序,个数,类型。

方法分类:

​ 有返回值:

​ 有参有返回值:public static 返回值类型 方法名(形参列表){}

​ 无参有返回值:public static 返回值类型 方法名(){}

​ 无返回值:

​ 有参无返回值:public static void 方法名(形参列表){}

​ 无参无返回值:public static void 方法名()

方法重载

概念:一个方法的多种形式。

同一个类中

方法名相同

参数列表必须不同(顺序,个数,类型)

与static,返回值,其他的修饰符。。。这些无关

示例:

public class Demo7_overload {
    // 方法的重载:在同一个类中,方法名相同,参数列表不同(个数,顺序,类型)
    public static int getSum(int a,int b){
        return a+b;
    }

    public static int getSum(int a,int b, int c){
        return a+b+c;
    }

    public static double getSum(double a,double b){
        return a+b;
    }

    public static void main(String[] args) {
        int getSum1 = getSum(3,5);
        System.out.println("getSum1:"+getSum1);
        double getSum2 = getSum(3.1,4.4);
        System.out.println("getSum2:"+getSum2);
        int getSum3 = getSum(1,2,3);
        System.out.println("getSum3:"+getSum3);
    }
}

递归

方法中调用方法本身,就叫做递归方法。

递归方法一定要有出口的,逐层的像出口靠近。

示例:

public class Demo8_recursion {
    //递归
    //没有返回值的递归
    public static void test1(int n){
        System.out.println("test1----------"+ n);
        if(n==1){
            return; //方法的出口
        }
        test1(n-1); //递归自己调用自己 但是 递归一定要有出口。
    }

    //有返回值的递归 (递归方式求1-5的和)
    public static int getSum(int n){
       if(n==1){
           return 1; //方法的出口
       }
        return getSum(n-1)+n;
    }

    public static void main(String[] args) {
        test1(5);
        //调用递归的方式来求1-5的和
        int sum = getSum(5);
        System.out.println(sum);
    }
}

2.封装

面向对象思想概述

面向对象编程(OOP) 是一种编程思想

面向过程:关注过程。 面向对象:关注的是对象

类和对象

什么是类:

:是一组相关属性和行为得到集合,可以看成是一类事务的模板,现实生活中的,描述一类事物。

属性:该事物的状态信息。

行为:就是该事物能干什么。

什么是对象:

对象:一类事物的一个实例:一只小猫

举例:一只小猫

属性:Tom,5kg,2years,yellow。行为:喵喵叫。

类和对象的关系

​ 类是对一类事物的描述,是抽象的。

​ 对象是一类事物的实例,是具体的。

​ 类是对象的模板,对象是类的实体。

类的定义

构建一个类:

[修饰符] class 类名{
	//1.属性字段:Field
	成员变量
	//2.成员方法:Method
	行为功能
	//3.构造方法:Contructor
}

示例:

public class Person {

    //属性,成员变量
    public int age; //姓名
    public String name; //年龄
    //...

    //行为,成员方法
    public void eat(){
        //局部变量
        int age = 20;
        System.out.println("吃饭。。。");
    }

    public void sleep(){
        System.out.println("睡觉。。。");
    }
}

创建一个对象

类名 对象 = new 类名();

使用对象访问类中的成员:

对象名.成员变量;
对象名.成员方法();

示例:

public class PersonTest {
    public static void main(String[] args) {
        //创建对象
        //类名 对象名 = new 类名();
        Person person = new Person();
        //访问成员变量成员方法
        //设值
        person.age = 23;
        person.name = "张三";
        //取值
        System.out.println("person对象的年龄:"+person.age);
        System.out.println("person对象的姓名:"+person.name);
		//成员方法的调用
        person.eat();
        person.sleep();
    }
}

类中成员变量,和局部变量不同,有默认值。

基本类型:

int,byte,short,long,float,double默认值都是0。

char 的默认值是“空字符”,也就是"\u0000",数值为0;

boolean默认值false

引用类型:默认值都是null,空。

构造函数

构造方法是一种特殊的方法:

1.定义的语法结构不同:

[访问修饰权限] 方法名(参数列表){

}
修饰符:访问权限修饰符
没有返回值类型,也不写void
方法名必须要和类名一致
参数:
	没有参数:无参构造
	有参数列表:有参构造

2.调用不同:

1.通过new关键字调用
2.new 构造方法();

3.作用不同:专门用于创建对象的

注意点:如果一个类中,没有写构造方法,那么当创建对象的时候,编译器会自动添加一个无参的构造方法,但是类中如果写了构造方法,那么编译器将不再自动添加无参了。

示例:

public class Person {
    //属性,成员变量
    public int age; //姓名
    public String name; //年龄
    //...
    //行为,成员方法
    public void eat(){
        //局部变量
        int age = 20;
        System.out.println("吃饭。。。");
    }

    //行为,成员方法
    public void sleep(){
        System.out.println("睡觉。。。");
    }

    /*
      [访问修饰权限] 方法名(参数列表){

      }
    */
    public Person(){ //默认的无参构造方法
        System.out.println("这是无参构造方法");
    }

    //在创建对象的同时可以直接给成员变量赋值
    public Person(String n,int a){ //有参构造方法
        System.out.println("这个是有参构造方法");
        name = n;
        age = a;
    }
}
public class PersonTest {
    public static void main(String[] args) {
        //创建对象
        //类名 对象名 = new 类名();
        Person person = new Person(); //创建person对象走无参构造方法
        //访问成员变量成员方法
        //设值
        person.age = 23;
        person.name = "张三";
        //取值
        System.out.println("person对象的年龄:"+person.age);
        System.out.println("person对象的姓名:"+person.name);
        //成员方法的调用
        person.eat();
        person.sleep();

        System.out.println("---------");
        Person person2 = new Person("李四",45); //创建person2对象走有参构造方法
        System.out.println("person2对象的名字:"+person2.name);
        System.out.println("person2对象的年龄:"+person2.age);
    }
}

打印结果:
这是无参构造方法
person对象的年龄:23
person对象的姓名:张三
吃饭。。。
睡觉。。。
---------
这个是有参构造方法
person2对象的名字:李四
person2对象的年龄:45

this关键字

this关键字:代表所在类的当前对象的引用,即对象自己的引用

方法被那个对象调用,方法中的this就代表那个对象,即谁在调用,this就代表谁

指代本类的对象,可以访问本类的属性和方法

用途1:当局部变量和成员变量命名冲突的时候,通过this来区分。

this.成员变量

示例:

public Person(String name,int age,String sex){
	this.name = name;
	this.age = age;
	this.sex = sex;
}

用途2:访问本类的属性和方法。

this.属性;
this.方法();

习惯上直接省略this,直接用属性和方法。

public void print(){
	System.out.println("名字:"+ this.name,"性别:"+sex,"年龄:"+age);
}
public void eat(){
    this.print();
}

指代构造方法:this();

如果存在多个构造方法,那么this指代的构造方法要靠参数来区分:顺序,个数,类型。

**注意:**this指代构造函数只能放在第一句。

示例:

//默认的无参构造方法
public Person(){
	System.out.println("这是默认的构造方法!");
}
//有参的构造方法
public Person(){
	this(); //可以调用无参的构造方法
	this.name = name;
	this.age = age;
}

public Person(String name,int age,String sex){
    this(name,age); //有参的构造方法
//    System.out.println(name);
//    System.out.println(age);
//    System.out.println(sex);
//    this.name = name;
//    this.age = age;
    this.sex = sex;
    
}

面向对象三大特性之封装

面向对象有三个特性:封装,继承,多态

封装性:尽可能隐藏对象的内部实现细节。控制对象的修改以及访问的权限。

1.隐藏了实现的细节;

2.提高了代码的复用性

3.提高了安全性,保护了细节,保护数据的安全。

封装步骤:

在类中,属性的数值不安全,所以要将属性进行封装。

1.使用private修饰符来修饰属性。限于本类中访问。

2.因为对象对属性的操作:赋值和取值。

​ 类中提供两个方法,分别用于给属性赋值和取值。

​ 赋值方法setter:setXXX():比如setAge(),setName()

​ 取值方法getter:getXXX():比如getAge(),getName()

访问修饰符4个
public:公共的
private:私有的,属性,方法 只能在本类中使用

示例:

public class Student { //封装
    //第一步:用访问修饰符修饰成员变量,限于本类访问
    //三个成员变量
    private String stuNo;
    private int age;
    private char sex;

    //第二步:提供设值取值相应的方法
    public String getStuNo() {
        return stuNo;
    }

    public void setStuNo(String stuNo) {
        this.stuNo = stuNo;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        //可以在set方法中设置一些条件规则
        if(age<0){
            System.out.println("要设置的参数不合理,请重新赋值!");
            return;
        }
        this.age = age;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    //成员方法,行为
    public void study(){
        System.out.println("学习------------");
    }

    public void play(){
        System.out.println("玩游戏------------");
    }

    //打印自己本身的属性
    public void print(){
        System.out.println("stuNo:"+stuNo);
        System.out.println("age:"+age);
        System.out.println("sex:"+sex);
        System.out.println("hahahah");
    }

}
public class StudentTest {
    public static void main(String[] args) {
        //1.创建对象
        Student student = new Student();
        student.setStuNo("001");
        student.setAge(18);
        student.setSex('男');
        student.print();

        System.out.println("------------------------");
        Student student2 = new Student();
        student2.setStuNo("001");
        student2.setAge(18);
        student2.setSex('女');

        student2.print();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值