第五章 面向对象(基础)

目录

一、面向对象的概念、类与对象的定义

1、面向对象的基本概念

2、面向对象的三个主要特征

3、类与对象的关系

4、类的定义

4.1、定义Person类

4.2、Person类图

5、对象的声明及使用

访问类中的属性和方法

二、类与对象

1、内存划分

1.1、内存划分:对象创建之初

1.2、内存操作:为属性赋值

1.3、声明多个对象

1.4、内存划分

2、对象引用传递

引用传递内存图

3、垃圾的产生分析

垃圾产生的内存关系

三、封装性

1、封装的目的

2、封装的实现

3、setter和getter方法的定义

加入验证

封装的类图

四、构造方法与匿名对象

1、构造方法的概念及调用时机

1.1、对象的产生格式:

1.2、构造方法的定义格式

声明构造方法的注意事项

1.3、声明一个构造方法

1.4、默认的构造方法

1.5、构造方法的目的

2、构造方法的重载

3、匿名对象


一、面向对象的概念、类与对象的定义

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();        // 匿名对象     

        }

}

五、实例:类设计分析

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值