• 学习java的第二周


    面向对象基础(一)

    • class好比是人类,instance好比是指定的某个人

    • person类型,类似于C语言中的结构体

    方法(看的不是很懂,感觉思路不清晰)

    • 一个class可以包含多个field(field即为领域,private私有域,protected保护域,public公共域,publicstatic公共静态域)
    • 直接操作field容易造成逻辑混乱,我们可以用private修饰field,拒绝外部访问,但是可以、使用方法(method)来让外部代码可以间接修改field:

    public方法

    public class Main {
        public static void main(String[] args) {
            Person ming = new Person();
            ming.setName("Xiao Ming"); // 设置name
            ming.setAge(12); // 设置age
            System.out.println(ming.getName() + ", " + ming.getAge());
        }
    }
    
    class Person {
        private String name;
        private int age;
    
        public String getName() {
            return this.name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return this.age;
        }
    
        public void setAge(int age) {
            if (age < 0 || age > 100) {
                throw new IllegalArgumentException("invalid age value");
            }
            this.age = age;
        }
    }
    
    • 调用方法setName()setAge()来间接修改private字段,方法返回值通过return语句实现,如果没有返回值,返回类型设置为void,可以省略return

    private方法

    public class Main {
        public static void main(String[] args) {
            Person ming = new Person();
            ming.setBirth(2008);
            System.out.println(ming.getAge());
        }
    }
    
    class Person {
        private String name;
        private int birth;
    
        public void setBirth(int birth) {
            this.birth = birth;
        }
    
        public int getAge() {
            return calcAge(2019); // 调用private方法
        }
    
        // private方法:
        private int calcAge(int currentYear) {
            return currentYear - this.birth;
        }
    }
    
    • calcAge()是一个private方法,外部代码无法调用,但是,内部方法getAge()可以调用它
    • Person类只定义了birth字段,没有定义age字段,获取age时,通过方法getAge()返回的是一个实时计算的值,并非存储在某个字段的值

    this变量

    • 在方法内部,可以使用一个隐含的变量this,它始终指向当前实例,通过this.field就可以访问当前实例的字段,如果没有命名冲突,可以省略this

    方法参数

    • 方法可以包含0个或任意个参数。方法参数用于接收传递给方法的变量值。调用方法时,必须严格按照参数的定义一一传递
    class Person {
        ...
        public void setNameAndAge(String name, int age) {
            ...
        }
    }
    
    • 调用这个setNameAndAge()方法时,必须有两个参数,且第一个参数必须为String,第二个参数必须为int

    可变参数

    • 可变参数用类型...定义,可变参数相当于数组类型
    class Group {
        private String[] names;
    
        public void setNames(String... names) {
            this.names = names;
        }
    }
    
    • 上面的setNames()就定义了一个可变参数,完全可以把可变参数改写为String[]类型(需要自己先构造)
    class Group {
        private String[] names;
    
        public void setNames(String[] names) {
            this.names = names;
        }
    }
    

    构造方法

    默认构造方法

    • 如果一个类没有定义构造方法,编译器会自动为我们生成一个默认构造方法,它没有参数,也没有执行语句
    class Person {
        public Person() {
        }
    }
    
    • 没有在构造方法中初始化字段时,引用类型的字段默认是null,数值类型的字段用默认值,int类型默认值是0,布尔类型默认值是false

    在Java中,创建对象实例的时候,按照如下顺序进行初始化

    class Person {
        private String name = "Unamed";
        private int age = 10;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
    
    • 先初始化字段,例如,int age = 10;表示字段初始化为10double salary;表示字段默认初始化为0String name;表示引用类型字段默认初始化为null
    • 执行构造方法的代码进行初始化。

    多构造方法

    • 可以定义多个构造方法,在通过new操作符调用的时候,编译器通过构造方法的参数数量、位置和类型自动区分
    class Person {
        private String name;
        private int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public Person(String name) {
            this.name = name;
            this.age = 12;
        }
    
        public Person() {
        }
    }
    
    • 如果调用new Person("Xiao Ming", 20);,会自动匹配到构造方法public Person(String, int)
    • 如果调用new Person("Xiao Ming");,会自动匹配到构造方法public Person(String)
    • 如果调用new Person();,会自动匹配到构造方法public Person()

    方法重载

    • 在一个类中,我们可以定义多个方法。如果有一系列方法,它们的功能都是类似的,只有参数有所不同,那么,可以把这一组方法名做成同名方法
    class Hello {
        public void hello() {
            System.out.println("Hello, world!");
        }
    
        public void hello(String name) {
            System.out.println("Hello, " + name + "!");
        }
    
        public void hello(String name, int age) {
            if (age < 18) {
                System.out.println("Hi, " + name + "!");
            } else {
                System.out.println("Hello, " + name + "!");
            }
        }
    }
    
    • 方法名相同,但各自的参数不同,称为方法重载Overload
  • 相关阅读:
    位置边框深度探索QT窗口系统几何篇2
    下载图片封装一个工具类,搞定图片批量下载
    svn判断通过svnkit,获取最新的revision以及判断某个revsion是否存在
    java路径Java开发中获得非Web项目的当前项目路径
    遍历文件Java中遍历出指定目录中的所有文件
    存储过程程序存储过程编程5
    工具设置Unity3D系列教程使用免费工具在Unity3D中开发2D游戏 第一节
    破解学习Asprise OCR v4.0 64位破解...仅供学习使用
    宽度拉伸9patch图的尺寸尽量为偶数
    nullnull用宏定义swap(x,y)
  • 原文地址:https://www.cnblogs.com/b1356436060/p/13377573.html
Copyright © 2020-2023  润新知