java是一个面向对象的高级编程语言,面向对象就是把现实存在的事物对象化,包括其行为和属性。面向对象编程更贴近实际生活的思想。面向对象的底层还是面向过程,面向过程抽象为类,然后封装,方便使用就是面向对象。
简单来说,我们调用类和方法实现某种业务功能就是面向对象。
面向过程简单来说就是自己一步一步的写代码来实现某种业务功能。
封装,继承,多态
成员变量(属性):描述事物的特征
如:人类(姓名,年龄,性别,身高,体重)
成员方法(行为):描述事务的行为
如:人类(吃饭,睡觉)
客观存在的事物皆为对象,所以说万物皆对象
对象是真实存在的实例。 对象 == 实例
类是对事物的一种描述,对象则是具体存在的事物
如:桌子是类还是对象?
答:是类
张三老师正在办公的桌子是类还是对象?
答:是对象
类:是描述生活中一类具有共同属性和行为的事物的抽象。
对象:是具体存在的能够看得见摸的着的事物。
简单理解:类是对事物的一种描述,对象则为具体存在的事物
在Java中,必须先定义类,才能得到对象,有了类和对象就可以描述世界上的所有事物,软件就可以解决许多业务场景。
类的组成是由属性和行为两部分组成的
格式:
修饰符 class 类名{
1.成员变量(member)
2.成员方法(method)
3.构造方法(constructor)
}
1.类名首字母建议大写,满足驼峰模式,不能用关键字,必须是合法字符
2.一个Java文件中可以定义多个类,但是只能有一个类是用public修饰的,而且public修饰的类名,必须和java文件的文件名一致,否则就会编译错误。
3.一个java文件中建议只定义一个类
定义一个Person类,描述人的姓名,年龄,身高,体重,唱歌,跳舞
其中成员变量为:姓名,年龄,身高,体重
成员方法为:唱歌,跳舞
成员变量一般不需要在定义类的时候给初始化值
代码演示:
public class Person {
//成员变量
String name;
int age;
double height;
double weight;
//成员方法
public void sing(){
System.out.println("我会唱歌");
}
public void dance(){
System.out.println("我会跳舞");
}
}
格式:
类名 对象名称 = new 类名();
成员变量的调用
格式: 对象名.成员变量;
成员方法的调用
格式: 对象名.成员方法();
动态初始化的默认值:
所有数值类型的默认值都是0
类型 | 初始化默认值值 |
---|---|
byte/short/int/long | 0 |
float/double | 0.0 |
boolean | false |
char | 0(char本身就是整数值) |
引用类型 | null |
代码演示:
public class Test {
public static void main(String[] args) {
//创建对象的格式:
Person p = new Person();
//调用成员变量的格式
int age = p.age;
System.out.println(age);//0 成员变量在定义时都会有初始化默认值
//调用成员方法的格式
p.sing();//我会唱歌
}
}
总结:
成员变量(属性):定义在类中方法外 (堆内存)对象存在就存在,对象消失就消失。
局部变量:方法中,随着方法的结束而结束。
成员变量有默认值(一般不给初始值),局部变量没有默认值(必须赋值才能使用)。
总结:
多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份
图解:
Student s1 = new Student();
Student s2 = s1;
指向的是同一个地址
多个对象同用相同的成员方法
若其中一个对象对数据进行了改变,
另一方看到的数据也会改变
若s1 = null 把s1对象设置为null。s1会报空指针异常,会切断s1与堆内存对象的连接。实际上并没有对堆内存中的属性进行操作。
对s2不会产生影响。s2还可以看到存储的数据。
总结 :
当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)
只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。
构造器是标准类的组成部分,用于给对象的数据(属性)进行初始化
修饰符 类名 (形参列表){
}
格式解析与注意事项:
修饰符:目前阶段都用public
类名:构造器的名称必须是当前的类名,大小写也必须一致,否则报错
形参列表:与普通方法一样
注意:不能申明返回值类型,默认返回对象的地址引用(不能由retrun带回结果数据)
创建对象的时候调用,每创建一次对象,就会执行一次构造方法
不能手动调用构造方法
代码演示
class Student {
private String name;
private int age;
//构造方法
public Student() {//无参构造
System.out.println("无参构造方法创建对象");
}
public Student(String name, int age) {//有参构造
this.name = name;
this.age = age;
System.out.println("有参构造方法创建对象");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public class Test_Student {
public static void main(String[] args) {
//无参构造创建对象
Student student1 = new Student();
System.out.println(student1.getName()+"..."+student1.getAge());
System.out.println("--------------------------------");
//有参构造创建对象
Student student2 = new Student("鸡哥", 18);
System.out.println(student2.getName()+"..."+student2.getAge());
}
}
执行效果:
1.随便写一个类,都会默认自带一个无参数构造方法
2.如果自己又写了一个有参数构造方法,那么默认的无参数构造方法就会消失,
需要自己再写一个无参数构造方法
推荐的使用方式 :
无论是否使用,都手动书写无参数构造方法,和带参数构造方法
标准类的书写代码演示:
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Test_Student {
public static void main(String[] args) {
//无参构造创建对象
Student student1 = new Student();
student1.setName("无E凡");
student1.setAge(20);
System.out.println(student1.getName()+"..."+student1.getAge());
System.out.println("--------------------------------");
//有参构造创建对象
Student student2 = new Student("鸡哥", 18);
System.out.println(student2.getName()+"..."+student2.getAge());
}
}
执行效果: