简聊类和对象
我们在了解类和对象前,先聊下面向对象程序设计,面向对象程序设计就是通过对象来进行程序设计,对象表示一个可以明确标识的实体,比如:一辆车、一个人、一朵花等等,每个对象都有它自己独特的标识:状态和行为;
类:
由N多对象,抽取出象的部分(简称抽象),像的部分包含(属性和方法)称为类的特征,然后再根据这个特征判断其它对象是否属于该类别;
对象:
对象是通过 new 关键字调用构造函数创建出来的。
public class Phone{
// 手机的牌子
String brand;
// 手机的类型(智能机、音乐手机等)
String type;
// 手机的价格
double price;
public void info(){
System.out.println(brand+"---"+type+"---"+price);
}
//无参的构造方法
public Phone(){
}
// 有参的构造方法
public Phone(String brand,String type,double price){
this.brand=brand;
this.type=type;
this.price=price;
}
}
public class TestPhone {
public static void main(String [ ]args){
Phone p1=new Phone(); // 创建出一个手机对象
System.out.println("p1="+p1);
p1.brand="三星";
p1.type="s20";
p1.price=4999.00;
p1.info();//调用方法
System.out.println("------------------------");
Phone p2=new Phone("苹果", "4s", 6999.9);
p2.info();
Phone p3=p1;//把p1的地址"复制一份"赋值给p3
p3.info();
System.out.println("p1="+p1+"\tp3="+p3);
p2=null;//将null赋值给p2
}
}
每个对象的属性都是相互独立的而方法都是共享的。
使用new关键字创建对象。
构造方法:
构造方法是在使用new关键字创建对象时才被调用,构造方法的作用就是初始化对象中的属性;
构造方法与一般方法的区别:
- 构造方法的方法名和类名相同;
- 没有返回值,连void都没有;
- 当创建对象时才会被调用;
- 和一般方法一样也是可以有重载方法的(无参构造方法、有参构造方法);
//无参的构造方法
public Phone(){
}
// 有参的构造方法
public Phone(String brand, String type){
this.brand = brand;
this.type = type;
}
// 有参的构造方法
public Phone(String brand,String type,double price){
this.brand = brand;
this.type = type;
this.price = price;
}
// 类中默认就有无参构造方法
引用变量访问对象和调用数据域和方法:
我们访问对象是通过对象类型变量来访问,该变量包含了对对象的引用。使用操作符: . 来访问对象数据和方法;
在java中除了基本数据类型外就是引用数据类型,创建对象会在堆内存中分配空间,然后通过引用变量来访问,引用地址的变量就是引用变量,也就是引用数据类型。
声明对象类型变量有两种方式:
Phone p ; //只声明,未指向一个引用地址
Phone p = null; //p指向一个空地址
//两者基本无区别,null是引用类型的默认值
Phone p2=new Phone("苹果", "4s", 6999.9);
//表示创建一个Phone对象,并返回该对象的引用,赋给Phone类型的p2变量。 变量p2包含了一个Phone对象的引用地址。 但通常情况下,直接称变量p2为Phone对象。
引用类型变量和基本类型变量的区别:
每一个变量都代表一个存储值的内存位置。 变量声明时,需要告知编译器该变量可以存储什么类型的值。对基本类型变量来说,对应内存所存储的值就是基本类型值。而对于引用类型变量来说,对应内存所存储的值是一个引用,指向对象在内存中的位置。
int a = 1;
int b = a; // 将a的实际值赋给b
Phone p = new Phone();
Phone p2 = p; //将p的引用地址赋给p2 , p和p2指向同一对象
p2.brand = "iphone";
System.out.println(p.brand); // iphone
总结:
-
将引用类型变量赋值给另外一个同类型的引用变量,那么这两个引用变量会指向同一个对象,而不是独立的对象。
-
如果想要指向一个具有同样内容,但不是同一个对象,可以使用clone()方法。
-
如果不再需要某个对象时,也就是不引用该对象,可以将引用类型变量赋值null,表示引用为空。 若创建的对象没有被任何变量所引用,JVM会自动回收它所占的空间。
静态与实例的区别:
静态变量和静态方法属于类本身,静态变量被由类创建出来的对象所共享,在静态方法中不能直接访问实例变量和调用实例方法;
public class Demo {
public int a = 5; // 实例变量
public static int b = 10; // 静态变量
public Demo(int a) { // 构造方法
this.a = a;
}
public static void main(String[] args) { // 静态方法
Demo d1 = new Demo(6);
Demo d2 = new Demo(8);
System.out.println(d1.a + " " + d2.a); // 6 8, 两个对象互不相关
d1.b = 15; //d1对象修改静态变量 b
System.out.println(d2.b); //影响d2对象
}
public void hello(){ // 实例方法,属于通过类创建出来的对象
// ....
}
}
静态变量将变量值存储在一个公共地址,被该类的所有对象共享,当某个对象对其修改时,会影响到其他对象。而实例的实例变量则是存储在不同的内存位置中,不会相互影响 ;
this关键字的使用:
关键字this表示的是当前的对象,引用对象本身, 可以用于访问实例的数据域 ;
作用:
this.属性名称 – 指的是访问类中的成员变量,用来区分成员变量与局部变量;
class Person{
private String name;
private int age;
private String gender;
Person(){}
Person(String name,int age,String gender){
this.name = name;
this.age = age;
this.gender = gender;
}
public void setName(String name){
name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
age = age;
}
public int getAge(){
return age;
}
public void setGender(String gender){
gender = gender;
}
public String getGender(){
return gender;
}
}
方法传递 - 引用参数:
方法是一种功能的集合,表明可以做什么,封装了实现功能的代码,想要实现某个功能只需要调用相关的方法即可,我们不需要关注方法的实现细节;
-
java中的方法可以传递参数,参数的传递方法就是值传递。
-
参数有形参和实参,定义方法时写的参数叫形参,真正调用方法时,传递的参数叫实参。
-
调用方法时,会把实参传递给形参,方法内部其实是在使用形参。
-
所谓值传递就是当参数是基本类型时,传递参数的值,比如传递i=10,真实传参时,把10赋值给了形参。
-
当参数是对象时,传递的是对象的值,也就是对象的首地址。就是把对象的地址赋值给形参。
传递基本数据类型与传递引用类型的区别:
- 基本数据类型的变量中直接存放数据值本身,所以改的时候改的是数据值本身;
- 引用类型不同的地方在于真正的数据并没有在栈区的变量中保存,而是在堆区里面保存着,所以虽然也拷贝了一份,也是副本,但是二者指向的是同一块堆区
引用数据类型就好比说是两个小伙伴共同拥有一双鞋子,其中一个把它穿破了,那么另外一个小伙伴也会受到影响
基本数据类型就好比说是仿造了一双相同的鞋子,其中一个穿破了并不影响另外一个小伙伴穿