【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
特别注意:对象的引用,传递的是内存地址