1 定义
对象:对象是类的一个实例,有状态(特征或属性)和行为(功能或方法)。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
类:类是一个模板,它描述一类对象的状态和行为。
下图中女孩(girl)为类(class),而具体的每个人为该类的对象(object):
2 如何定义类
a 定义类名
b 编写类的属性
c 编写类的方法
//1.定义一个类
public class Telphone {
//2.属性(成员变量) 有什么
float screen;
float cpu;
int var = 30;
//3.方法 干什么
void call(){
System.out.println("Telphone有打电话的功能!");
}
void sendMessage(){
System.out.println("screen:"+screen+" cpu:"+cpu+" mem:"+ mem +" Telphone有发短信的功能!");
}
}
3 创建和使用对象
类名 对象名 = new 类名();
Telphone phone = new Telphone();
引用对象的属性:对象名.属性
phone.screen = 5;//给对象的screen属性赋值5
引用对象的方法:对象名.方法()
phone.sendMessage();//调用sendMessage()方法
4 成员变量和局部变量
成员变量:在类范围内定义的变量
局部变量:在一个方法内定义的变量
作用域不同
局部变量的作用域仅限于定义它的方法内
成员变量的作用域在整个类内部都是可见的初始值不同
Java会给成员变量赋予一个初始值
Java不会给局部变量赋予初始值(没有初始值打印报:undefined)变量名称的同名问题
在同一个方法中,不允许有同名的局部变量
在不同的方法中,可以有同名的局部变量
成员变量如果和局部变量同名了,会优先取局部变量的值(就近原则)
成员变量包括类变量(static修饰)和实例变量(没有static修饰)。
类变量从该类的准备阶段起开始存在,直到系统完全销毁这个类,类变量的作用域与这个类的生存范围相同。
实例变量从该类的实例被创建起开始存在,直到系统完全销毁这个实例,实例变量的作用域与对应实例的生存范围相同。
局部变量根据定义形式的不同,又可以分为如下三种:
形参:在定义方法签名时定义的变量,形参的作用域在整个方法中都有效。
方法局部变量:在方法体内定义的局部变量,它的作用域是从定义该变量的地方生效,到该方法结束时失效。
代码块局部变量:这个局部变量的作用域从定义该变量的地方生效,到该代码结束时失效。
5 构造方法,也称构造器
构造方法为了“初始化对象的内部状态”,也就是为了给对象的各个属性赋初始值
语法 :public 类名(){}
构造方法必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名)
构造方法没有返回值,也就不能声明返回值类型
a 当没有指定构造方法时,系统会自动添加无参的构造方法。
b 构造方法可以重载:方法名相同,但参数不同的多个方法,调用时会自动根据不同的参数选择相应的方法。
c 构造方法是不被继承的。
d 当我们手动的指定了构造方法时,无论是有参的还是无参的,系统都将不会再添加无参的构造方法。
e 构造方法不能被static、final、synchronized、abstract和native修饰。
5.1 系统自动添加的无参构造方法
// Person.java
package demo;
public class Person {
String name;
int age;
void printInfo(){
System.out.println("我叫"+name+",我今年"+age+"岁");
}
}
// default.java
package demo;
public class deFault {
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Person();
person1.printInfo();
person2.printInfo();
}
}
// 运行后输出
我叫null,我今年0岁
我叫null,我今年0岁
5.1 无参构造方法
// Person.java
package demo;
public class Person {
String name;
int age;
//定义一个无参的构造方法,并在构造方法中给属性赋值
public Person(){
name = "张三";
age = 10;
}
void printInfo(){
System.out.println("我叫"+name+",我今年"+age+"岁");
}
}
// noPara.java
package demo;
public class noPara {
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Person();
person1.printInfo();
person2.printInfo();
}
}
// 运行后输出
我叫张三,我今年10岁
我叫张三,我今年10岁
5.2 有参构造方法
// Person.java
package demo;
public class Person {
String name;
int age;
//定义一个有参的构造方法,并在构造方法中给属性赋值
public Person(String name,int age){
this.name = name;
this.age = age;
}
void printInfo(){
System.out.println("我叫"+name+",我今年"+age+"岁");
}
}
// noPara.java
package demo;
public class noPara {
public static void main(String[] args) {
//Person person1 = new Person();
Person person1 = new Person("张三",10);// 需要为构造方法传递参数,否则会报错
Person person2 = new Person("李四",20);
person1.printInfo();
person2.printInfo();
}
}
// 运行后输出
我叫张三,我今年10岁
我叫李四,我今年20岁
6 静态变量,又称类变量
它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。
静态变量可以通过类名调用,也可以通过对象名调用
public class HelloWorld {
// static 修饰的变量为静态变量,所有的类
static String hobby = "good boy";
public static void main(String[] args) {
// 静态变量可以直接通过类名访问,无需创建类的对象
System.out.println("通过类名访问hobby:"+HelloWorld.hobby);
// 创建类的对象
HelloWorld hello = new HelloWorld();
// 使用对象名来访问静态变量
System.out.println("通过对象名访问hobby:"+hello.hobby);
// 使用对象名来改变静态变量
hello.hobby= "好人";
// 再次通过类名访问静态变量,静态变量的名已被改变
System.out.println("通过类名访问hobby:"+HelloWorld.hobby);
}
}
//输出
通过类名访问hobby:good boy
通过对象名访问hobby:good boy
通过类名访问hobby:好人
7 静态方法
静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员
在非静态方法(普通成员方法/实例方法)中,则可以直接访问同类的非静态变量和静态变量
静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法
原因:因为静态方法和静态数据成员会随着类的定义而被分配和装载入内存中,而非静态方法和非静态数据成员只有在类的对象创建时在对象的内存中才有这个方法的代码段
public class HelloWorld {
// 定义静态变量score1
static int score1 = 86;
// 定义静态变量score2
static int score2 = 92;
// 定义静态方法sum,计算成绩总分,并返回总分
public static int sum() {
return score1 + score2;
}
public static void main(String[] args) {
// 调用静态方法sum并接收返回值
int allScore = HelloWorld.sum();
System.out.println("总分:" + allScore);
}
}
8 静态初始化块
public class HelloWorld {
String name; // 声明变量name
String sex; // 声明变量sex
static int age;// 声明静态变量age
// 构造方法
public HelloWorld () {
System.out.println("通过构造方法初始化name");
name = "tom";
}
// 初始化块
{
System.out.println("通过初始化块初始化sex");
sex = "男";
}
// 静态初始化块
static {
System.out.println("通过静态初始化块初始化age");
age = 20;
}
public void show() {
System.out.println("姓名:" + name + ",性别:" + sex + ",年龄:" + age);
}
public static void main(String[] args) {
// 创建对象
HelloWorld hello = new HelloWorld();
// 调用对象的show方法
hello.show();
}
}
// 输出
通过静态初始化块初始化age
通过初始化块初始化sex
通过构造方法初始化name
姓名:tom,性别:男,年龄:20