这里写自定义目录标题
第11章 类与对象详解(二)
06 对象作为方法参数
11.6.01 例一
- 例
1 ) person类
public class Cat {
private String name;
private int age;
//构造器的快捷键Alt +Shift + s
public Cat(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2 )
public class Day096 {
public static void modify1(Cat c) {
c.setAge(3);
}
public static void main(String[] args) {
Cat c = new Cat("mm",2);
System.out.println(c.getAge()); //2
modify1(c);//将c的值(c引用的对象的地址)拷贝给形式参数c
System.out.println(c.getAge());//3
}
}
11.6.02 例二
- Person类
public class Cat {
private String name;
private int age;
//构造器的快捷键Alt +Shift + s
public Cat(String name, int age) {
//super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2 ) 主方法
public class Day096 {
public static void modify1(Cat c) {
c.setAge(3);
}
public static void modify2(Cat c) {
c = new Cat("nn",5);
}
public static void main(String[] args) {
//c是对象变量,它引用对象
Cat c = new Cat("mm",2);
System.out.println(c.getAge()); //2
//将实际参数c的值(c引用的对象的地址)拷贝给形式参数c
//这样实际参数c和形式参数c引用同一个对象
// modify1(c);//将c的值(c引用的对象的地址)拷贝给形式参数c
// System.out.println(c.getAge());//3
modify2(c);
System.out.println(c.getName());//mm 调用这个对象的getName方法
System.out.println(c.getAge());//2
}
}
例3
1 ) Person类
public class Cat {
private String name;
private int age;
//构造器的快捷键Alt +Shift + s
public Cat(String name, int age) {
//super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2
2 ) 主方法
public class Day096 {
public static void modify1(Cat c) {
c.setAge(3);
}
public static void modify2(Cat c) {
c = new Cat("nn",5);
System.out.println(c.getName());//nn
System.out.println(c.getAge());//5
}
public static void main(String[] args) {
//c是对象变量,它引用对象
Cat c = new Cat("mm",2);
// System.out.println(c.getAge()); //2
//将实际参数c的值(c引用的对象的地址)拷贝给形式参数c
//这样实际参数c和形式参数c引用同一个对象
// modify1(c);//将c的值(c引用的对象的地址)拷贝给形式参数c
// System.out.println(c.getAge());//3
modify2(c);
System.out.println(c.getName());//mm 调用这个对象的getName方法
System.out.println(c.getAge());//2
}
}
07 引用类型的初始值(默认值)
例
1) 创建Bar方法
public class Bar {
//基本类型
byte b;
short s;
char c;
int i;
long l;
float f;
double d;
boolean bool;
//引用类型
String str;
int[] arr;
}
2) 创建主方法
public class Day097 {
public static void main(String[] args) {
int a;
// System.out.println(a);//编译错误
Bar bar = new Bar();
System.out.println(bar.b);//0
System.out.println(bar.s);//0
System.out.println(bar.c);//空
System.out.println(bar.i);//0
System.out.println(bar.l);/0
System.out.println(bar.f);//0.0
System.out.println(bar.d);//0.0
System.out.println(bar.bool);//false
//引用类型的默认值都是null
System.out.println(bar.str);//null
System.out.println(bar.arr);//null
}
}
tips:
复默认界面
Windows–>Perspective–> Reset Perspective
08 对象初始化
java中对象的初始化有三种方式:
在变量声明时初始化,使用构造器,使用非静态代码块;
在变量声明时初始化(例一)
1)创建Coo类
public class Coo {
private String name = setDefaultName(); //声明变量的时候赋值
private int age = 20; //声明变量的时候赋值
// public static int COUNT;
private String setDefaultName() {
System.out.println("setDefaultName()被调用");
return "defaultName";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2 ) 创建主类
public class Day098 {
public static void main(String[] args) {
Coo c = new Coo();
System.out.println(c.getName());
System.out.println(c.getAge());
}
}
使用构造器(例二)
1 ) 使用构造器
在Coo类中,添加使用构造器(Alt + Shift + s -->选择Generate Constructor using Fields )
2)主类
public class Day098 {
public static void main(String[] args) {
Coo c = new Coo("张三",21);
System.out.println(c.getName());
System.out.println(c.getAge());
}
}
使用代码块(例三)
1)
public class Coo {
private String name = setDefaultName(); //声明变量的时候赋值
private int age = 0; //声明变量的时候赋值
// public static int COUNT;
private String setDefaultName() {
System.out.println("setDefaultName()被调用");
return "defaultName";
}
public Coo(String name, int age) {
System.out.println("Coo构造被调用");
this.name = name;
this.age = age;
}
{
System.out.println("代码块执行");
name = "李四";
age = 22;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2 ) 主类
public class Day098 {
public static void main(String[] args) {
Coo c = new Coo("张三",21);
System.out.println(c.getName());
System.out.println(c.getAge());
}
}
使用非静态代码块(例四)
1 ) Coo类
public class Coo {
private String name = setDefaultName(); //声明变量的时候赋值
private int age = 0; //声明变量的时候赋值
// public static int COUNT;
private String setDefaultName() {
System.out.println("setDefaultName()被调用");
return "defaultName";
}
public Coo(String name, int age) {
System.out.println("Coo构造被调用");
this.name = name;
this.age = age;
}
{
System.out.println("代码块执行");
name = "aa";
age = 18;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2 ) 主类
public class Day098 {
public static void main(String[] args) {
Coo c1 = new Coo("张三",21);
System.out.println(c1.getName());
System.out.println(c1.getAge());
Coo c2 = new Coo("李四",22);
System.out.println(c2.getName());
System.out.println(c2.getAge());
}
}
使用静态代码块(例五)
1 )
public class Coo {
private String name = setDefaultName(); //声明变量的时候赋值
private int age = 0; //声明变量的时候赋值
//类变量
public static int COUNT;
private String setDefaultName() {
System.out.println("setDefaultName()被调用");
return "defaultName";
}
public Coo(String name, int age) {
System.out.println("Coo构造被调用");
this.name = name;
this.age = age;
}
//非静态代码块
//非静态代码块在创建对象的时候执行
//非静态代码块用来初始化实例字段
{
System.out.println("代码块执行");
name = "aa";
age = 18;
}
//静态代码块
//静态代码块在类被加载时执行
//每个类只被加载一次,因此静态代码块只执行一次
//静态代码块用来初始化静态字段
//不能访问实例字段
static{
System.out.println("静态代码块");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2 )
***tips:
------import
ctrl + shift + o
------open type
ctrl+shift+T
------Alt + Shift + s -->选择Generate Constructor using Fields 使用字段生成构造
------Alt + Shift + s --> 选择Generate Getters and Setters(get/set)
------显示程序运行窗口 Windows->show View->console
------默认的运行窗口
Prolems/javadoc/Declaration/Console
------还原默认界面
Windows–>Perspective–> Reset Perspective
练习
- 定义一个Person类,有4个属性,String name,int age,String school,char gender。
进行数据封装,并对setter的参数进行验证。
package com.day10;
class Person{
private String name;
private int age;
private String school;
private char gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age <= 0 || age > 120 ){
System.out.println("非法的年龄");
}else{
this.age = age;
}
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
if(gender == '男' || gender == '女' ) {
this.gender = gender;
}else{
System.out.println("非法的性别");
}
}
}
public class Day101 {
public static void main(String[] args){
Person p = new Person();
p.setAge(20);
p.setName("小华");
p.setSchool("清华");
p.setGender('女');
System.out.println(p.getAge());
}
}
- 编写一个类Triangle,有2个属性,边长base和高height,进行数据封装,
编写一个TriangleManager类,
定义一个方法public static void getArea(Triangle t)计算三角形的面积,定义主方法测试运行。
package com.day10;
public class TriangleManager {
public static double getArea(Triangle t) {
return t.getBase() * t.getHeight() / 2;
}
public static void main(String[] args) {
Triangle t = new Triangle(10, 20);
System.out.println(getArea(t));
}
}
class Triangle {
private int base;
private int height;
///ALt + Shift + s, 生成getter和setter方法
public int getBase() {
return base;
}
public void setBase(int base) {
this.base = base;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
//ALt + Shift + s, 生成构造器
public Triangle(int base, int height) {
this.base = base;
this.height = height;
}
}
***tips
1) 怎么改class的名字
选中,单右–> Refactor -->Rename
如图:
2)
去掉void,即可。