目录
一、面向对象的概念、类与对象的定义
1、面向对象的基本概念
程序的发展经历了两个主要阶段:面向过程、面向对象。
用一个例子解释,如一个木匠要做一个盒子,那么做这个盒子的出发点会有两种方式。
面向对象:先想好要做的盒子,之后再去找相应的工具去做。
面向过程:不去想要做什么样的盒子,随需取用工具。
2、面向对象的三个主要特征
封装(Encapsulation) :对外部不可见
继承(Inheritance) :扩展类的功能
多态(Polymorphism) :方法的重载、对象的多态性
3、类与对象的关系
类:对某一类事物的描述,是抽象的、概念上的定义;
对象:实际存在的该类事物的每个个体,因而也称实例(instance)。
类就相当于是一个模板,依照此模板产生产品。
4、类的定义
4.1、定义Person类
4.2、Person类图
所示的图形分为三个层次:
第一层表示类的名称,类的名称与之前一样要求开头首字母大写;
第二层表示属性的定义,按照“访问权限 属性名称:属性类型”的格式定义;
第三层表示类中方法的定义,按照“访问权限 方法名称():方法返回值”的格式定义。
5、对象的声明及使用
访问类中的属性和方法
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:" + name + ",年龄:" + age);
}
}
public class test240124{
public static void main(String[] args) {
Person per = new Person();//声明、实例化对象
per.name = "李华"; //为属性赋值
per.age = 20;
per.tell(); //调用类中的方法
}
}
运行结果:
姓名:李华,年龄:20
二、类与对象
1、内存划分
1.1、内存划分:对象创建之初
1.2、内存操作:为属性赋值
1.3、声明多个对象
public static void main(String[] args) {
//2.
Person per1 = new Person();//声明、实例化对象
Person per2 = new Person();//声明、实例化对象
per1.name = "李华"; //为属性赋值
per1.age = 20;
per2.name = "张三"; //为属性赋值
per2.age = 30;
System.out.print("per1对象中的内容:");
per1.tell(); //per1调用类中的方法
System.out.print("per2对象中的内容:");
per2.tell(); //per2调用类中的方法
运行结果:
per1对象中的内容:姓名:李华,年龄:20
per2对象中的内容:姓名:张三,年龄:30
1.4、内存划分
2、对象引用传递
public static void main(String[] args) {
//3.
Person per1 = new Person();//声明、实例化对象
Person per2 = per1;//只实例化对象per1
per1.name = "张三"; //为属性赋值
per1.age = 30;
per2.age = 33; //设置per1内容
System.out.print("per1对象中的内容:");
per1.tell(); //per1调用类中的方法
System.out.print("per2对象中的内容:");
per2.tell(); //per2调用类中的方法
运行结果:
per1对象中的内容:姓名:张三,年龄:33
per2对象中的内容:姓名:张三,年龄:33
引用传递内存图
3、垃圾的产生分析
public static void main(String[] args) {
//4.垃圾产生
Person per1 = new Person();//声明、实例化对象
Person per2 = new Person();//声明、实例化对象
per1.name = "张三"; //为属性赋值
per1.age = 30;
per2.name = "李四"; //为属性赋值
per2.age = 33;
per2 = per1; //将per2的引用传递给per2
System.out.print("per1对象中的内容:");
per1.tell(); //per1调用类中的方法
System.out.print("per2对象中的内容:");
per2.tell(); //per2调用类中的方法
运行结果:
per1对象中的内容:姓名:张三,年龄:30
per2对象中的内容:姓名:张三,年龄:30
垃圾产生的内存关系
三、封装性
1、封装的目的
class Person{
String name; //声明name属性
int age; //声明age属性
public void tell(){ //取得信息的方法
System.out.println("姓名:" + name + ",年龄:" + age);
}
}
public class test240124{
public static void main(String[] args) {
//5.封装的目的
Person per = new Person();//声明、实例化对象
per.name = "张三"; //为name属性赋值
per.age = -30; //为age属性赋值
System.out.print("per对象中的内容:");
per.tell(); //调用类中的方法
运行结果:
per对象中的内容:姓名:张三,年龄:-30
2、封装的实现
class Person{
//2.封装的实现
private String name; //声明name属性
private int age; //声明age属性
public void tell(){ //取得信息的方法
System.out.println("姓名:" + name + ",年龄:" + age);
}
}
public class test240124{
public static void main(String[] args) {
//5.封装的目的
Person per = new Person();//声明、实例化对象
per.name = "张三"; //为name属性赋值// 错误,无法访问封装属性
per.age = -30; //为age属性赋值// 错误,无法访问封装属性
System.out.print("per对象中的内容:");
per.tell(); //调用类中的方法
运行结果:
The field Person.name is not visible
The field Person.age is not visible
3、setter和getter方法的定义
class Person{
//3.setter和getter方法
private String name; //声明name属性
private int age; //声明age属性
public void tell(){ //取得信息的方法
System.out.println("姓名:" + name + ",年龄:" + age);
}
public String getName(){
return name;
}
public void setName(String n){
name = n;
}
public int getAge(){
return age;
}
public void setAge(int a){
age = a;
}
加入验证
可以在setter方法中对设置的内容进行验证。
public void setAge(int a) { // 设置年龄
if (a >= 0 && a < 150) { // 在此处加上验证代码
age = a;
}
}
封装的类图
四、构造方法与匿名对象
1、构造方法的概念及调用时机
1.1、对象的产生格式:
1.2、构造方法的定义格式
声明构造方法的注意事项
(1)构造方法的名称必须与类名称一致
(2)构造方法的声明处不能有任何返回值类型的声明
(3)不能在构造方法中使用return返回一个值
1.3、声明一个构造方法
class Person{
//4.声明一个构造方法
public Person(){ //声明构造方法
System.out.println("一个新的Person对象产生。");
}
}
public class test240124{
public static void main(String[] args) {
//4.声明一个构造方法
System.out.println("声明对象:Person per = null;");
Person per = null; //声明对象时不调用构造
System.out.println("实例化对象:per = new Person();");
per = new Person(); //实例化对象时调用构造
1.4、默认的构造方法
每个类中肯定都有一个构造方法。
如果一个类中没有声明一个明确的构造方法,则会自动生成一个无参的什么都不做的构造方法。
1.5、构造方法的目的
为类中的属性初始化
class Person{
//5.定义构造方法,为类中的属性初始化
private String name; //声明name属性
private int age; //声明age属性
public Person(String name,int age){ //定义构造方法,为类中的属性初始化
this.setName(name); //为name属性赋值
this.setAge(age); //为age属性赋值
}
public void tell(){ //获取信息的方法
System.out.println("姓名:" + getName() + ",年龄:" + getAge());
}
public String getName(){
return name;
}
public void setName(String n){
name = n;
}
public int getAge(){
return age;
}
public void setAge(int a){ //设置年龄
if(a>=0 && a<150){ //加上验证代码
age = a;
}
}
}
public class test240124{
public static void main(String[] args) {
//5.定义构造方法,为类中的属性初始化
Person per = new Person("张三", 30); //调用构造方法,传递2个参数
per.tell(); //输出信息
运行结果:
姓名:张三,年龄:30
2、构造方法的重载
构造方法的重载过程与普通方法一样
参数的类型或个数不同
public Person(){}
public Person(String name){
this.setName(name) ;
}
public Person(String name,int age){
this.setName(name) ;
this.setAge(age) ;
}
3、匿名对象
只使用一次的对象,称为匿名对象。
匿名对象只在堆内存中开辟空间,而不存在栈内存的引用。
public class NonameDemo01 {
public static void main(String args[]) {
new Person("张三", 30).tell(); // 匿名对象
}
}
五、实例:类设计分析