一:概念
类是java中最基本的单位;一个java文件可以定义多个类;同一个包下类名不能重复。
类:是一组成员变量和成员方法的集合,可以吧类看作一个抽象的概念。一个java文件中只能有一个类被public修饰只需要记住被public修饰的类规范是要与java文件名一致。
对象:是该类的具体表现,具体到一个个体。
成员变量:用于描述事物的信息。
成员方法:用于描述事物能够做什么。
成员变量与局部变量的区别:
1、在类中定义的位置不同
成员变量:类中,但是在方法外
局部变量:定义在方法内部
2、在内存中的位置也不同
成员变量:在堆内存中
局部变量:在栈内存中
3、初始化值也不同
成员变量:系统会给予默认值
局部变量:没有系统给的默认值,必须在定义的时候赋值,亦或者在方法中使用之前赋值,然后才能使用。
4、生命周期不同
成员变量的生命周期:随着对象的创建而创建,随着对象的消失而消失
局部变量的生命周期:随着方法的调用而创建,随着方法的调用完毕而消失
注意事项:
1、局部变量的名字可以和成员变量的名字一样,在方法中使用的时候,采用就近原则
方法中使用的变量,会现在方法内部查找,如果方法内部没有,去成员变量中查找。
2、方法与方法之间里面的局部变量变量,不能互相调用。
二:类的使用
类名 对象名称 = new 类名(..);
使用前要先new一个对象,才能使用main方法里运用(对象名称.成员变量或者对象名称.方法名)
匿名对象:可以直接用 new 类名().成员变量或方法名去调用,new 类名()称为匿名对象。
注意,当调用多次的时候,不适合,每次new的时候都是一个新的匿名对象,会频繁的在堆内存中开辟空间
(1)当两个引用指向同一个对象
class Phone3{
//成员变量
String brand;
int price;
String color;
//成员方法
public void call(String s){
System.out.println("打电话给"+s);
}
public void sendMessage(){
System.out.println("发信息");
}
public void listenMusic(){
System.out.println("听音乐");
}
}
public class PhoneTest3 {
public static void main(String[] args) {
//定义一个手机类
Phone3 p1 = new Phone3();
//给手机对象p1成员变量赋值
p1.brand = "小米";
p1.price = 1999;
p1.color = "白色";
System.out.println(p1.brand+"---"+p1.price+"---"+p1.color);
p1.call("雷军");
p1.sendMessage();
p1.listenMusic();
//创建第二个手机对象,将第一个对象名赋值给它
Phone3 p2 = p1; //p1中存的是地址,赋值后p2也指向它
p2.brand = "华为";
p2.price = 19999;
p2.color = "蓝色";
System.out.println(p1.brand+"---"+p1.price+"---"+p1.color);//地址没变,数值改变,p1也会输出以上内容
}
}
(2)当方法中的参数是基本数据类型和引用数据类型。
class Demo2 {
public int getSum(int a,int b) {
a=100;
b=200;
return a + b;
}
}
class Student2{
String name;
public void speak(){
System.out.println("我热爱学习");
}
}
class StudentTest2{
/**
* 如果将来你看到一个方法的形式参数是一个类的类型,说明他是一个引用数据类型
* 这里其实需要的是该类的对象
* 调用的时候,把main方法中创建好的对象名传过来,实际上传的就是对象的地址值
*/
public void function(Student2 s){ //Student2 s = st3 = new Student2();
s.name = "小王";
s.speak();
}
}
public class XingShiCanShuDemo {
public static void main(String[] args) {
Demo2 d = new Demo2();
int a = 10;
int b = 20;
System.out.println(d.getSum(a,b));//方法传入的是常量值,或者是该类型的变量
System.out.println("a:"+a+",b:"+b);//当形式参数是基本数据类型的时候,在方法中对变量做修改,不会影响到外部实际的栈内存中的值。
//要想调用function(),就必须创建StudentTest2对象
StudentTest2 st2 = new StudentTest2();
Student2 st3 = new Student2();
System.out.println(st3.name);
st2.function(st3);//这里实际上传的是地址值;
System.out.println(st3.name);// 当形式参数是引用数据类型的时候,在方法中对变量做修改,会影响到外部实际的堆内存中的值。
}
}
三:封装
1、概述:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
2、优点:隐藏实现细节,提供公共的访问方式 提高了代码的复用性 提高安全性。
3、private关键字:是一个权限修饰符;
可以修饰成员(成员变量和成员方法);
被private修饰的成员只在本类中才能访问,相当于在main方法中被隐藏了。
private最常见的应用:把成员变量用private修饰;提供对应的 获取值方法:getXxx() ;赋值方法:setXxx()
例:
public class Teacher {
//定义成员变量
private String name;
private int age;
//提供公共的getXxx()和setXxx()方法
public void setName(String s) {
name = s;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge(){
return age;
}
//提供一个方法打印所有的成员变量值
public void show() {
System.out.println("姓名:" + name + ",年龄:" + age);
}
}
class TeacherTest{
public static void main(String[] args){
//创建一个老师对象
Teacher t1 = new Teacher();
//使用成员变量
//不能直接获取,因为它们都被private修饰了
//通过公共的方法来获取成员变量
System.out.println(t1.getName()+"---"+t1.getAge());
//给成员变量赋值
t1.setName("刘志城");
t1.setAge(18);
System.out.println(t1.getName()+"---"+t1.getAge());
t1.show();
}
}
4.this:代表所在类的对象引用
class Doctor {
private String name;//成员变量
public void setName(String name) {//用name是为了更好的赋值,使用方法更方便。
this.name = name;//为了区分方法中定义的name和成员变量,this.name代表成员变量。
}
public String getName() {
return name;
}
public void show() {
System.out.println("姓名:" + name );
}
}
public class DoctorDemo {
public static void main(String[] args) {
//创建一个医生对象
Doctor d = new Doctor();
d.setName("王宇");
d.show();
}
}