【Java面向对象 05】

一、构造方法

1、方法名与类名称相同,2、没有返回值,不需要void关键字
2、调用类里面的属性必须先进行对象的引用,即:new 类名(),引用:引用名.属性

以下举例:Test01类对Students类进行初始化调用,Test02类对Students类进行属性的修改,即修改成员变量
public class Students {
    //学号
    int id;//成员变量(属性)-->想要访问成员变量,必须有对象才能访问
    //姓名
    String name;
    //性别
    String sex;
    //地址
    String address;
    //年龄
    int age;
    //构造方法(1、方法名与类名称相同,2、没有返回值,不需要void关键字)
    Students(){}
}
public class Test01 {
    public static void main(String[] args){
        //创建学生对象
        //语法:new.类名();
        //Students是一种引用数据类型,所有的类都是引用数据类型
        //类里面的方法调用(类名.方法名),类里面的属性调用,引用对象.属性名
        Students zhangsan = new Students();

        System.out.println("id:"+zhangsan.id);
        System.out.println("name:"+zhangsan.name);
        System.out.println("age:"+zhangsan.age);
        System.out.println("address:"+zhangsan.address);
        System.out.println("age:"+zhangsan.age);
    }
}
public class Test02 {
    //修改变量
    public static void main(String[] args){
        Students stu = new Students();

        stu.id = 1001;
        stu.name = "张三";
        stu.age = 20;
        stu.address = "北京";
        stu.sex = "男";

        System.out.println("id:"+stu.id);
        System.out.println("name:"+stu.name);
        System.out.println("age:"+stu.age);
        System.out.println("address:"+stu.address);
        System.out.println("age:"+stu.age);
    }
}

二、对象的封装

封装性:属性私有化,对外提供公开的setter 和 gettter方法
目的:不让外部程序对属性进行任意访问,通过方法进行访问
属性的安全可以得到保障,可以在方法中编写业务逻辑代码
不带static的方法叫非静态方法,成员方法,实例方法,调用时必须先创建对象才能调用,调用的方法:引用.方法名(实际参数)
public class Students {
   private int age;

   public void setAge(int _age){
       if(age<0 || age >120){
           System.out.println("年龄不符合!!!");
       }
       age = _age;
   }

   public int getAge(){
       return age;
   }

   public static String name(String n){
       if( n == "张三"){
           System.out.println("正确");
       }else{
           System.out.println("错误");
       }
       return n;
   }
}
public class Test001 {
    public static void main(String[] args){
       Students stu = new Students();

       stu.setAge(-10);
      // System.out.println(stu.getAge());

       stu.setAge(25);
       System.out.println(stu.getAge());

       //静态方法,既可以用类名.方法名调用。也可以用引用.方法名调用
        Students.name("张三");
        stu.name("李四");

    }
}

三、进一步了解对象的引用

引用数据类型是内存地址的传递,基本数据类型是值传递(不涉及到堆,只涉及到栈)

package com.JavaStudy.study0417;

public class Test002 {
    public static void main(String[] args){
        Study stu = new Study();
//        Test002 t = new Test002();
//        t.add(stu);  甭管是不是同一个类,非静态方法调用只能用引用.方法名()
        add(stu);
        System.out.println(stu.age);
    }

    public static void add(Study s){
        s.age++;
        System.out.println(s.age);
    }

//    public  void add(Study s){
//        s.age++;
//        System.out.println(s.age);
//    }

}

class Study{

    int age;

    public Study(){}
}

==========
执行结果:
1
1

数据传递理解图

程序先执行main方法-->进行压栈-->执行Study()构造方法,构造方法new动作时会进行:1、创建Study对象 2、初始化成员变量int age=0  --> 构造方法执行结束后进行弹栈-->

弹栈后给Study对象分配内存地址,引用stu会指向此内存地址,并且保存内存地址-->程序在执行add()方法进行压栈-->add方法内的形式参数会进行值的传递(stu传递给s),所以会指向

堆的内存地址-->执行s.age++进行修改为1,并打印-->执行结束后进行弹栈,弹栈都内存地址同样也保存了-->在执行main方法里面的System.out.println(stu.age); 值仍然是1

特别注意:对象的引用,传递的是内存地址

原文地址:https://www.cnblogs.com/frankruby/p/11353238.html