对象与引用
-
java语言中除基本类型之外的变量类型都称之为引用类型。
-
java中的对象是通过引用对其操作的.
例如 我们有一个自定义为Car(汽车类)
class Car{
String color;
String name;
String model;
}
Car bm = new Car();
通常把这条语句的动作称之为创建一个对象,其实,它包含了三个动作。
1)右边的“new Car()”,是以Car类为模板,调用Car类的构造函数,在堆空间里创建一个Car类对象。
2)左边的Car bm是创建了一个引用变量,就是可以用来指向Car对象的引用
3)=操作符使对象引用指向刚才所创建的对象,也就是将对象的地址赋给引用变量bm
值传递和引用传递
-
值传递:方法调用时,实际参数把自己的值传递给形式参数,形式参数只是用实际参数的值来初始化自己的存储单元内容,两个存储单元是不同的,所以形式参数的值改变并不会影响实际参数的值
public class Demo {
private int a;
/*
基本类型值传递
*/
public static void main(String[] args) {
Demo d = new Demo();
int a =10;
d.test(a);
System.out.println(a);
}
/*
形参b
用实参a的值,直接对b进行了赋值,在内存中有两个独立的存储空间 a,b
*/
public void test(int b) {
b =20;//b的值发生改变 不会影响到a
}}
-
引用传递:也就是传地址,方法调用时,实际参数就是对象,这个时候实参和形参指向的是同一个地址,所以这个方法执行时对形参的改变会影响到实参
public class Demo {
/*
引用类型 在传递时,传的是对象的地址
*/
public static void main(String[] args) {
Demo d = new Demo();
Person zs = new Person("张三",20);
d.test(zs);//只是把对象的地址传给了 p System.out.println(zs.name);//李四
}
/*
*/
public void test(Person p) {
//p和zs指向的是同一个对象
p.name = "李四"; }
总结:基本类型值传递是该数据的本身,而引用类型的传递是对对象的引用,传的是地址而不是对象的本身。
this关键字
-
this关键字代表当前对象
-
使用this关键字引用成员变量
-
使用this关键字引用成员方法
在一个类中方法或者构造方法内部,可以用“this.成员变量名”这样的格式来引用成员变量名,常常可以用来区分成员变量和局部变量
public class Demo{
private int a;
public Demo(int a){
this.a = a;
}
public int getA(){
return a;
}
public void setA(int a){
this.a = a;
}
}
static关键字
-
static被成为静态,可以用来修饰类的属性,方法,代码块,内部类。
-
随着类的加载而加载
-
优先于对象的存在
-
修饰的成员,被所有对象共享
-
可不创建对象,直接被类调用
-
/*
static 静态 修饰属性,方法,代码块,内部类(后面讲)
类变量,和类一样只有一份
被static修饰的内容,随着类的加载而加载,优于对象存在,被所有对象共享,可以通过类名直接调用
*/
public class Chinese {
String name;//name属性不建议修饰为static,在内存中只有一份,而name每个对象都不一样
int age;
static String country = "中国";//常量一般修饰为static
/*
static修饰方法,类方法,静态方法不能使用非静态的成员变量,静态资源随着类先加载,
非静态的随着对象的创建而加载
*/
public static void test(){
//System.out.println(name);
}
/*
非静态方法可以使用静态变量,非静态方法必须通过对象来调用,对象创建之前先加载类 */
public void test1(){
System.out.println(country);
}}
public class Test {
public static void main(String[] args) {
Chinese zs = new Chinese();
zs.name = "张三";
zs.age = 20;
Chinese ls = new Chinese();
ls.name = "李四";
ls.age = 20;
Chinese.country = "china";
System.out.println(zs.name);
System.out.println(ls.name);
System.out.println(zs.country);
System.out.println(ls.country);
Chinese.test();//静态方法,静态变量 建议使用类名调用
}
}
代码块
public class Demo {
String name;
static String country = "中国";
public Demo() {
System.out.println("无参构造");
}
/*
代码块:类似一个没有名字的方法.
代码块:
实例代码块 在创建对象之后执行,调用构造方法之前执行,每创建一次对象,执行一次
静态代码块 在类加载时候执行,只执行一次,多个静态按照先后顺序
类什么时候加载?
main方法在哪个类中执行,这个类加载的.
创建某个类的对象,
调用某个类中的静态属性,方法
*/
{
System.out.println("实例代码块");
}
static {
System.out.println("静态代码块2");
}
static {
System.out.println("静态代码块1");
}
}
public class TestDemo {
public static void main(String[] args) {
new Demo();
new Demo();
//System.out.println(Demo.country);
//System.out.println(Demo.country);
}
}
包
包:为了更好地组织类,java提供了包机制,用于区别类名的命名空间(是类路径中的一部分 地址)。 避免类重名 按功能管理(目前按日期管理) GUI(窗口) 数据访问层 工具类 包的命名规则:包名都小写 项目类型:com(商业) org(组织) edu gov 公司名称:oracle sun huawei 项目名称:oa,erp,cms 功能模块:窗口/视图层 数据访问层 服务层 工具类 细分子模块
访问权限修饰符
java有四种访问权限修饰符,由大到小依次是public,protected,default,priva
/*
访问权限修饰符:用来修饰类,成员变量,成员方法,内部类,控制对齐访问的权限
访问权限和包是密切相关的
public 公共的 类,成员变量,方法,内部类 在任何类中都可以访问
protected 保护的 成员变量,方法,内部类
(default) 默认的(无) 类,成员变量,方法,内部类
private 私有的 成员变量,方法,内部类
*/
public class Demo1 {
public String pubname;
protected String proname;
String name;
private String priname;
public void pubtest(){ }
protected void protect(){ }
void test(){ }
private void pritest(){ }
public static void main(String[] args) {
Demo1 demo1 = new Demo1();
System.out.println(demo1.pubname); System.out.println(demo1.proname); System.out.println(demo1.name); System.out.println(demo1.priname);//在本类中都可以访问到
}}

封装
/*
封装:将类的某些信息隐藏起来(用访问权限修饰符来实现),不让在外部直接对其访问, 可以通过一个特定的方法来对隐藏信息进行访问,便于控制
设计模式:解决某一类问题的解决方案(模式)
单例模式-->让一个类在一个程序,只能创建一个对象
*/
public class Dog {
//隐藏类的属性
private String name;
public Dog(){ }
public Dog(String name) {
if (name!=null){
this.name = name;
}
}
private void eat(){ }
//提供特定的方法,对隐藏成员进行访问
public void setName(String name){
if(name!=null){
this.name = name;
} }
public String getName(){
return this.name;
}}
public class TestDog {
public static void main(String[] args) {
Dog dog = new Dog("旺财");
//dog.name = "";//直接访问类的成员
Dog dog1 = new Dog();
dog1.setName("小黑");
System.out.println(dog1.getName());
System.out.println(dog.getName());
}
}
