zoukankan      html  css  js  c++  java
  • 人生苦短我学Java-6-面向对象之类与方法定义/实例化/重载/可变个数形参/递归

    一、面向对象

    1、面向对象的三大特征
    • 封装
    • 继承
    • 多态
    如果要说是四大特征就多加:抽象性
     
    2、类(Class)和对象(Object)是面向对象的核心概念。
    •  类是对一类事物的描述,是抽象的、概念上的定义。重点就是类的设计(比如我们人类,是有哪些特征等等)
    •  对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。

    类就好比如是:人类

    对象:实实在在的我

    如下:创建PersonTest类,其中有属性有方法:

    package com.object;
    
    /*
    @USER PPL-泡泡龙 or 广深小龙
    @date 2020-12-20 12:42
    */
    
    public class Person {
        public static void main(String[] args) {
            PersonTest p1 = new PersonTest();
            p1.name = "ppl";
            p1.age = 18;
            p1.isMale = true;
            p1.eat();
            p1.sleep();
            p1.talk();
        }
    
    }
    
    class PersonTest {
    
        // 属性
        String name;
        int age;
        boolean isMale;
    
        // 方法
        public void eat() {
            System.out.println("人吃什么?答:人间烟火");
        }
    
        public void sleep() {
            System.out.println("人需要睡觉休息,专家建议每天睡眠至少8小时");
        }
    
        public void talk() {
            System.out.println("人可以说话,但我说的是中文");
        }
    }

    3、类属性(成员变量)与局部变量

    也意味着作用域不一样。

    特别需要注意:局部变量在调用前是没有初始值,所以一定要在调用前初始化值,除了形参以调用时传入;

    package com.object;
    
    /*
    @USER PPL-泡泡龙 or 广深小龙
    @date 2020-12-20 12:15
    */
    
    public class ObjectTest {
        public static void main(String[] args) {
            User user = new User();
            user.name = "泡泡龙";
            user.age = 18;
            user.eat("米饭");
        }
    }
    
    class User {
    
        // 类的变量
        String name;
        int age; 
    
        public void eat(String food) {
            System.out.println("姓名:" + name + " 吃的是什么? 答案:" + food);
            System.out.println("年龄只有:" + age);
    
            String IsMale = "true";  // 方法的变量(局部变量)
            System.out.println("我是局部变量:" + IsMale);
        }
    }

    4、类的方法声明

    • pubilc String xx:定义了返回值为String类型,就一定要有String返回值;
    • pubilc String xx(String xxx){}:形参xxx,可以多个形参,逗号分开,调用该方法时传入;
    • 方法中也可以调用类的属性;
    • return既是结束这个方法执行,并返回值;(结束后面不可再执行,因已结束方法);
    • 在类中的方法A它可以调用方法B等等,特殊的递归,方法A调用方法A;(慎用递归)
    • 方法中,不能再定义方法;(Python里面是可以的,常用装饰器便如此)
    package com.object;
    
    /*
    @USER PPL-泡泡龙 or 广深小龙
    @date 2020-12-20 16:20
    */
    
    public class ClassM {
        public static void main(String[] args) {
            ClassTest m = new ClassTest();
            m.eat("米饭");
            System.out.println(m.name);
            System.out.println(m.getName());
            System.out.println(m.returnName());
    
            // 引用类型
            ClassTest[] st = new ClassTest[3];
            st[0] = new ClassTest();
            System.out.println("111" + st[0].name);
        }
    }
    
    class ClassTest {
    
        // 类属性
        String name = "泡泡龙";
    
        // 形参:food,可以多个逗号分开
        public void eat(String food) {
            System.out.println("吃的是:" + food);
        }
    
        // 有返回值:return,需指定返回的类型,比如:String
        // 但是命名指定了返回值的类型,就一定要有:return返回值
        public String getName() {
            eat("面条");      // 方法内部调用方法
            return name;
        }
    
        // 判断语句,需要在各个分支都要return
        public String returnName() {
            if ("泡泡".contains(name)) {
                return name;
            } else if ("泡泡龙".contains(name)) {
                return "1";
            } else {
                return "-1";
            }
        }
    }

    输出:

    吃的是:米饭
    泡泡龙
    吃的是:面条
    泡泡龙
    1
    111泡泡龙

    5、匿名实例化对象

    在实例化中,没有赋值给一个变量,即为匿名实例化;

    特征:只能调用一次(再调用就是新的调用,内存解析会重新执行)new ClassName().方法名;

    package com.object;
    
    /*
    @USER PPL-泡泡龙 or 广深小龙
    @date 2020-12-20 17:47
    */
    
    public class Instance {
        public static void main(String[] args) {
    
            // 正常实例化
            PersonT p = new PersonT();
            p.GetAge();
    
            // 匿名实例化
            new PersonT().GetAge();
        }
    }
    
    class PersonT {
        int age = 8;
    
        public void GetAge() {
            System.out.println(age);
        }
    }

    6、方法重载

    同一个类,相同的方法名,参数不同包括形参个数,不同参数的类型。跟起它都没有关系,比如返回值,修饰符等。

    简单来说处理不同数据类型的时候,可以定义不同类型,同名称的方法,方便我们任何类型进行调用。

    package com.object1220;
    
    /*
    @USER PPL-泡泡龙 or 广深小龙
    @date 2020-12-20 19:47
    */
    
    public class OverLoad {
    
        // 方法重载,定义两个同名的方法:print
        public String print(String str) {
            return str;
        }
    
        public int print(int num) {
            return num;
        }
    }
    
    class OverLoadTest {
        public static void main(String[] args) {
            OverLoad o = new OverLoad();
            System.out.println(o.print("字符串"));
            System.out.println(o.print(666));
        }
    }

    7、可变个数形参方法

    格式:public void 方法名(数据类型... 变量名){}

    • 也是可以形成方法重载,但也得遵循重载原来的规则;
    • 传参时可以传入多个,通过变量名下标获取或者遍历获取所以传入的参数;
    • 只能命名一个数据类型的可变个数形参;
    package com.object1220;
    
    /*
    @USER PPL-泡泡龙 or 广深小龙
    @date 2020-12-20 20:18
    */
    
    public class Args {
    
        // 可变个数形参
        public void eat(String... food) {
            // 遍历可变形参
            String strs = "";
            for (int i = 0; i < food.length; i++) {
                strs += food[i] + " ";
            }
            System.out.println(strs);
        }
    
        public void eat(String food) {
            System.out.println("重载:" + food);
        }
    
        public void eat(int count) {
            System.out.println("重载,每天吃几次?:" + count);
        }
    
        public static void main(String[] args) {
            Args a = new Args();
            a.eat("1", "2", "3", "PPL");
            a.eat("米饭");
            a.eat(3);
        }
    }

    输出:

    1 2 3 PPL
    重载:米饭
    重载,每天吃几次?:3

    二、递归

    递归方法:一个方法内调用它自身(方法调方法),递归有它的一个深度,不然就和死循环没什么区别;

    1、例子:计算1-100之间所有自然数之和;用递归实现;

    package com.object1223;
    
    /*
    @USER PPL-泡泡龙 or 广深小龙
    @date 2020-12-23 22:13
    */
    
    public class Recursion {
        public static void main(String[] args) {
            /*
            1、递归方法:一个方法内调用它自身(方法调方法)
            */
            Recursion rec = new Recursion();
            System.out.println(rec.getNumber(100));
        }
    
        // 计算1-100之间所有自然数之和;
        public int getNumber(int i) {
            if (i == 1) {
                return 1;
            } else {
                return i + getNumber(i - 1);
            }
        }
    }

    就比如斐波那契也是利用递归,递归是一种算法,一种解决问题的思路;

    2、其它面试题

    题一:

    /*
    * 定义一个int型的数组:{10, 3, 234, 234, 12, 123, 34, 86};
    * 让数组的每个位置上的值去除以首位置的元素,得到的结果,作为该位置上的新值。遍历新的数组。
    */

    package com.interview;
    
    /*
    @USER PPL-泡泡龙 or 广深小龙
    @date 2020-12-21 21:36
    */
    
    import java.util.Arrays;
    
    public class Interview1 {
        public static void main(String[] args) {
    
            int[] arr = {10, 3, 234, 234, 12, 123, 34, 86};
    //         for (int i = 0; i < arr.length; i++) {       // 错误写法
    
            // 方法一:倒着来可以的
            for (int i = arr.length - 1; i >= 0; i--) {
                arr[i] = arr[i] / arr[0];
            }
            System.out.println(Arrays.toString(arr));
    
            // 方法二:用变量来先赋值下标为0的数值
            int[] arr2 = {10, 3, 234, 234, 12, 123, 34, 86};
            int temp = arr2[0];
            for (int i = 0; i < arr.length; i++) {
                arr2[i] = arr2[i] / temp;
            }
            System.out.println(Arrays.toString(arr2));
        }
    }

    题二: // 需要在method调用后仅打印出a=100,b=200;(method是你要写的处理逻辑)

    package com.interview;
    
    /*
    @USER PPL-泡泡龙 or 广深小龙
    @date 2020-12-21 21:51
    */
    
    public class Interview2 {
        public static void main(String[] args) {
            int a = 10;
            int b = 10;
    
            // 需要在method调用后仅打印出a=100,b=200;
            method(a, b);
    
            System.out.println("a=" + a);
            System.out.println("b=" + b);
        }
    
        public static void method(int a, int b) {
            a = a * 10;
            b = b * 20;
            System.out.println("a=" + a);
            System.out.println("b=" + b);
            System.exit(0);
        }
    }

    题三:看以下程序,说出程序运行后输出的内容,ps:char类型是直接输出内容;

    package com.interview;
    
    /*
    @USER PPL-泡泡龙 or 广深小龙
    @date 2020-12-21 22:00
    */
    
    public class Interview3 {
        public static void main(String[] args) {
    
            int[] arr = new int[10];
            System.out.println(arr);        // 输出地址值
    
            char[] arr1 = new char[2];
            System.out.println(arr1);       // 为啥是空?
    
            char[] arr2 = {'a', 'b'};
            System.out.println(arr2);       // 输出的是 a b
        }
    }

     感谢尚硅谷在B站开源教学视频提供学习,欢迎来大家QQ交流群一起学习:482713805

  • 相关阅读:
    hbase二级索引学习
    redis-cluster集群Mac部署
    http-flume-kafka.conf
    linux 替换文件中的字符串
    flumeDemo
    redis_exporter监控安装
    Hbase内存磁盘大致关系
    spring cloud 尚硅谷学习
    C10K问题
    navicat 远程链接Mysql问题
  • 原文地址:https://www.cnblogs.com/gsxl/p/14163161.html
Copyright © 2011-2022 走看看