06. Java基础&面向对象

简述:

​ 面向对象是一种现在最为流行的程序设计方法,几乎现在的所有应用都以面向对象为主了,最早的面向对象的概念实际上是由IBM提出的,在70年代的Smaltalk语言之中进行了应用,后来根据面向对象的设计思路,才形成C++,而由C++产生了Java这门面向对象的编程语言。

​ 面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。

1.面向对象

对象:客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。

  • 类:
  1. 类的理解

类是对现实生活中一类具有共同属性和行为的事物的抽象

类是对象的数据类型,类是具有相同属性和行为的一组对象的集合

简单理解:类就是对现实事物的一种描述

  1. 类的组成

属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)

行为:指事物能执行的操作,例如:手机事物(打电话,发短信)

  • 类和对象的关系
  1. 类:类是对现实生活中一类具有共同属性和行为的事物的抽象
  2. 对象:是能够看得到摸的着的真实存在的实体
  3. 简单理解:类是对事物的一种描述,对象则为具体存在的事物

总结:

​ 类是对象的模板,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。

2.类和对象

2.1类的定义

类的组成:

  • 属性:在类中通过成员变量来体现(类中方法外的变量)
  • 行为:在类中通过成员方法来体现(和之前“方法”相比去掉static关键字即可)

类的定义步骤:

  1. 定义类
  2. 编写类的成员变量
  3. 编写类的成员方法
public class 类名 { 
    // 成员变量 
    变量1的数据类型 变量1; 
    变量2的数据类型 变量2;// 成员方法 
    方法1; 
    方法2; 
}

2.2对象的使用

  • 格式
  1. 类名称 对象名称 = new 类名称() ;
  • 如果要想访问类中的属性或方法(方法的定义),则可以依靠以下的语法形式:
  1. 访问类中的属性: 对象.属性 ;
  2. 调用类中的方法: 对象.方法(实际参数列表) ;

示例:

创建对象
    格式:类名 对象名 = new 类名(); 
范例:
    Phone p = new Phone(); 

使用对象
    1:使用成员变量 
    	格式:对象名.变量名 
    	范例:p.brand 
    2:使用成员方法 
    	格式:对象名.方法名() 
    范例:p.call()

匿名对象

  • 没有对象名称的对象就是匿名对象。 即栈内存中没有名字,而堆内存中有对象。
  • 匿名对象只能使用一次,因为没有任何的对象引用,所以将称为垃圾,等待被GC回收。
  • 只使用一次的对象可以通过匿名对象的方式完成,这一点在以后的开发中将经常使用到。

示例代码:

public static void main(String[] args){
	//Math2 m=new Math2();
	//int num=m.sum(100,200);
	//不通过创建对象名,直接实例对象调用,这就是匿名对象。因为没有对象名指向对象,所以只能调用一次,然后被GC回收。
	int num = new Math().sum(100,200);
	System.out.println(num);
}
class Math2{
	int sum(int x,int y){
		return x+y;
	}
}

3.对象内存图

3.1单个对象内存图
  • 成员变量使用过程
    在这里插入图片描述

成员方法调用过程
在这里插入图片描述

3.2多个对象内存图
  • 成员变量使用过程
    在这里插入图片描述

  • 成员方法调用过程
    在这里插入图片描述

总结:

​ 多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的

一份

3.3多个对象指向相同内存图

在这里插入图片描述

总结:

​ 当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)

​ 只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。

4.成员变量和局部变量

4.1声明位置

局部变量:方法体{} 中、形参、代码块{} 中

成员变量:

​ 1.类变量:有static修饰

​ 2.示例变量:没有static修饰

4.2修饰符

局部变量:final

成员变量:public、protect、private、final、static、volatile、transient(序列化)

4.3存储位置

  • 局部变量:栈
  • 实例变量:堆
  • 类变量:方法区

4.4作用域

  1. 局部变量:从声明处开始,到所属的 } 结束
  2. 实例变量:在当前类中 “this.” (有时this.可以省略),在其他类中 “对象名.” 访问
  3. 类变量:在当前类中 “类名.” (有时类名. 可以省略),在其他类中“类名.” 或 “对象名.” 访问

4.5生命周期

  1. 局部变量:每一个线程,每一次调用执行行都是新的生命周期
  2. 实例变量:随着对象的创建而初始化,随着对象的被回收而消亡,每一个对象的实例化变量是独立的
  3. 类变量”随着类的初始化而初始化,随着类的卸载而消亡,该类的所有对象的类变量是共享的

5.封装

5.1 private关键字

private是一个修饰符,可以用来修饰成员(成员变量,成员方法)——内部操作,外部不可见

​ 被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作

  • 提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
  • 提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰

实例代码:

class Person
{
    private String name;
    private int age;
    public void setName(String n)
    {
        name = n ;
    }
    public String getName()
    {
        return name;
    }
    public void setAge(int i)
    {
        if (i>0&&i<=200)
        {
            age = i ;
        }
        else
        {
            age = 0 ;//处理过后,不符合常识的条件被转换
        }
    }
    public int getAge()
    {
        return age;
    }

    public void getPersonInfo()
    {
        System.out.println("姓名:"+name+",年龄:"+age);
    }
}
public class Text2
{
    public static void main(String[] args)
    {
        Person person = new Person();
        person.setName("张三");
        person.setAge(-200);
        person.getPersonInfo();
    }
}

5.2 this关键字

this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题)

  • 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
  • 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
5.2.1 this表示本类属性

打破程序就近原则,直接去类的属性中找同名属性

语法:this.属性名称

实例代码:

class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void getPersonInfo() {
        System.out.println("姓名是:"+name+", 年龄是:"+age);
    }
}
public class ThisBiaoShiBenLeiShuXing {
    public static void main(String[] args) {
        Person per = new Person("张三", 18);
        per.getPersonInfo();
    }
}

建议:在类中方法访问类中属性,加this关键字

5.2.2 this表示本类方法
  1. this表示本类构造方法

    在构造方法首行使用this(参数)表示调用本类的构造方法。

    语法:this(方法参数);

    class Person {
        private String name;
        private int age;
        public Person() {
            System.out.println("产生一个新的Person对象");
        }
        public Person(String name) {
            // 调用本类无参构造
            this();
            this.name = name;
        }
        public Person(String name, int age) {
            // 调用本类有参构造
            this(name);
            this.age = age;
        }
        public void getPersonInfo() {
            System.out.println("姓名是:"+name+", 年龄是:"+age);
        }
    }
    public class ThisDemoOne {
        public static void main(String[] args) {
            Person per1 = new Person();
            Person per2 = new Person("张三");
            Person per3 = new Person("李四", 20);
            per1.getPersonInfo();
            per2.getPersonInfo();
            per3.getPersonInfo();
        }
    }
    

    注意:this调用本类构造方法必须写在构造方法首行;this调用构造方法不能成“环”。

  2. this表示本类普通方法

    语法:this.方法名称(方法参数);

class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.fun();
        this.name = name;
        this.age = age;
    }
    public void getPersonInfo() {
        System.out.println("姓名是:"+name+", 年龄是:"+age);
    }
    public void fun() {
        System.out.println("产生一个Person对象");
    }
}
public class ThisDemoTwo {
    public static void main(String[] args) {
        Person per = new Person("张三", 20);
        per.getPersonInfo();
    }
}
5.2.3 this表示当前对象

当前调用的属性或方法是通过哪个对象调用的,this就指代它。

class Person {
    public void print() {
        System.out.println("print方法"+this);
    }
}
public class ThisDemoThree {
    public static void main(String[] args) {
        Person per1 = new Person();
        System.out.println("main方法"+per1);
        per1.print();
        System.out.println("==========");
        Person per2 = new Person();
        System.out.println("main方法"+per2);
        per2.print();
    }
}

6.构造方法

​ 构造方法是一种特殊的方法,它是一个与类同名的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载

Java构造方法有以下特点:

  • 方法名必须与类名相同
  • 可以有 0 个、1 个或多个参数
  • 没有任何返回值,包括 void
  • 默认返回类型就是对象类型本身
  • 只能与 new 运算符结合使用

格式:

class class_name {
    public class_name(){}    // 默认无参构造方法
    public ciass_name([paramList]){}    // 定义构造方法// 类主体
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值