Bootstrap

Java基础知识(十一)(面向对象--2)

 1、构造方法

     构造方法:给成员变量做初始化作用的
    (1)构造方法可以发生重载
    (2)如果我们没有提供构造方法,系统会默认提供一个无参空方法体的构造方法
    (3)如果我们提供了构造方法,无论提供的是无参还是有参,系统都不会再提供了
    (4)格式:方法名与类名一致,没有返回值类型,连return都没有。
    (5) 构造方法在创建对象的时候调用。

/*
        构造方法:
            语句定义格式:
                1、方法名与类名相同
                2、构造方法是没有返回值的,连void都没有
                3、没有具体的返回值

 */
class Student {
    private String name;
    private int age;
    //定义一个构造方法
    Student(){
        System.out.println("这是一个构造方法");
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}
public class StudentDemo1 {
    public static void main(String[] args) {
        //创建Student类的对象
        //调用的是无参构造方法创建对象
        Student s1 = new Student();
        Student s2 = new Student();
//        System.out.println(s1.getName()+"---"+s1.getAge());
    }
}
class Construction1{
    private String name;
    private int age;
    Construction1(){
        System.out.println("这是我们自己提供的无参构造方法");
    }
    Construction1(String name){
        System.out.println("这是我们提供的带参数name的构造方法");
        this.name = name;
    }
    Construction1(int age){
        System.out.println("这是我们提供的带参数age的构造方法");
        this.age = age;
    }
    Construction1(String name,int age){
        System.out.println("这是我们提供的带两个参数name,age的构造方法");
        this.name = name;
        this.age = age;
    }
    public void show(){
        System.out.println(name+"---"+age);
    }
}
public class ConstructionDemo1 {
    public static void main(String[] args) {
//        Construction1 construction1 = new Construction1();
//        construction1.show();
        //使用带参数的构造方法来创建对象
//        Construction1 c2 = new Construction1("周家祥");
//        c2.show();
//        Construction1 c3 = new Construction1(18);
//        c3.show();
        //使用带两个参数name,age的构造方法来创建对象
        Construction1 c4 = new Construction1("阿杰", 18);
        c4.show();
    }
}

2、给成员变量赋值的两种方式:
    1、无参构造+setXxx(...)
    2、带参构造赋值,这里需要与this关键字配合使用

/*
        类的组成:成员变量,成员方法
        今天我们又学习了一个新的成员:构造方法。
        一个标准类的3.0版本写法:
            成员变量:被private修饰
            构造方法:一个无参构造方法/一个带所有参数的构造方法
            成员方法:getXxx()和setXxx(...)
            show():打印所有成员变量的值
       无论我们提供的是带参构造还是无参构造,只要是我们自己提供了一个,系统就永远不会提供了
 */

class Teacher {
    private String name;
    private int age;

    //构造方法:
    Teacher() {

    }

    Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //getXxx()
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    //setXxx(...)
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //show()
    public void show() {
        System.out.println(name + "---" + age);
    }
}

public class TeacherDemo {
    public static void main(String[] args) {
        //使用无参构造方法创建对象,使用setXxx() 对成员变量进行赋值
        //开发使用这种方法
        Teacher t1 = new Teacher();
        t1.setName("阿杰");
        t1.setAge(18);
        t1.show();

        //使用带参数的构造方法创建对象并给成员变量进行赋值
        //上课使用这种方法
        Teacher t2 = new Teacher("阿豪", 18);
        t2.show();
    }
}

3、创建对象初始化的流程
    a:先将class文件加载到方法区中
    b:在栈中为变量开辟空间
    c:在堆内存中创建对象
    d:系统给成员变量进行默认赋值
    e:给成员变量进行显示赋值
    f:构造方法给成员变量进行赋值
    g:将堆内存中的地址赋值给栈内存中的变量、

4、static
    它可以修饰成员变量,成员方法
    被static修饰的成员随着类的加载而加载,加载到方法区中的静态区,又称之为类成员
    被static修饰的成员可以直接通过类名访问,格式:类名.静态成员
    属性静态的内存

5、静态变量与成员变量的区别:
        (1)所属不同
            静态变量属于类,所以也称为为类变量
            成员变量属于对象,所以也称为实例变量(对象变量)
        (2)内存中位置不同
            静态变量存储于方法区的静态区
            成员变量存储于堆内存
        (3)内存出现时间不同
            静态变量随着类的加载而加载,随着类的消失而消失
            成员变量随着对象的创建而存在,随着对象的消失而消失
        (4)调用不同
            静态变量可以通过类名调用,也可以通过对象调用
            成员变量只能通过对象名调用

6、static关键字使用注意事项:

(1)在静态方法中是没有this关键字的

this代表的是当前调用该方法的对象,而被static修饰的成员是优先于对象而存在的。 被static修饰的成员是随着类的加载而加载,这时候,还没有对象产生,也就说明没有this关键字 所以在静态方法中无法使用this关键字。

(2)将成员方法分成两类:

a、静态的成员方法:

               访问的内容:

                                成员变量:只能访问静态的成员变量

                                成员方法:只能访问静态的成员方法

b、非静态的成员方法:

                访问的内容:

                               成员变量:既可以访问非静态的成员变量,也可以访问静态的成员变量

                               成员方法:既可以访问非静态的成员方法,也可以访问静态的成员方法 如果                                                     你实在记不住这些,总结一句话: 静态的只能访问静态的。

/*
        定义一个人的类
        我们定义完并使用后发现,姓名和年龄不一样,是变化的,我们可以理解,因为每个人的姓名和年龄都不一样。
        但是,到目前位置,我们选的几个人都是中国人,他们的国籍都一样,都是中国。
        一样的国籍,我们每次在创建的时候,都会在堆内存中开辟这样的成员变量的空间。
        当一样国籍的人非常多的时候,这样就会造成内存浪费了,怎么办呢?
        针对于多个对象有着共同的成员变量,值是一样的时候。
        java就提供了一个关键字给我们使用,这个关键字叫做:static

        static:静态的
        它可以修饰成员变量和成员方法,它的作用是可以让所有的对象共享一个成员变量
 */
class Human {
    //姓名
    private String name;
    //年龄
    private int age;
    //国籍
//    private String country;
    private static String country;

    public Human() {
    }
    public Human(String name,int age){
        this.name = name;
        this.age = age;
    }
    public Human(String name, int age, String country) {
        this.name = name;
        this.age = age;
        this.country = country;
    }
    //getXxx()和setXxx(...)
    public void setCountry(String country) {
        Human.country = country;
    }
    public void show() {
        System.out.println("姓名:" + name + ",年龄:" + age + ",国籍:" + country);
    }
}
public class HumanDemo {
    public static void main(String[] args) {
        //创建第一个对象
        Human h1 = new Human("阿杰", 42, "中国");
        h1.show();
        //创建第二个对象
        Human h2 = new Human("阿豪", 38);
        h2.show();
        //创建第三个对象
        Human h3 = new Human("阿明", 22);
        h3.show();
        h3.setCountry("加拿大");
        h1.show();
        h2.show();
        h3.show();
    }
}

7、工具类的创建:
    a:构造方法私有化
    b:方法被static修饰

8、定义一个类MyMath,提供基本的加减乘除功能,然后进行测试。(两个数做操作)


class MyMath {
    private int num1;
    private int num2;

    public MyMath() {
    }

    public MyMath(int num1, int num2) {
        this.num1 = num1;
        this.num2 = num2;
    }

    public int getNum1() {
        return num1;
    }

    public void setNum1(int num1) {
        this.num1 = num1;
    }

    public int getNum2() {
        return num2;
    }

    public void setNum2(int num2) {
        this.num2 = num2;
    }

    //加法运算
    public int add() {
        return num1 + num2;
    }

    //减法运算
    public int sub() {
        return num1 - num2;
    }

    //乘法运算
    public int mul() {
        return num1 * num2;
    }

    //除法运算
    public double div() {
        return (num1*1.0) / num2;
    }

}


public class MyMathDemo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一个操作数");
        int number1 = sc.nextInt();
        System.out.println("请输入第二个操作数");
        int number2 = sc.nextInt();
        MyMath myMath = new MyMath(number1, number2);
        System.out.println("两数之和为:"+myMath.add());
        System.out.println("两数之差为:"+myMath.sub());
        System.out.println("两数之积为:"+myMath.mul());
        System.out.println("两数之商为:"+myMath.div());
    }
}

9、 main方法的格式讲解:
            public static void main(String[] args){....}

            public: 公共的,访问权限是最大的,因为main是由JVM调用的,所以权限要足够大
            static: 静态的,不需要创建对象,通过类名直接调用,方便JVM访问
            void: 表示无返回值,因为我们直接说过返回值,是返回给调用者的,而调用main方法是                         由JVM调用的,返回给他没有意义
            String[] args: 参数是是一个字符串数组,数组形参名叫args?
                                  这个东西怎么用?如果传参呢?值去哪里的呢?
                                  早期JDK1.5之前,没有Scanner键盘录入的时候,那时候程序员如何给程序                                    传参呢?就是借助这里的args传参
           怎么用呢?
                   (1)IDEA可以直接传参
                   (2)命令传参
                        java MainDemo hello world java

public class MainDemo {
    public static void main(String[] args) {
        for(int i=0;i<args.length;i++){
            System.out.println(args[i]);
        }
    }
}

10、一个标准的手机类3.0版本:
            成员变量:brand,price,color  他们都是被private修饰
            构造方法:无参构造方法,带所有参数的构造方法
            成员方法:getXxx()/setXxx(...)  打电话
            show():遍历所有的成员变量的值

class Phone {
    //定义成员变量
    private String brand;
    private int price;
    private String color;

    //定义构造方法
    Phone() {
    }
    Phone(String brand, int price, String color) {
        this.brand = brand;
        this.price = price;
        this.color = color;
    }
    //setXxx()和getXxx()
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public String getBrand() {
        return brand;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public int getPrice() {
        return price;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String getColor() {
        return color;
    }
    //手机特有的方法
    //打电话
    public void call(String name) {
        System.out.println("给" + name + "打电话");
    }
    //show()
    public void show() {
        System.out.println(brand + "---" + price + "---" + color);
    }
}
public class PhoneDemo {
    public static void main(String[] args) {
        //使用无参构造方法创建对象并使用setXxx进行赋值
        Phone p1 = new Phone();
        p1.setBrand("小米");
        p1.setPrice(1999);
        p1.setColor("黑色");
        p1.call("阿杰");
        p1.show();

        //使用带参数的构造方法进行赋值
        Phone p2 = new Phone("傻妞", 1000000, "透明");
        p2.show();
        p2.call("陆小千");
    }
}

11、定义一个数组:实现遍历,逆序

       工具类创建注意事项:
        (1)构造方法私有化,不能让外界创建对象
        (2)将工具类中的方法用静态修饰,可以让外界直接通过类名访问

       如何制作说明书(帮助文档)
       (1)工具类
       (2)借助文档注释生成帮助文档
       怎么加注释?    看ArrayTool
       加什么东西呢?  看ArrayTool
       怎么用呢?格式:javadoc -d 目录 -author -version ArrayTool.java

                                ( 其中   -d <directory> 输出帮助文档的目录)
                                    注意:需要我们手动创建

/**
 * 这是针对数组相关操作的工具类
 * @author 阿杰
 * @version V.1.0
 *
 */
public class ArrayTool {
    /**
     * 这是私有的无参构造方法
     */
    private ArrayTool(){

    }


    /**
     * 这是遍历数组的方法,遍历后的格式是[元素1,元素2,元素3...]
     * @param array 这是调用该方法时需要传入的参数,数据类型是int类型的数组
     */
    public static void printArray(int[] array){
        for(int i=0;i<array.length;i++){
            if(i==array.length-1){
                System.out.print(array[i]+"]");
            }else if(i==0){
                System.out.print("["+array[i]+",");
            }else {
                System.out.print(array[i]+",");
            }
        }
        System.out.println();
    }

    /**
     * 这是数组逆序的方法
     * @param array 这是调用该方法时需要传入的参数,传入的数据类型是int类型的数组
     * @return 返回逆序后的数组
     */
    public static int[] niXu(int[] array){
        for(int start=0,end=array.length-1;start<=end;start++,end--){
            int temp = array[start];
            array[start] = array[end];
            array[end] = temp;
        }
        return array;
    }
}

12、生成构造方法,get,set方法的快捷键

       alt + Insert

13、定义一个类Demo,其中定义一个求两个数据和的方法,定义一个测试了Test,进行测试。

class Demo {
    //方式1:虽然我们实现了两个数求和,但是值是固定的,没有灵活度
//    int a = 10;
//    int b = 20;
//
//    public int sum() {
//        return a + b;
//    }

    //方式2:
    public int sum(int a, int b) {
        return a + b;
    }

    //方式3:使用面向对象的思想
//    private int a;
//    private int b;
//
//    Demo(int a, int b) {
//        this.a = a;
//        this.b = b;
//    }
//
//    public int sum() {
//        return a + b;
//    }

    //这道题,最好的解决方式是方式2,为什么?
    //方式3虽然使用了面向对象的思想,但是我们忽略了一个问题
    //想一想,什么情况可以将一个变量作为成员变量呢?
    //当成员变量是该类的相关属性的时候,可以去定义成成员变量
    //这里的a,b仅仅表示的是一个方法中的两个参数,与我们Demo类没有关系
    //所以不应该定义成成员变量

}

public class Test1 {
    public static void main(String[] args) {
        //创建对象调用方法
//        Demo demo = new Demo();
//        int sum = demo.sum();
//        System.out.println(sum);

        Demo demo = new Demo();
        int sum = demo.sum(10, 20);
        System.out.println(sum);

        //方式3:
//        Demo demo = new Demo(100, 200);
//        int sum = demo.sum();
//        System.out.println(sum);
    }
}

14、定义一个长方形类,定义 求周长和面积的方法,然后定义一个测试了Test2,进行测试。

class Rectangle {
    //由于长和宽都是用来描述长方形的,和类有关系,是该类的属性
    //所以定义成成员变量
    private int length;
    private int width;
    public Rectangle() {
    }
    public Rectangle(int length, int width) {
//        this.length = length;
//        this.width = width;
        if (length >= width) {
            this.length = length;
            this.width = width;
        } else {
            System.out.println("输入的数据不正确,请检查长宽的大小是否符合标准");
        }
    }
    public int getLength() {
        return length;
    }
    public void setLength(int length) {
        this.length = length;
    }
    public int getWidth() {
        return width;
    }
    public void setWidth(int width) {
        this.width = width;
    }
    //定义求长方形周长的方法
    public int getGirth() {
        return 2 * (length + width);
    }
    //定义求长方形面积的方法
    public int getArea() {
        return length * width;
    }
    public void show() {
        System.out.println("长:" + length + "宽:" + width);
    }
}
public class Test2 {
    public static void main(String[] args) {
//        Rectangle rectangle = new Rectangle();
//        rectangle.setLength(10);
//        rectangle.setWidth(5);
//        rectangle.setLength(5);
//        rectangle.setWidth(10);
        //使用构造方法赋值
        Rectangle rectangle = new Rectangle(5, 10);
        int girth = rectangle.getGirth();
        System.out.println("周长为:" + girth);
        int area = rectangle.getArea();
        System.out.println("面积为:" + area);
    }
}

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;