什么是类?
用 关键字 class 修饰的就是一个类.
(像这样 ,我们就创建了一个类叫 Student)
类是个什么东西?
类 可以把 它看成是一个类型 , 就好像我们买衣服,衣服有各种类型(什么上衣,裤子,短袖,长袖之类的). 像上面我们就创建了 一个 Student类 ;
类的成员属性和成员方法
定义在类里的 变量 和 方法 , 就是这个 类的 成员属性(或成员变量) 和 成员方法;(不懂什么是变量和方法的可以看简单学习->变量和方法-CSDN博客)
public class Student {
public String name ;
public int num ;
//上面的两个变量 是我们定义的 成员属性 ; 是定义在类的里面的;
public void func(){
}
//这里的func 就是我们定义的 成员方法 ;
}
(注意:成员变量 和 成员方法 是定义 在 类 的 {} 大括号里头)
像这里的 num1变量,才是Student类的成员变量, 而func()方法里的num2变量只是一个局部变量;
总的来说: 成员变量时定义在 类的里面 , 方法的外面 ;
对象(类的实例化)
对象是 通过 new 关键字 ,来调用 构造方法 实例化类 ,构造出来的 ;
创建对象的格式 : new 类名() ; (通过new + 类的名字+ () 小括号 来创建对象);
(我们创建的Student类,就是相当于创建一个Student类型,我们来创建一个s1引用变量, 来接收 我们创建的对象)
对象的属性
我们创建一个对象时, 这个对象里也包含我们定义的属性和方法 ;
构造出来的s1对象, 因为我们没有给对象的属性,进行任何初始化操作, 所以这些属性的值都是默认值,默认值是0; (因为String是引用对象,引用对象的默认值是 null )
获取对象的属性
既然我们对象里也会有我们在类里定义的属性,那么如何获取对象里的属性: 通过 . 点号来访问;
格式: 对象名 . 属性名 ; (在对象名后面跟一个 . 点号, 就可以访问 该对象的属性)
(前面我们创建了s1对象, 我们用s1. 的时候 编译器会弹出一个窗口供我们选择要访问的变量)
(用a和b来接收 s1对象属性的值, 当然因为没有初始化,所以最后 a=0, b = null)
通过.点号修改对象属性的值
我们可以通过.点号访问对象的属性,也可以通过点号修改他们的值 ;
Student s1 = new Student(); s1.num1 = 5 ; s1.name = "李四";
把s1对象的num1的值改成5 , 把name的值 改成 "李四";
对成员属性进行初始化操作
在定义成员变量时,把值赋给成员变量 ;
(在类里定义成员变量时,就把值赋给他们)
此时,我们再 创建Student对象 时, 对象里的属性就 不再是0 , 而是我们定义属性时给的值 ;
(这时候再创建s1对象,对象里的属性的值就不是0了)
通过.点号调用方法
(可以使用.点号,来调用对象的方法)
练习代码
public class Student {
public String name = "张三"; //定义成员变量时进行初始化
public int num1 = 18 ; //定义成员变量时进行初始化
public void func(){
int num2 ;
}
}
class Test2{
public static void main(String[] args) {
Student s1 = new Student();
// new 一个对象, 用s1 来接收 ;
s1.func(); // 调用 s1里的func()方法
s1.num1 = 5 ;
s1.name = "李四"; //修改对象的属性
int a = s1.num1; // a 接收 s1的num1的值
String b = s1.name;; // b 接收 s1的name的值
System.out.println(a);
System.out.println(b); // 输出a和b
}
}
使用构造方法来初始化属性
前面的在定义成员变量时就初始化的方法,有一个小问题,那就是我们后面再创建的对象里的属性都是一样的;
(创建3个对象,3个对象里的属性都是一样的,name="张三",num1=1)
虽然我们可以通过.点号来修改 这些属性的值, 但是不要方便, 我们希望 一开始创建对象时就可以按照我们的要求来赋值 , 这就要靠构造方法来帮助我们
构造方法
对属性的初始化,不仅可以在类里定义时直接赋值,也可以通过构造方法来;
类的构造方法,也是写在类里的;
定义构造方法的格式: 类名 (参数列表){ } ; (构造方法相比普通的方法, 没有返回类型)
(在类里写一个有两个参数的构造方法,用这两个参数来初始化对象属性)
这时候我们 创建对象时,就可以 传两个参数 来构造对象;
(这样在创建对象时,就可以根据我们给的参数,来构造出外面需要的对象)
构造方法的作用(创建一个对象的本质)
创建一个对象的本质: 是 通过 new 关键字,创建出对象, 调用 构造方法 (构造方法进行给属性初始化操作),然后返回执行这个对象的引用 ;
要创建出对象,必需通过构造方法来,构造对象 ;
(通过构造方法,来让构造出来的对象里的属性,是我们想要的值)
总的代码:
public class Student {
public String name = "张三"; //定义成员变量时进行初始化
public int num1 = 18 ; //定义成员变量时进行初始化
public void func(){
int num2 ;
}
public Student(){
}
//Student的构造方法 ;
public Student (int a , String b){
num1 = a ; // 把a的值赋给 num1 ;
name = b ; // 把b的值赋给 name ;
}
}
class Test2{
public static void main(String[] args) {
Student s1 = new Student();
s1.num1 = 5 ;
s1.name = "李四";
// new 一个对象, 用s1 来接收 ;
int a = s1.num1; // a 接收 s1的num1的值
String b = s1.name;; // b 接收 s1的name的值
System.out.println(a);
System.out.println(b); // 输出a和b
Student s2 = new Student(20 , "赵云");
Student s3 = new Student(30 , "张飞"); // 在构造对象时,给属性赋值
}
}
问题: 我们前面没有在Student类里写构造方法,为什么可以创建出Student对象?
因为:当我们没有给类写任何的构造方法时,编译器会自动给我们创建一个不带参数,方法体里什么都没有的构造方法;
public class Apple { int num ; String name ; } class Test3{ public static void main(String[] args) { Apple apple1 = new Apple(); // 创建一个Apple对象 } }
Appale类里我们没有写任何的构造方法, 下面创建Apple对象时 ,编译器会默认创建一个不带参数的,方法体里没有任何东西的构造方法 ;
相当于这样的构造方法:
(编译器给我们创建的构造方法,没有参数,方法体里什么都没有)
如果我们在类里 ,写了 构造方法, 已经有构造方法了,那么编译器就不会给我们创建构造方法;
(带一个参数的构造方法)
此时我们下面创建对象就会报错了 ;
这里创建对象,编译器给我们报错了, 因为Apple类里已经有构造方法了,所以编译器不会自动创建构造方法, 这里我们new一个对象,用的构造方法是没有参数的, 但是类里只有 带一个参数的构造方法,所以给我们报错 ;
给构造方法传一个参数就不会报错了 ;
构造方法的特点
1. 构造方法的名字必须和类名一样, 并且不能有返回值;
2. 什么时候会调用构造方法,就是创建对象时,会调用一次构造方法 ;
3. 如果我们没有自己写构造方法,那么会自动创建一个不带参数的构造方法,写了就不会自动创建 ;
4.构造方法可以构成方法的重载 ;
最后
如果大家没有对象,我可以帮大家 new 几个对象;
public class GirFriend {
String name = "美铝"; //名字
int height = 160 ; // 身高 :cm
int width = 48 ; //体重:kg
}