第三章:面向对象
面向对象2
1.对象与引用
Java语言中除基本类型之外的变量类型都称之为引用类型。
Java中的对象是通过引用对其操作的。
Car baoma = new Car( );这句语句的目的是创建一个对象,它包含了三个动作:
①new Car();
是以Car类为模板,调用Car类的构造函数,在堆栈中以复制的形式创建一个Car类对象。
②单单创建一个对象是不能用的,需要再创建一个Car类引用变量,就是以后可以用来指向Car类对象的对象引用。
③“=”操作符使得对象引用指向刚创建的那个Car对象。
在这条语句中有两个实体,一个是对象引用变量,二是对象本身。
基本类型和引用类型的区别:
基本数据类型 | 引用数据类型 | |
---|---|---|
概念 | 变量(单纯地值) | 对象(引用) |
存储位置 | 在栈中存 值 | 在栈中存引用,在堆中存具体对象的属性值。 |
值传递与引用传递
Java中进行方法调用传递参数时,参数传递有两种:
值传递:(形式参数是基本数据类型):方法调用时,实际参数把它的值传递给形参,形参只是用实参传来的值初始化自己的内容,实参与形参是两个不同的存储单元,因此方法中的形参值的改变不会影响到实参的值。
引用传递:(形参数据类型是引用类型):也称传地址。方法调用期间,实际参数是对象,这个时候实际参数与形式参数指向同一个地址,在方法执行时,对形参的操作就是对实际参数的操作。这个结果会在方法结束后被保留下来,所以方法中的形参的改变会影响到实参。
注:基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,并不是对象本身。
2.static关键字
static被称为静态,可以用来修饰类的属性,方法,代码块,内部类。
特征:
①随着类的加载而加载
②优先于对象存在
③修饰的成员,被所有对象所共享
④可不创建对象,直接被类调用
属性:static属性是类的所有对象共享的,不管创建了多少对象,static在内存中只有一个。
static方法:可以创建对象调用,也可以用类名调用。建议直接用类名调用。并且在static方法中只能调用static属性,因为静态的方法的优先级高于对象。
public class Static {
int age;
String name;
static int tikcer = 11;
public static void tikcer(){
//静态方法只能引用静态变量,不能引用成员变量。
tikcer -= 1;
System.out.println("买票"+tikcer);
}
public void getMax(){
//成员变量既可以引用成员变量也可以引用静态变量。
System.out.println(name+tikcer);
}
public static void main(String[] args) {
//静态方法可以通过类名直接引用
Static.tikcer();
Static.tikcer();
Static.tikcer();
Static a = new Static();
//也可以通过对象访问
a.tikcer();
}
}
3.代码块
定义:一个没有名字的方法块,分为实例块和静态块。
实例块:每次创建对象时自动调用。
静态块:类加载时自动调用,但是仅调用一次,且与是否创建对象无关。
注:静态块最先执行,因为其余的都需要对象来引用,而静态块不需要。
优先级:静态块 > 实例块 > 方法
public class DaiMaKuai {
static int age = 10;
{
System.out.println("实例代码块");
}
static{
System.out.println("静态代码块");
}
public static void main(String[] args) {
new DaiMaKuai();//创建一次对象,就执行一次实例代码块。
new DaiMaKuai();
System.out.println(DaiMaKuai.age);//加载一次类就调用一次静态代码块,但也只执行一次。
//并且静态代码块最先执行
}
}
4.包
包的概念:包就是文件夹。
包的作用:管理类
具体体现:
①避免重名类。
全类名 = 包名(类的地址) + 类名;
import导入外部包的类:不能导入两个类名相同的,即使属于不同的包。 如果强行使用,需要通过全类名来引用。
②按照不同的功能管理类。
包的命名规范:全小写,并区分包的级别。
1)第一级:指项目类型:如com(商用),org(组织),gov(政府),edu(教育)。
2)第二级:指项目所开发或者运行公司的名称,如oracle,sun
3)第三级:指项目名称:如bcms,cms等。
4)第四级:指项目模块的名称,util
………
③控制访问权限。
访问权限修饰符
权限从大到小:
1)public:公共权限,可以修饰类,属性,方法
2)protected:受保护的权限,可以修饰属性,方法 //不同包不同类中不能访问
3)default(默认的,不写即为默认):同包权限,可以修饰类,属性,方法 //不同包不同类中不能访问
4)private:私有权限,可以修饰属性,方法 //只能在同一个包的同一个类中。
注:在同一个包的不同类中不需要导包;
在不同包的子类中可以访问受保护的权限
具体代码:
同类中都可以访问:
public class Demo1 {
public int pnum;
protected int pronum;
int num;
private int prinum;
public static void main(String[] args) {
//在同类中,四种修饰符所修饰的都可以访问
int pnum = 10;
int pronum = 101;
int num = 1;
int prinum = 11;
}
}
同包不同类中除了private都可以访问:
public class Demo2 {
public static void main(String[] args) {
Demo1 d = new Demo1();
//在同包不同类中只能访问public,默认,和protected修饰的;私有的已经不能访问了
d.pnum = 10;
d.num = 101;
d.pronum = 11;
}
}
不同包不同类中只能访问public:
但是当当前的类继承了被引用的类之后,就可以访问受保护的:
import com.ff.javaoop1021.day7.Test;
import com.ff.javaoop1022.day8.Demo1;
public class TestDemo1 extends Demo1{
public void test(){
Demo1 d = new Demo1();
//在不同包的不同类中只能访问public修饰的,且还得提前用import引用。
d.pnum = 101;
}
public void test1(){
//当前类作为子类继承之后,就可以访问受保护的
TestDemo1 d1 = new TestDemo1();
d1.pronum = 101;
}
}
5.封装
封装
:就是将类的某些信息藏在类内部,不允许外部程序直接访问。
优点:
①只能通过规定的方法访问
②隐藏类的实现细节
③方便加入控制语句
④方便修改信息
封装后可以向外部程序提供专门的方法,来访问类的私有属性。
this
:表示自身类的对象。
可以引用成员变量和成员方法,但是只能在非静态方法中使用。
public class Packaging {
//隐藏类的某些信息,只能通过规定方法访问,方便加入控制语句,方便修改信息
private String name;
private int age;
//公共权限的构造方法
public Packaging() {
}
public Packaging(String n, int a) {
name = n;
age = a;
}
//专属功能的成员方法
public void setName(String n) {
if (n != null) {
name = n;
}
}
public String getName() {
return name;
}
public void setAge(int a) {
if (a > 0) {
age = a;
}
}
public int getAge() {
return age;
}
}
若有错误,欢迎私信指正。