Java——面对对象基础

类与对象

题目:
请添加图片描述

=========================================================
代码:

import java.util.Scanner;
public class Learning {
    public static void main(String[] args){

        //创建一个猫对象(即创建一个实例)
        Cat cat1 = new Cat();// new Cat()创建一只猫,把创建的猫赋给cat1
        Cat cat2 = new Cat();

        cat1.name = "小白";//cat1的name属性为“小白“
        cat1.age = 3;//cat1的age属性为3
        cat1.color = "白色";//cat1的color属性为“白色“

        cat2.name = "小花";//cat1的name属性为“小花“
        cat2.age = 100;//cat1的age属性为100
        cat2.color = "花色";//cat1的color属性为“花色“

        //怎么访问对象的属性?
        System.out.println("第一只猫的信息为:"
                + cat1.name +"," + cat1.age +"," + cat1.color);
        System.out.println("第二只猫的信息为:"
                + cat2.name +"," + cat2.age + "," +cat2.color);
    }
}

//自定义一个类class,名字叫Cat
class Cat{
    //定义Cat这个类的属性(成员变量  n                                       nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn)
    String name;
    int age;
    String color;
    }

方法(成员方法)

入门了解代码

public class Learning {
    public static void main(String[] args){
        Person p3 = new Person();//1,创建对象
        p3.speak();//2,调用方法speak
        p3.count();//调用方法count
        p3.cal( 100 );

        int sum = p3.getSum(10,5);
        System.out.println("gesSum的返回值=" + sum);

    }
}

class Person{

//    public:表示方法是公开的  void:表示方法没有返回值  
// 	  speak():speak是方法名,()为形参列表
//    1,定义一个方法speak,输出一句话
    public void speak() {
        System.out.println( "我是一个好人" );
    }

    //2,定义一个方法count,计算1+2+......+100的结果
    public void count() {
        int res = 0;
        for( int i = 1; i <= 100 ;i++){
            res += i;
        }
        System.out.println("输出结果=" + res);
    }

    //3,方法calculate,接收参数n,计算1+2+.....+n
    public void cal(int n){//n为形式参数,可以接收用户输入
        int res =0;
        for( int i = 1; i <= n ;i++){
            res += i;
        }
        System.out.println("计算结果为=" + res);
    }

    //4,输入两个数,计算和
    // int:表示该方法执行后返回一个int值
    public int getSum(int n1, int n2){
        int res = n1 + n2;
        return res;
    }
}

练习题
//定义一个类AA。 定义一个方法,Boolean型,用来判断输入数字的奇偶,奇数为false,偶数为true

public class Learning {
    public static void main(String[] args){
        //定义一个类AA,定义一个方法,Boolean型,用来判断输入数字的奇偶,奇数为false,偶数为true
        AA deter = new AA();

        //1,一种输出方法
        boolean result = deter.determine(8);
        System.out.println( result );

        //2,另一种输出方法
        //deter.determine()返回值为boolean型,如果为true,即是奇数
        if( deter.determine(8)){
            System.out.println("奇数");
        }else{
            System.out.println("偶数");
        }
    }
}
class AA{
    public boolean determine(int num){
//        if( num % 2 != 0 ){
//          return true;
//        }else{
//            return false;
//        }
        //效果与上面的if-else效果一致,不能整除为奇数,返回true
        return num % 2 != 0 ? true : false;

    }
}

方法的传参机制

  1. 基本数据类型:传递的是值(拷贝值),形参的任何改变影响不了实参,所以在主函数中,实参不会因为调用了某个方法被改变。
  2. 引用数据类型:传递的是地址,形参的改变会影响实参,所以调用某个方法以后可能会发生改变。若调用的方法,其语句置空,只是把自己的新开的栈置空,不会影响对象。
public class Learning {
    public static void main(String[] args){
        B b = new B();
        Person p = new Person();
        p.age = 10;

        b.test2(p);
        System.out.print("主方法"+ p.age);
    }
}

class Person{
    int age;
}

class B{
    public void test2(Person p){
        //情况1: 对象属性age被改变
        //主方法的p.age=20000,测试的p.age=20000
        p.age = 20000;

        //情况2:null置空,只是把test2的新开的栈置空,不会影响对象
        //主方法的p.age=10,测试的p.age不存在,会报错
        p = null;
        System.out.print("测试"+ p.age);

        //情况3:在test2里面新建一个对象(new Person),然后赋给形参p(指向它),(新创建的对象是对原对象的复制)
        //结果不会影响原对象,主方法的p.age=10,测试的p.age=30000
        p = new Person();
        p.age = 30000;
        System.out.print("测试"+ p.age);
    }

}

递归

递归:就是方法自己调用自己,可以解决汉诺塔、迷宫、八皇后等问题。

八皇后问题:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
请添加图片描述

入门例子:

public class Learning {
    public static void main(String[] args){

        Test t = new Test();
        t.test(4);   //猜猜会输出什么?
    }
}

class Test{
    public void test(int n){
        if( n > 2){
           test(n-1);
        }
        System.out.println("n=" + n);
    }
}

输出
n=2
n=3
n=4
(方法里面自己调用自己,会有多个新开的栈,
栈像羽毛球筒一样,先开的栈在下面,因此后开的先出,先输出n=2)

阶乘

public class Learning {
    public static void main(String[] args){
        Test t = new Test();
        System.out.println( t.factorial(5) );
    }
}

class Test{

    //factorial阶乘
    public int factorial( int n){
        if( n == 1){
            return 1;
        }else{
            return factorial( n - 1) * n;
        }
    }
}

课堂练习 ——斐波那契数

斐波那契数:指的是这样一个数列:0,1,1,2,3,5,8,13,21,34,55,89,144……
它的规律是:这个数列从第 3 项开始,每一项都等于前两项之和。
在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*),显然,斐波那契数列是一个线性递推数列。

题目:输入一个数N,代表斐波那契数列的第N个数,然后输出这个数的值是多少

public class Learning {
    public static void main(String[] args){
        Test t = new Test();
        System.out.println(t.Fibonacci(8));
    }
}

class Test{
    //1: n=1,n=2, Fibonacci=1
    //2: n>=3, Fibonacci=前两项之和
    public int Fibonacci( int n){

        if( n == 1 || n== 2){
            return 1;
        }else{
            return ( Fibonacci(n-1) + Fibonacci(n-2) );
        }
    }
}

课堂练习—猴子吃桃

请添加图片描述
分析
//第10天,剩下1,day10=1
// 第9天,day10+1=2, 2x2=4 ,day9=4
// 第8天,day9+1=5, 5x2=10, day8=10
// 第七天,day8+1=11, 11x2=22, day7=22
// …
// 第1天,总数N

public class Learning {
    public static void main(String[] args){
        Test t = new Test();
        System.out.println(t.peach(1));//求第一天的桃子有多少
    }
}

class Test{
    //第10天,剩下1,day10=1
    // 第9天,day10+1=2, 2x2=4 ,day9=4
    // 第8天,day9+1=5, 5x2=10, day8=10
    // 第七天,day8+1=11, 11x2=22, day7=22
    // .........
    // 第1天,总数N
    public int peach( int day){
        if( day == 10){
            return 1;
        }else if( day >=1 && day <= 9){
            return  (peach(day+1) + 1) * 2;//后一天的个数+1,再乘以2
        }else{
            System.out.println("传入的天数day不对,10>=day>=1");
            return  -1;
        }

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值