面向对象和面向过程区别
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个copy对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
类和对象
类:对于一类事物统称,对当前事物的一些描述,属性描述和行为描述
对象:独立,唯一,特殊的个体
java中定义类的格式
class className{
属性描述
行为描述
}
要求:
1.className要求驼峰命名法,见名知意
2.属性描述,用于描述当前类拥有的一些特征这里可以使用变量,该变量有一个特定的名字叫【成员变量】
3.行为描述:用于描述当前类可以做到一些事情,这里使用方法,该方法中有一个特定的名字【成员方法】Method
java中定义类【成员变量】
package day05;
/**
* 这里定义一个Person类
* @author 刘朝阳
*
*/
class Person{
//属性描述,这里使用成员变量Field
//使用String类型描述Person类的姓名属性
String name;
//使用int类型数据描述Person类的年龄属性
int age;
//使用char类型数据描述Person类的性别属性
char gender;
//使用方法描述Person类的吃饭行为
public void eat(String food){
System.out.println("吃"+food);
}
//使用方法描述Person类的睡觉行为
public void sleep(){
System.out.println("sleep");
}
//使用方法面搜狐Person类的打豆豆行为
public void daDOU(){
System.out.println("打豆豆");
}
}
public class Demo {
}
创建类对象 new 对象
java中创建类对象的格式
Scaner sc = new Scaner(System.in)
java.util.Scaner:数据类型,Scaner类对象,可以认为是Scaner类型,是Scaner的类对象,同时也是一个已用数据类型
sc:类对象,变量
Scaner的类对象 sc是对象名
new:申请内存的【堆区】空间,并清理整个空间中所有的数据
Scaner(System.in):
1.这里是一个方法,因为有小括号
2.方法名字和类名一致
3.该方法称之为构造方法,Constructor构造方法
java中使用类对象调用成员变量
格式:对象名.属性名/成员变量名;
.==>的 可以操作取值或者赋值操作
package day05;
/**
* 这里定义一个Person类
* @author 刘朝阳
*
*/
class Person{
//属性描述,这里使用成员变量Field
//使用String类型描述Person类的姓名属性
String name;
//使用int类型数据描述Person类的年龄属性
int age;
//使用char类型数据描述Person类的性别属性
char gender;
//使用方法描述Person类的吃饭行为
public void eat(String food){
System.out.println("吃"+food);
}
//使用方法描述Person类的睡觉行为
public void sleep(){
System.out.println("sleep");
}
//使用方法面搜狐Person类的打豆豆行为
public void daDOU(){
System.out.println("打豆豆");
}
}
public class Demo {
public static void main(String[] args) {
//这里创建一个Person类对象 对象名叫person
Person person = new Person();
System.out.println(person);
Person person1 = new Person();
System.out.println(person1);
//通过person类对象调用成员变量
person.name="网二";
person.age=18;
person.gender='男';
System.out.println("name"+person.name);
System.out.println("age"+person.age);
System.out.println("gender"+person.gender);
}
}
java中使用类对象调用成员方法
得到了一个Scanner类对象sc
Scanner sc =new Scanner(System.in)
使用过以下方法:
sc.nextInt();
sc.nextFloat();
sc.nextLine.charAt(0);
格式:类对象.方法名(必要的参数)
package day05;
/**
* 这里定义一个Person类
* @author 刘朝阳
*
*/
class Person{
//属性描述,这里使用成员变量Field
//使用String类型描述Person类的姓名属性
String name;
//使用int类型数据描述Person类的年龄属性
int age;
//使用char类型数据描述Person类的性别属性
char gender;
//使用方法描述Person类的吃饭行为
public void eat(String food){
System.out.println("吃"+food);
}
//使用方法描述Person类的睡觉行为
public void sleep(){
System.out.println("sleep");
}
//使用方法面搜狐Person类的打豆豆行为
public void daDOU(){
System.out.println("打豆豆");
}
public void eat() {
// TODO Auto-generated method stub
}
}
public class Demo {
public static void main(String[] args) {
//这里创建一个Person类对象 对象名叫person
Person person = new Person();
System.out.println(person);
Person person1 = new Person();
System.out.println(person1);
//通过person类对象调用成员变量
person.name="网二";
person.age=18;
person.gender='男';
System.out.println("name"+person.name);
System.out.println("age"+person.age);
System.out.println("gender"+person.gender);
//通过Person类对象person调用类内的成员方法
person.eat("吃肉");
person.sleep();
person.daDOU();
}
}
类对象内存分析图
#### 7. 构造方法 Constructor
##### 7.1 Java编译器提供的默认的构造方法
```
问题:
发现在代码中没有显式定义构造方法,为什么可以使用一个无参数的构造方法?
Java反编译工具:
javap -c -l -private XXXX.class
```
![](.\img\反编译之后内容.png)
```
通过反编译工具,发现了一些不存在与代码中的内容,而这段内容就是Java编译器为了方便程序开发,提供的一个必要的无参数构造方法。
Java编译器如果发现当前class没有显式自定义构造方法,会默认提供一个无参数构造方法给予使用。
如果Java编译器发现在代码中出现了任何一个构造方法,就不会再提供对应的无参数构造方法。
```
##### 7.2 自定义使用构造方法
```
构造方法功能:
初始化当前类对象中保存的成员变量数据。
目前创建对象的方式;
new 构造方法(有可能需要的参数);
new:
1. 根据构造方法提供的数据类型申请对应的堆区内存空间。
2. 擦除整个空间中所有的数据。
构造方法:
初始化在当前内存堆区空间的成员变量对应的数据
格式:
public 类名(初始化形式参数列表) {
初始化赋值语句;
}
要求:
1. 无论什么时候一定要留有一个无参数构造方法备用
2. 根据所需情况完成构造方法参数选择
3. 一个class可以有多个构造方法【方法的重载】
package com.qfedu.a_object;
class Cat {
// 成员变量
String name;
int age;
int height;
char gender;
// 自定义构造方法
/**
* 无参数构造方法
*/
public Cat() {
System.out.println("自定义无参数构造方法");
}
public Cat(int a) {
age = a;
}
/**
* 使用一个String类型的参数用于初始化类对象中name属性
*
* @param n String类型的参数
*/
public Cat(String n) {
// 在类内的方法中可以直接使用类内的成员变量【80%正确】
name = n;
System.out.println("带有String类型参数的构造方法");
}
/**
* 使用String类型参数和int类型参数初始化类对象成员变量数据
*
* @param name String类型数据 用于初始化name属性
* @param age int类型数据 用于初始化age属性
*/
public Cat(String name, int age) {
/*
* 使用this关键字明确告知编译器这里使用的是一个成员变量,而不是
* 局部变量,解决就近原则问题
*/
this.name = name;
this.age = age;
System.out.println("带有两个参数的构造方法");
}
/**
* 带有三个参数的构造方法
*
* @param n String类型,初始化name属性
* @param a int类型,初始化age属性
* @param g char类型,初始化gender属性
*/
public Cat(String n, int a, char g) {
name = n;
age = a;
gender = g;
System.out.println("带有三个参数的构造方法");
}
}
public class Demo3 {
public static void main(String[] args) {
Cat cat = new Cat();
Cat cat2 = new Cat("Tom");
Cat cat3 = new Cat("加菲猫", 50);
Cat cat4 = new Cat("八九", 1, '雌');
System.out.println(cat2.name);
System.out.println("----------------------");
System.out.println(cat3.name);
System.out.println(cat3.age);
System.out.println("----------------------");
System.out.println(cat4.name);
System.out.println(cat4.age);
System.out.println(cat4.gender);
}
}
方法的重载
总结:
1.所有的方法名都是一致的!!
2.所有的方法参数都是不一样的
3.同一个类内
这就是方法的重载。
优点:
1.简化了开发的压力
2.简化了记忆压力
3.更快捷调用方法,同时有满足了不同的情况
规范:
重载情况下,在同一个类内,不可以出现相同方法和相同参数数据类型的方法。
基本原理:
方法名一致的情况下,通过形式参数列表数据类型的不同来选择不同的方法
反射==>Constructor Method
this关键字
1.解决就近原则问题
public Demo1 (String name ,int age) {
name = name;
age = age;
System.err.println("带有两个构造方法");
}
我们期望使用比较直观的参数名方式,告知调用者这里需要的数据到底是什么?
但是会导致“就近原则”问题:在构造方法中所有的age,name都会被看作是一个局部变量,而不是成员变量。
期望:
可以由一种参数方式告知编译器这里操作的是一个成员变量而不是一个局部变量!!
this代表调用当前方法的类对象,或者是当前构造方法中初始化的类对象。
package day05;
class SingleDog{
public SingleDog(){
System.out.println(this);
}
public void test(){
System.out.println(this);
}
}
public class Demo1 {
public static void main(String[] args) {
SingleDog singleDog=new SingleDog();
System.out.println(singleDog);
singleDog.test();
}
}
成员变量和局部变量区别
零值
new关键字申请内存空间,并且擦除的一干二净
对应每一个数据类型的零值
byte short int 0
long 0L
float 0.0F
double 0.0
cahr '\0' ==>nul
boolean false
引用数据类型:
全部为null