匿名对象
1、匿名对象就是没有名字的对象
new 类名();
public class Duixiang {
public static void main(String[] args) {
/**相当于:
* Animal a = new Animal();
* a.name = "狗";
* a.age = 5;
* 这样占用内存,对于那种只调用一次的对象来说匿名对象节约内存空间
* **/
new Animal().name = "狗";
new Animal().age = 5;
}
}
class Animal{
String name;
int age;
}
封装
什么叫封装?
举个例子:一个用户有用户名,密码,权限等,把这些属性放在一个用户里就等于是封装.
看个实际一点的例子,一个人有眼睛,鼻子,嘴巴,等面貌特征,用OOP的思想理解就是,这里的人相当是一个对象,眼睛等相当与是这个对象的属性,我们所说的封装就是指把这些眼睛,鼻子,嘴巴等属性放在一个对象里即为封装.(当然这些属性都是特定的,你不能说我把猪脚也放进这个对象里去,那么这就违背了封装的概念).
概念:把一系列具有相同特征的属性放在一个对象,组成的这个对象的过程就叫做封装.,隐藏事物的实现细节,对外提供公共的访问形式好处:
1)隐藏事物的实现细节
2)提高代码的复用性
3)提高了代码的安全性
原则:
1)隐藏事物的属性
2)隐藏事物的实现细节
3)对外提供公开的访问方式
private关键字
含义:私有的,就是只能在本类中访问,本类之外一律不许访问
使用上面的代码举例
public class Duixiang {
public static void main(String[] args) {
/**相当于:
* Animal a = new Animal();
* a.name = "狗";
* a.age = 5;
* 这样占用内存,对于那种只调用一次的对象来说匿名对象节约内存空间
* **/
!!!new Animal().name = "狗";//无法访问
!!!new Animal().age = 5;//无法访问
}
}
class Animal{
private String name;
private int age;
}
Get 和Set方法
当成员遍历被private私有化之后,外界无法访问,但是外界就是想要获取成员变量值并且设置成员变量值,这里就用到Get 和Set方法
get方法获取值
set方法设置值
再次使用上面报错的代码
public class Duixiang {
public static void main(String[] args) {
/**相当于:
* Animal a = new Animal();
* a.name = "狗";
* a.age = 5;
* 这样占用内存,对于那种只调用一次的对象来说匿名对象节约内存空间
* **/
//创建一个Animal类的a对象
Animal a = new Animal();
a.setName("狗");
a.setAge(5);
System.out.println(a.getName()+a.getAge());
}
}
class Animal{
private String name;
private int age;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}
this关键字
this表示当前类型当前对象的引用
哪个对象调用this关键字所在的方法,this就指哪个对象
用于区分哪个是成员变量哪个是局部变量,在set方法中,使用this.成员变量名的一定是成员变量,剩下的就是局部变量
构造方法概述
1、构造方法又叫构造函数,构造器,Constructor
2、用于给成员变量赋值,在创建对象的过程中,会自动调用构造方法,当对象创建完成时,对象中的成员变量就已经通过构造方法赋值好了
3、说明
1、构造方法没有返回值,void也没有
2、方法名称和所造类的名称保持一致
3、构造方法可以有return语句,但仅仅是结束语句
3、构造方法不能手动调用,在创建对象的过程中由JVM自动调用
4、因为一个对象只能被创建一次,所以构造方法针对同一个对象,只能被调用一次
5、构造方法可以重载
public static void main(String[] args) {
Car c = new Car("蓝色",4);//创建一个Car的对象 c
System.out.println(c.getColor()+c.getNum());
}
}
class Car{
private String color;
private int num;
public void run() {
System.out.println("小车跑");
}
public Car() {}//空参构造
public Car(String color,int num) {//满参构造
this.color = color;
this.num = num;
}
public void setColor(String color) {//set方法
this.color = color;
}
public String getColor() {//get方法
return color;
}
public void setNum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
这里this.color = color个人理解,成员变量里面有一个私有的color,在构造方法中也有一个String color,这里的color是2个变量,第一个是成员变量,第二个是构造方法的参数,当在构造方法里使用this.color = color时意思就是将构造方法里的参数也就是随着对象创建并且给对象赋值的“蓝色”赋值给成员变量的color,如果不用this.color。参数color赋值给谁。只能赋值给this.color,可以理解为我的color
静态static
在现实中,如果所有对象都有一个共同的属性值
1、没有静态时,每个对象都有一份这样的数据,分别随着每个对象开辟在堆内存中,如果后期这个属性值要修改,那么工程堪忧啊,并且浪费资源
2、有静态时,会让这个数据也就是变量从原本对象的空间内也就是栈空间,改为储存在方法去的静态区中,所以对象都共享一份数据,一个对象修改数据,不会影响其他,并且节约资源
静态不随对象的变化而变化,随着类的加载而加载,被所有当前类型对象共享,并且静态变量优先于对象存在
如何访问
类名或者对象名.静态变量名,通过类名.静态变量名不需要创建对象,对象名.静态变量名 需要创建对象
1、静态方法中不能访问非静态方法
原因:因为在静态方法存在的时候,对象还不一定存在,而非静态方法又需要对象来调用,所以静态方法中不能调用非静态方法
2、静态方法不能访问非静态变量
原因:静态成员随着类的加载而优先于对象的存在,当静态方法存在时,对象很可能还没创建,非静态变量又是随着对象的创建而出啊感觉,所以静态方法不能访问非静态变量
3、静态方法不能使用this
原因:this指代对象,而静态对象优先于对象存在,静态方法如果要执行,对象很可能还没创建,this就指代不到任何内容
总结:静态不能访问非静态 ,非静态方法什么成分都能调用
静态变量和非静态变量区别:
1、非静态变量属于对象,静态变量属于类
2、非静态变量随着对象存储在堆内存中,静态变量随着类的创建在方法区的静态区中
3、非静态变量随着对象创建而创建,随对象消亡而消亡,静态变量随着类的加载而加载,随类的消亡而消亡
4、非静态成员都需要对象调用,静态成员既可以对象名而调用,也可以类名来调用