Java学习笔记08

Java学习——Java面向对象02(面向对象进阶)


一、权限修饰符

权限在Java中体现为访问控制方面,Java面向对象的封装性是通过对成员变量和方法进行访问控制实现的,访问控制分为4个等级:私有、默认、保护和公有。

  • 私有级别

私有级别的关键字是private,私有级别的成员变量 和方法只能在其所在类的内部自由使用,在其他的类中则不允许直接访问。私有级别限制性最高。

  • 默认级别

默认级别没有关键字,也就是没有访问修饰符,默认级别的成员变量和方法,可以在其所在类内部和同一个包的其他类中被直接访问,但在不同包的类中则不允许直接访问。

  • 公有级别

公有级别的关键字是public,公有级别的成员变量和方法可以在任何场合被直接访问,是最宽松的一 种访问控制等级。

  • 保护级别

保护级别的关键字是protected,保护级别在同一包中完全与默认访问级别一样,但是不同包中子类能够继承父类中的protected变量和方法,这就是所谓 的保护级别,“保护”就是保护某个类的子类都能继承该类的变量和方法。


不同级别的访问控制级别:
在这里插入图片描述
访问类成员时,在能满足使用的前提下,应尽量限制类中成员的可见性,访问级别顺序是:私有级别→默认级别→保护级别→公有级别。

二、静态static

static表示“静态”的意思,可以用来修饰成员变量和成员方法甚至是代码块。 static的主要作用在于创建独立于具体对象的域变量或者方法 。
简单理解: 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问, 并且不会因为对象的多次创建而在内存中建立多份数据。

(1). 静态变量与静态方法

static修饰的成员变量是静态变量
staitc修饰的方法是静态方法

例:

public class Test {

	public static void main(String[] args) {
		People.display();  
		System.out.println(People.count);  //对象并未创建,类加载就可调用类中静态方法或属性

		People p = new People("王麻子",25);//自动调用全参构造方法
		p.show();
	}
}

class People {
	private String name;
	private int age;
	//静态方法修饰的属性方法,被就调用时,有可能对象还未创建
	static int count = 0;
	
	//全参构造方法
	public People(String name,int age){
		this.name = name;
		this.age = age;
		
		System.out.println("\n已创建该对象");	
		count ++;
	}
	
	//无参构造方法
	public People() {
		System.out.println("\n已创建该对象");	
		count++;
	}
	
	public void show() {
		System.out.println("\n这个人的名字:" + name + "   年龄为:" + age + "\t" + count);
	}
	
	public static void display() {
		System.out.println("静态方法展示!");
	}
}

运行结果,只会调用一次构造方法:

在这里插入图片描述

  • 静态成员 在类加载时加载并初始化。
  • 无论一个类存在多少个对象 , 静态的属性, 永远在内存中只有一份( 可以理解为所有对象公用 )
  • 在访问时: 静态不能访问非静态 , 非静态可以访问静态 !

(2). 静态代码块

代码块

普通代码块
在执行的流程中出现的代码块, 我们称其为普通代码块。

构造代码块
在类中的成员代码块,我们称其为构造代码块,在每次对象创建时执行, 执行在构造方法之前。

静态代码块
在类中使用static修饰的成员代码块, 我们称其为静态代码块, 在类加载时执行。 每次程序启动到关闭 ,只会执行一次的代码块。

代码块执行顺序:
静态代码块 ——> 构造代码块 ——> 构造方法

例:

public class Test {

	public static void main(String[] args) {
		People p1 = new People();
		People p2 = new People();
	}
}

class People {
	private String name;
	private int age;
	
	/**
	 * 构造代码块,随着对象的每次创建,执行一次,且执行在构造方法之前
	 * 
	 * 区别于构造方法:
	 * 无论用户调用哪一个方法创建对象,构造代码块必须执行
	 */
	{
		System.out.println("对象创建时执行001");
	}
	
	/**
	 * 静态代码块,随着类的加载(第一次使用时),才执行
	 * 类仅加载一次,所以静态代码块也仅执行一次
	 * 
	 */
	
	static {
		System.out.println("静态代码块执行001");
	}

	//无参构造方法
	public People() {
		System.out.println("对象创建时执行002");	

	}
}

运行截图:
在这里插入图片描述


三、this关键字

this指向对象本身, 一个类可以通过this来获得一个代表它自身的对象变量。

调用时机:

  • 调用实例变量。
  • 调用实例方法。
  • 调用其他构造方法

在多个构造方法重载时,一个构造方法可以调用其他的构造方法,这样可以减少代码量。

例:

public Person(String name, int age, Date d) { 
this.name = name; 
this.age = age;
birthDate = d; 
System.out.println(this.toString()); 
 }
public Person(String name, int age) {
 // 调用三个参数构造方法 
 this(name, age, null); 
 }
 public Person(String name, Date d) { 
 // 调用三个参数构造方法 
 this(name, 30, d); 
 }
 public Person(String name) { 
 // System.out.println(this.toString()); 
 // 调用Person(String name, Date d)构造方法 
 this(name, null); 
 }

三、对象销毁

对象不再使用时应该销毁。C++语言对象是通过 delete语句手动释放,Java语言对象是由垃圾回收器 (Garbage Collection)收集然后释放,程序员不用关心释放的细节。

垃圾回收器(Garbage Collection)的工作原理是: 当一个对象的引用不存在时,认为该对象不再需要,垃圾回收器自动扫描对象的动态内存区,把没 有引用的对象作为垃圾收集起来并释放。

总结

进阶面向对象方法!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值