17.类和对象
类:对一切相似事物的统称,用来描述事物的特征和行为
对象:一个具体的实体,是真实存在的,是类的一个具现
举例: 人 是一个类 我 是一个具体的人,是一个对象
特征(属性):描述事物的一些属性,如人的身高,体重等,是静态的
行为(方法):是事物的一些动作,如吃饭,睡觉等,是动态的
17.1类的声明
class Person{
//属性
String name;
int age;
//方法
public void eat(){
System.out.println("今天吃花菜");
}
}
17.2对象的创建
对象就是类衍生出来的一个实体,类相当于一个模子,对象就是模子造出来的东西
对象的意义:为了执行属性的赋值和方法的调用的
对象创建在main函数中,是为了在主函数中执行对象的代码
格式: 类名 对象名 = new 类名();
17.3创建的实体类和测试类在同一个文件中
实体类 : 正常定义的类
测试类: 包含main主函数的类,只有一个,用于调用各实体类生成对象,调用对象
一个文件中只能存在一个有public的类,当实体类和测试类在同一个文件中时,只有测试类能有public修饰
文件名字以测试类的类名来命名
package com.qfedu.a_class;
//注意事项:实体类和测试类写在同一个文件中的时候,实体类不能带public修饰符
class Pig {
String name;
double weight;//体重
char sex;//性别
public void eat () {
System.out.println("猪吃白菜!!!");
}
public void sleep () {
System.out.println("猪睡觉打呼噜");
}
}
class Demo3 {
public static void main(String[] args) {
//创建对象
Pig pig = new Pig();
pig.name = "大黄";
pig.weight = 100.1;
pig.sex = '公';
System.out.println(pig.name + pig.weight + pig.sex);
pig.eat();
pig.sleep();
}
}
17.4构造方法(构造器)
目的:为了初始化对象,可以对对象的属性进行赋值
决定了怎么去new一个新类的对象的格式【重要】
- 对象创建其实是new的构造器
- 系统会自动创建一个默认的隐藏的无参构造器,当自己主动定义了构造器后,默认的构造器会消失[即定义了有参构造器后就不能再使用系统默认的无参构造器,可以手动再新建一个无参构造器]
17.4.1无参构造器
如果没有手动创建构造器,系统默认会创建一个
public 类名() {
初始化条件;
}
package com.qfedu.b_constructor;
class Dog {
String name;
int age;
public Dog () {
System.out.println("嘻嘻哒");
name = "大黄";
age = 12;
}
}
public class Demo2 {
public static void main(String[] args) {
//当new Dog()的时候就会去自动调用无参构造方法去执行无参构造方法中的方法体
Dog dog = new Dog();
dog.name = "旺财";
dog.age = 3;
//打印的是旺财和3 为啥没有打印大黄和12 因为无参构造先执行了
//后面赋的值就会覆盖掉初始化的值
System.out.println(dog.name);
System.out.println(dog.age);
}
}
17.4.2有参构造器
public 类名 (参数) {
初始化条件;
}
class Cat {
String name;
String kind;
int age;
public Cat() {
}
//和下面的有参构造一模一样!!!
// public Cat (String kind) {
// this.kind = kind;
// }
//声明一个有参构造方法
public Cat (String name) {
this.name = name;
}
//带有三个参数 构造方法
public Cat (String name, String kind, int age) {
this.name = name;
this.age = age;
this.kind = kind;
}
}
public class Demo3 {
public static void main(String[] args) {
Cat cat = new Cat("狗蛋");
System.out.println(cat.name);
//new对象的时候依据构造方法来创建对象
Cat cat1 = new Cat("毛蛋", "波斯", 3);
System.out.println(cat1.name);
System.out.println(cat1.age);
System.out.println(cat1.kind);
//一旦写了有参构造方法以后,默认的无参构造方法就没有了
Cat cat2 = new Cat();
cat2.name = "Tom";
cat2.age = 4;
cat2.kind = "蓝猫";
}
}
17.5对象在内存中的存储
栈:存的八大基本数据类型数据,对象的名称也存在栈中,内容是一个地址值,指向堆
堆:对象的全部数据
17.6构造代码块【了解】
开发中已经不用了
以后会讲静态代码块
格式:
{ 语句体 }
注意:
- 构造代码块要写在实体类中
- 构造代码块和构造器都是实例化一个对象时执行的,同时存在时,都会执行,构造代码块优先级高,先执行
17.7局部变量和成员变量
区别 | 成员变量 | 局部变量 |
---|---|---|
定义位置 | 类的大括号里(属性) | 方法体中,代码块内 |
作用 | 描述对象特征 | 存储数据 |
初始化值 | 根据不同数据类型有默认值 | 使用时必须赋值 |
内存 | 堆中 | 栈中 |
作用域 | 整个类 | 当前的方法中 |
权限修饰符 | 可以用 | 不能用 |