Java学习之路(七)引用数据类型之类

一、包

Java中的包等同于C#中的命名空间,它是类的上一级结构。

  1. 定义包:package 包名;

  2. 导入包

    包导入语句导入效果
    import 包名.*导入包中所有文件
    import 包名.类名导入包中的指定类

    PS. 还可以在程序中直接通过包名.类名进行调用。

    注意:

    1. 建议采用“import 包名.类名”的方式加载,提高效率;
    2. 加载类的顺序与import导入的顺序无关;
    3. “import 包名.* ”只能访问包名下的类,无法访问子包下的类。

二、访问权限

同一个类同一个包不同包的子类不同包的非子类
private
默认
protected
public
package com.h.test;

public class Test {
	private int varPrivate = 0;
	int varDefault = 1;
	protected int varProtected = 2;
	public int varPublic = 3;
	
	public void myTest() {
		// 同类
		System.out.println(this.varPrivate);
		System.out.println(this.varDefault);
		System.out.println(this.varProtected);
		System.out.println(this.varPublic);
	}
	
}
package com.h.test;

public class Test2 {

	public void myTest() {
		// 同包非子类
		Test test = new Test();
		System.out.println(test.varPrivate);	// 编译报错
		System.out.println(test.varDefault);
		System.out.println(test.varProtected);
		System.out.println(test.varPublic);
	}

}
package com.h.test;

public class Test3 extends Test{
	
	public void myTest() {
		// 同包子类
		Test test = new Test();
		System.out.println(test.varPrivate);	// 编译报错
		System.out.println(test.varDefault);
		System.out.println(test.varProtected);
		System.out.println(test.varPublic);
		
		System.out.println(this.varPrivate);	// 编译报错
		System.out.println(this.varDefault);
		System.out.println(this.varProtected);
		System.out.println(this.varPublic);
	}
}
package com.h.test2;

import com.h.test.Test;

public class Test4 {
	
	public void myTest() {
		// 不同包非子类
		Test test = new Test();
		System.out.println(test.varPrivate);	// 编译报错
		System.out.println(test.varDefault);	// 编译报错
		System.out.println(test.varProtected);	// 编译报错
		System.out.println(test.varPublic);
	}

}
package com.h.test2;

import com.h.test.Test;

public class Test5 extends Test {

	public void myTest() {
		// 不同包子类
		Test test = new Test();
		System.out.println(test.varPrivate);	// 编译报错
		System.out.println(test.varDefault);	// 编译报错
		System.out.println(test.varProtected);	// 编译报错
		System.out.println(test.varPublic);
		
		System.out.println(this.varPrivate);	// 编译报错
		System.out.println(this.varDefault);	// 编译报错
		System.out.println(this.varProtected);
		System.out.println(this.varPublic);

	}

}

综上所述:

  • private只允许在同类中进行访问;
  • default允许同类、同包中访问;
  • protect允许在同类、同包、不同包子类中访问;
  • public允许在同类、同包、不同包中进行访问。

三、关键字

  1. static(静态)

    • static不能修饰类、方法里的局部变量;
    • 静态方法不能直接访问同一个类中的非静态成员,只能直接调用同一个类中的静态成员,但可通过实例化进行访问非静态成员;
    • 静态方法中不能使用this;
    • 静态方法不允许在子类中重写。
  2. final

    • final不能修饰构造方法;
    • 使用final修饰的类,没有子类,不能被继承;
    • 使用final修饰的方法,不能被子类重写,可以正常被子类继承使用;
    • 使用final修饰的变量,只要在使用前赋值即可,一旦赋值不能改变,即常量。
      • 定义初始化
      • 构造代码块中赋值
      • 构造方法中赋值
  3. this和super

    thissuper
    访问当前类的成员方法访问父类的成员方法
    访问当前类的成员属性访问父类的成员属性
    访问当前类的构造方法访问父类的构造方法
    不能在静态方法中使用不能在静态方法中使用

四、 定义

  • 类:抽象的概念,是一个模板。
  • 对象:类的实例化,是一个具体实体。
  • 属性:对象具有的各项静态特征,代表着“有什么”。
  • 方法:对象具有的各项动态行为,代表着“做什么”。

五、类与对象

  1. 类的创建:修饰符 class 类名{}

    public class Test{
    
    }
    
  2. 对象的声明与实例化:

    类名 对象名 => 在栈空间中创建空对象

    new 类名() => 在堆空间中开辟了一个新的实例空间

    Test test = new Test();
    

六、属性与方法

属性与方法的定义等同于变量与方法的定义。

public class Test{
	public int varTest;
    
    public void myTest(){
        
    }
}

七、构造方法

和普通方法不同,构造方法只能在类被实例化的时候进行调用。因此,构造方法常被用于初始化类。

构造方法根据是否带有参数分为无参构造方法和带参构造方法。

构造方法的结构为:

public class TestSample {
	String name;
    
    // 无参构造方法
	public TestSample() {
		
	}
	
    // 带参构造方法
	public TestSample(String name) {
		this.name = name;
	}
}

定义构造方法时需注意:

  • 构造方法与类同名且没有返回值
  • 当类中没有指定构造方法时,系统会自动添加无参的构造方法
  • 当有指定构造方法时,无论是带参、无参的构造方法,都不会自动添加无参的构造方法
  • 一个类中可以有多个构造方法
  • 构造方法之间可以通过 this() 或 this(参数) 进行调用,但只能放在第一条语句处
  • 在构造方法中可以调用类的成员属性和成员方法
  • 子类构造方法默认调用父类的无参构造方法,子类可以通过super() / super(参数)调用父类允许被访问的构造方法,但必只能放在第一条语句处

八、代码块

  1. 普通代码块:定义于方法中的{}。

    执行顺序:顺序执行,先出现,先执行。

    public void myTest() {
        {
            System.out.println("普通代码块1");
        }
    
        System.out.println("普通方法");
    
        {
            System.out.println("普通代码块2");
        }
    }
    
  2. 构造代码块:定义于类中,没有加static关键字的代码块{}。

    执行顺序:创建对象(实例化)时调用,优先于构造方法执行。(每次创建对象都会被调用)

    {
        System.out.println("构造代码块");
    }
    
  3. 静态代码块:定义于类中,加以关键字static进行修饰的代码块。

    执行顺序:类加载时调用,优先于构造代码块执行。(每个静态代码块只执行一次)

    static{
        System.out.println("静态代码块");
    }
    

    因此,整合上述代码,可得执行效果如下:

    package com.h.test3;
    
    public class TestSample {
    	static{
    		System.out.println("静态代码块");
    	}
    	
    	{
    		System.out.println("构造代码块");
    	}
    	
    	public TestSample() {
    		System.out.println("构造方法");
    	}
    	
    	public void myTest() {
    		{
    			System.out.println("普通代码块1");
    		}
    		
    		System.out.println("普通方法");
    		
    		{
    			System.out.println("普通代码块2");
    		}
    	}
    }
    
    
    package com.h.test3;
    
    public class TestMain {
    
    	public static void main(String[] args) {
    		TestSample testSample = new TestSample();
    		testSample.myTest();
    
    	}
    
    }
    /* 执行结果如下:
    	静态代码块
    	构造代码块
    	构造方法
    	普通代码块1
    	普通方法
    	普通代码块2
    */
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值