Java(100-113)【类与对象、封装、构造方法】

1.对象的创建以及使用
Student stu =new Student();
根据一个类创建一个对象
导包、创建、使用
2.手机练习
有main才能run
Phone.java
package cn.itcast.day06.demo02;
/*
定义一个类,用来模拟“手机”事物。
属性:品牌、价格、颜色
行为:打电话、发短信
对应到类当中:
成员变量(属性):
String brand; // 品牌
double price; // 价格
String color; // 颜色
成员方法(行为):
public void call(String who) {} // 打电话
public void sendMessage() {} // 群发短信
*/
public class Phone {
// 成员变量
String brand; // 品牌
double price; // 价格
String color; // 颜色
// 成员方法
public void call(String who) {
System.out.println("给" + who + "打电话");
}
public void sendMessage() {
System.out.println("群发短信");
}
}
Demo01PhoneOne.java
package cn.itcast.day06.demo02;
public class Demo01PhoneOne {
public static void main(String[] args) {
// 根据Phone类,创建一个名为one的对象
// 格式:类名称 对象名 = new 类名称();
Phone one = new Phone();
System.out.println(one.brand); // null
System.out.println(one.price); // 0.0
System.out.println(one.color); // null
System.out.println("=========");
one.brand = "苹果";
one.price = 8388.0;
one.color = "黑色";
System.out.println(one.brand); // 苹果
System.out.println(one.price); // 8388.0
System.out.println(one.color); // 黑色
System.out.println("=========");
one.call("乔布斯"); // 给乔布斯打电话
one.sendMessage(); // 群发短信
}
}
3.一个对象的内存
成员方法是 堆中 的成员方法指向 方法区 的成员方法的地址
成员变量是 栈中 的成员变量指向 堆中 的成员变量

叉号代表出栈,栈负责方法的运行、方法按照入栈的形式不断执行并出栈
堆负责new出来的成员变量和成员方法,但是成员方法是用地址引用自方法区中
方法区则是储存方法.class
4.两个对象指向同一个方法

注意栈的顺序
先是main函数入栈然后分别执行各自的对象
5.两个引用指向同一个对象空间
one、two即为对象名
![]()
前面一样但是变量是one玩剩下的,数值不是默认值被改过因为指向的地址相同

6.使用对象类型作为方法的参数
类和对象的使用和c中的结构体可以进行类比
方法和c中的函数可以进行类比
对象类型作为方法的参数传递的是地址值

7.使用对象类型作为方法的返回值
返回地址值

8.成员变量和局部变量的区别
非常重要


参数可以直接打印,因为参数被调用肯定会被赋值

9.面向对象语言的三大特性 封装性
封装、继承、多态
用方法对某个功能进行封装

10.关键字private也是封装
private是一个权限修饰符,代表最小权限。
主要目的是能在方法内进行变量的控制筛选
只有在方法内才能进行循环语句的编写

package cn.itcast.day06.demo03;
/*
问题描述:定义Person的年龄时,无法阻止不合理的数值被设置进来。
解决方案:用private关键字将需要保护的成员变量进行修饰。
一旦使用了private进行修饰,那么本类当中仍然可以随意访问。
但是!超出了本类范围之外就不能再直接访问了。
间接访问private成员变量,就是定义一对儿Getter/Setter方法
必须叫setXxx或者是getXxx命名规则。
对于Getter来说,不能有参数,返回值类型和成员变量对应;
对于Setter来说,不能有返回值,参数类型和成员变量对应。
*/
public class Person {
String name; // 姓名
private int age; // 年龄
public void show() {
System.out.println("我叫:" + name + ",年龄:" + age);
}
// 这个成员方法,专门用于向age设置数据
public void setAge(int num) {
if (num < 100 && num >= 9) { // 如果是合理情况
age = num;
} else {
System.out.println("数据不合理!");
}
}
// 这个成员方法,专门用于获取age的数据
public int getAge() {
return age;
}
}
package cn.itcast.day06.demo03;
public class Demo03Person {
public static void main(String[] args) {
Person person = new Person();
person.show();
person.name = "赵丽颖";
// person.age = -20; // 直接访问private内容,错误写法!
person.setAge(20);
person.show();
}
}
11.private练习
alt+insert快捷键
Boolen的get值不一样是isXXX


12.this关键字的使用
重名的情况下起到区分的作用


13.构造方法

package cn.itcast.day06.demo04;
/*
构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法。
格式:
public 类名称(参数类型 参数名称) {
方法体
}
注意事项:
1. 构造方法的名称必须和所在的类名称完全一样,就连大小写也要一样
2. 构造方法不要写返回值类型,连void都不写
3. 构造方法不能return一个具体的返回值
4. 如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数、方法体什么事情都不做。
public Student() {}
5. 一旦编写了至少一个构造方法,那么编译器将不再赠送。
6. 构造方法也是可以进行重载的。
重载:方法名称相同,参数列表不同。
*/
public class Student {
// 成员变量
private String name;
private int age;
// 无参数的构造方法
public Student() {
System.out.println("无参构造方法执行啦!");
}
// 全参数的构造方法
public Student(String name, int age) {
System.out.println("全参构造方法执行啦!");
this.name = name;
this.age = age;
}
// Getter Setter
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
package cn.itcast.day06.demo04;
public class Demo02Student {
public static void main(String[] args) {
Student stu1 = new Student(); // 无参构造
System.out.println("============");
Student stu2 = new Student("赵丽颖", 20); // 全参构造
System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
// 如果需要改变对象当中的成员变量数据内容,仍然还需要使用setXxx方法
stu2.setAge(21); // 改变年龄
System.out.println("姓名:" + stu2.getName() + ",年龄:" + stu2.getAge());
}
}
14.定义一个标准的类
alt+insert快捷键可以快速加入getter setter,也可以生成无参数构造方法、也可以生成全参数构造方法


浙公网安备 33010602011771号