文章目录
构造方法
创建对象时调用
构造方法名与类名相同,且没有返回值,且不需要使用void修饰。
• 作用:在构造方法中为创建的对象初始化赋值,
• 在创建一个对象的时候,至少要调用一个构造方法。
• 每个类都有构造方法。如果没有显式地为类定义构造方法,Java将会为该类提供一个默认构造方法,但是只要在一个Java类中定义了一个构造方法后,默认的无参构造方法即失效。
• 一个类可以有多个构造方法
可以通过构造方法创建对象,new对象时括号可以赋值/调用构造方法赋值
无参的构造方法不赋初值
public Student(){
System.out.println("定义了无参构造方法");
}
Student qs=new Student();
有参的构造方法不赋初值
public Student(int a,String b){
num=a;
name=b;
System.out.println("定义了有参构造方法");
}
Student zs=new Student();
zs.num=100;
zs.name="张三";
有参的构造方法为对象初始化赋值
public Student(int a,String b){
num=a;
name=b;
System.out.println("定义了有参构造方法");
}
Student ls=new Student(101,"李四");
System.out.println(ls.num);
System.out.println(ls.name);
ls.showInfo();
引用
引用类型
基本类型: 它的值就是一个数字,一个字符或一个布尔值
引用类型:用类作为类型,数组,接口 (它的值是对象在内存空间中的地址,具体的对象存在堆中)
car= new Car();
”=”操作符使对象引用函数指向刚创建的那个Car对象
一个红气球
car: 一个对象(气球)实体但抓不到
new car() 创建了一个对象(红气球
car1: 绳子1 car1=new car() 给红气球系上绳子1
(地址)
car2:绳子2 car1=new car() 给红气球系上绳子2
car2=car1 发生了复制 气球没有被复制,car1放在car2里了 car1,car2都系上红气球
类: 一根有绳子的气球( 绳子连接着气球的属性+方法)
(两个对象连着同一个地址
package day2.demo2;
/*
值传递
引用传递
*/
public class Test1 {
public static void main(String[] args) {
int a=10;
Test1 t=new Test1();
t.test(a);
System.out.println("a:"+a); //10
}
/*
public void test(int b) {
System.out.println(b);
} //b=10;
*/
public void test(int b){
System.out.println("b1:"+b); //10
b=20;
System.out.println("b2:"+b); //20
}
}
值传递:
(形参数类型是基本数据类型):方法调用时,实际参数把它的值传递给 对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是 两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
引用传递:
(形参数类型是引用数据类型参数):也称为传地址。方法调用时,实 际参数是对象,这时实际参数与形式参数指向同一个地址,在方法执行中,对形 式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下 来,所以方法执行中形式参数的改变将会影响实际参数
基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象 本身。
引用类型传递时,并不是将对象本身传递,只是将对象引用地址传递。这样形参发生变化,实参也会改变,他们指向同一个对象
xh 是一根绳子,连着Dog()气球
xh.name 即初始化连在xh系的气球的属性和方法~ (初始化始化类)
t绳子连接着 Test2()气球的test操作(方法),其方法参数为xh绳子,即引用了连在xh上的Dog()气球的所有属性和方法
Dog dog作为方法的参数:是系上了dog绳子的Dog气球
方法 test(Dog dog) 通过xh绳子找到Dog气球对象,并为其也系上dog绳子。
但Dog气球name属性依然是小黑。而dog.name改变了Dog气球的name属性为旺财。所以之前输出xh.name dog.name为小黑,之后气球name的属性已经变了。所以输出xh.name dog.name都为旺财。以后的其他绳子系上这个气球,name属性都是旺财~
Test2类(方法在类中!)
package day2.demo2;
public class Test2 {
public static void main(String[] args) {
Dog xh=new Dog();
xh.name="小黑";
Test2 t=new Test2();
t.test(xh);
System.out.println("xh"+xh.name); //3.旺财
}
//引用类型传递时,并不是将对象本身传递,只是将对象引用地址传递。这样形参发生变化,实参也会改变,他们指向同一个对象
public void test(Dog dog){
System.out.println("dog1"+dog.name); //1.小黑
dog.name="旺财";
System.out.println("dog2"+dog.name); //2.旺财
}
}
static
static被称为静态,可以用来修饰类的 属性,方法,代码块,内部类
修饰成员特点
• 随着类的加载而加载
• 优先于对象存在
• 修饰的成员,被所有对象所共享
• 可不创建对象,直接被类调用
属性
静态属性是类的所有对象共享的,即不管创建了多少个对象,静态属性在内存 中只有一个。
可以把一个类中都相同的属性,修饰为static,随着类加载只用访问一次
调用:
可以使用对象调用,也可以直接用类名调用,建议用类名直接调用
类名+属性名 ( Chinese.country )
但是非静态方法中,需要先创建对象
class类里的成员变量:static String country="中国”
- 被所有类共享,随着类的加载而加载
- Chinese.country 不从对象访问,直接从类访问
package day2.staticdemo;
public class Chinese {
String name;
int age;
String address;
static String country="中国"; //直接通过类名访问 被static修饰的成员变量只有一份。属于类,可以
//被所有对象共享,随着类的加载而加载
}
package day2.staticdemo;
public class TestChinese {
public static void main(String[] args) {
Chinese c1=new Chinese();
c1.name="c1";
c1.age=22;
c1.address="汉中";
System.out.println(c1.name+c1.age+c1.address+Chinese.country);
//country 不用从对象访问 直接从类访问
Chinese c2=new Chinese();
c2.name="c2";
c2.age=23;
c2.address="城固";
System.out.println(c2.name+c2.age+c2.address+Chinese.country);
}
}
static方法
- 在static方法内部: 只能访问类的static属性,不能访问类的非static属性,static属性先加载。
- static方法不能使用非静态变量
静态方法,只能访问类的static属性。不能使用非静态属性
非静态方法,类先加载,可以使用非静态属性
非静态方法,类肯定先加载了,可以使用静态的变量。因为要先创建对象,方法才能被调用
代码块
代码块定义在类中 没有名字
代码分实例块和静态块 实例块
实例块:创建对象时自动调用
{ //任何符合语法的Java代码 }
静态块:类加载时自动调用,仅一次,与是否创建对象无关。
static { //任何符合语法的Java代码 }
包
文件夹
作用:
避免类重名 按照不同功能管理类 控制访问权限
是类的路径 地址
不支持导入两个地址不同,名称相同的类
有一个类要用全类名写 避免类重名
命名规范:
在包名中,可以使用.号来区分包的级别;包名一般情况下是小写
第一级 指该项目的类型,如com,org,gov等,
第二级 指项目所开发或者运行的公司名称,如:oracle,sun,huawei 等
第三级 指项目的名称,如:bcms,oa,erp,cms等
第四级 指项目模块的名称,如:bean,action,exception等
导入外部包的类,关键字“import
java.lang包中的类在使用时不需要导入
访问权限修饰符
- public:任意访问
- protect:不同包子类
- default:同包类
- private:只在本类中访问
final
final修饰的变量为常量不变