`
come_for_dream
  • 浏览: 120390 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

JAVA关键字的深入探究

    博客分类:
  • java
 
阅读更多

  
                                         关键字总结

 Java语法基础篇之关键字总结:

      Java的关键字有很多,下面我们主要探讨

 访问限定符:public  protected  private 和默认的访问限定。还有thissuper finalstatic这几个比较神秘的关键字。

   ()首先我们来探讨访问限定符,我们分别从修饰类,属性,方法,构造方法这四点来讨论他们的用法。

 修饰类时:    

                            使用权限

Public:    在整个工程下面都可以使用使用被修饰的类

Protected:  再同一个包中或者在其子类中被修饰的类可以使用

默认的(即类前不加修饰符):   在一个包中可以被访问

Private:  外部类不能用private修饰,只有在内部类中才可以使用private修饰,只能在本类中使用

 

 

修饰属性和方法时:

 

Public:    在整个工程下面都可以使用

Protected:  再同一个包中或者在其子类中被修饰的方法或属性可以使用

默认的(即类前不加修饰符):   在一个包中可以被访问

Private:  外部类不能用private修饰,只有在内部类中才可以使用private修饰,只能在本类中使用

 

一下代码说明了修饰属性和方法时,再包内和包外访问权限的不同

 

代码:

以下为包内访问

 

package one;

public class Father {
	public int numPublic;
	protected int numProtected;
	int numDefault;
	private int numPrivate;

	public Father() {
		numPublic=0;
		numProtected=1;
		numDefault=2;
		numPrivate=3;
	}

	public void putOut() {
		System.out.println("this is father public  method!!");
	}

	protected void putOut1() {
		System.out.println("this is father protected method!!");
	}

	void putOut2() {
		System.out.println("this is father default method!!");
	}

	private void putOut3() {
		System.out.println("this is father private method!!");
	}

}



package one;



public class Test {

	
	public static void main(String[] args) {
		Father father =new Father();
               //访问public方法
		father.putOut();
               //访问protected方法
		father.putOut1();
               //访问默认方法
		father.putOut2();

                 //访问public属性
		System.out.println("numPublic : "+father.numPublic);
               //访问protected属性
		System.out.println("numProtected : "+father.numProtected);
                 //访问默认属性
		System.out.println("numDefault : "+father.numDefault);
                //私有属性不能访问
		System.out.println("numPrivate : ");

	}

}

 


Test类移到two这个包中时程序显示结果:

证明Protected:  再同一个包中或者在其子类中被修饰的方法或属性才可以使用

 

 

 

 

通过上下的对比, 说明了protected只能才包内访问(或其子类,子类中读者可以试一下),private只能在包中访问。

 

将包one中类Father的public去掉,会报错说明上述探究成立。

证明:默认的(即类前不加修饰符):   在一个包中才可以被访问

 

 

 

(二),下面我们讨论superthis

    This: 1.指本类当前正在被操作的的一个对象

        2.在构造方法中调用本类的某一个构造方法(参数个数和顺序对应)

        通常的用法为this.属性和this.方法

 

    下面这样会输出什么结果呢?

 

结果为:

0

1

2

3

this is father public  method!!

this is father protected method!!

this is father default method!!

this is father private method!!

 因为this()调用了无参的构造函数,使得数据被初始化为0,1,2,3

 

假如这样呢?结果会是什么?

 

结果:

1

2

3

4

this is father public  method!!

this is father protected method!!

this is father default method!!

this is father private method!!

 因为这里我们把this()给屏蔽掉了,不能使用无参的构造函数,在有参的构造函数中把数据给赋值了

 

 

 

 

 

super:1.本类的父类对象(通常用在在子类中调用父类的方法)

      2.在子类构造方法中调用父类的构造方法

      3.在子类继承父类的方法时,也可以调用父类本方法

      在使用super()时,必须在本函数的第一行

 

package one;

public class Father {
	public int numPublic;
	protected int numProtected;
	int numDefault;
	private int numPrivate;
	public String name;

	public Father(int numPublic, int numProtected,
			int numDefault, String name) {
		// this();

		// 本类默认对象调用属性
		this.numPublic = numPublic;
		this.numProtected = numProtected;
		this.numDefault = numDefault;
		this.numPrivate = numPrivate;
		this.name = name;
		System.out.println(this.numPublic);
		System.out.println(this.numProtected);
		System.out.println(this.numDefault);
		
		System.out.println(this.name);
		// 本类默认对象调用方法
		
	}

	public Father() {
		numPublic = 0;
		numProtected = 1;
		numDefault = 2;
		numPrivate = 3;
	}

	public void putOut() {
		System.out.println("this is father public  method!!");
	}

	protected void putOut1() {
		System.out.println("this is father protected method!!");
	}

	void putOut2() {
		System.out.println("this is father default method!!");
	}

	private void putOut3() {
		System.out.println("this is father private method!!");
	}

}







package one;

public class Son extends Father {

	private int num1;
	private int num2;
	private int num3;
	private int num4;
	private String name;

	public Son(int num1, int num2, int num3,String name ,int num4
			) {

		super(num1, num2, num3, name);

		this.num4 = num4;
		System.out.println("the num4 of son"+this.num4);

	}

	public static void main(String[] args) {
		new Son(1, 2, 3, "jake", 4);
	}

}

输出的结果为:
1
2
3
jake
the num4 of son4


因为

super(num1, num2, num3, name);这行代码调用了父类的构造方法,用父类的构造方法给变量赋值

<!--EndFragment-->

 

 

重点难点:static 静态修饰符

Static的作用:可修饰类  属性  方法  代码块(被修饰后的代码块我们又叫做静态块)。

下面我们讨论static的用法。

Static修饰类:般情况下是不可以用static修饰类的。
如果一定要用static修饰类的话,通常static修饰的是内部类。static修饰的内部类可以直接作为一个普通类来使用,而不需实例一个外部类

请看代码:

public class One {

	
	
	public static void main(String[] args) {

	}






	public static class A {

		public A() {
			System.out.println("静态内部类的构造方法");
		}

		public void putOut() {
			System.out.println("静态类的方法");
		}

	}






public class B {

		public B() {
			System.out.println("普通内部类");
		}

	}
}












public class Test1 {

	public static void main(String[] args) {

		//static修饰内部静态类的用法
		One.A testStatic = new A();
		testStatic.putOut();

		//普通内部类要用这种方法声明
		One oneObject = new One();
		B test2 = oneObject.new B();
          }

}
		

 

static 修饰属性 静态属性 在使用时不管在那里改变它的值,它的值都会被改变,这里涉及到静态装载的问题。在该类使用时,静态的方法,属性,代码块都会被放在一块静态空间。在对象创建之前,这些静态的属性方法代码块就已经在内存中存在。此属性都在同一个地址上因此无论是通过类名.属性,或者是对象名.属性,改变静态属性的值,都会使它的值改变。因此在使用静态变量时要谨慎。

Static 修饰方法:用static修饰的方法在调用时既可以使用对象+方法名,也可以使用类名+方法名。

代码:

public class One {


       //用static修饰属性
	public static String name = "静态的变量";

	// 用static修饰方法
	public static void staticMethod() {

		System.out.println("静态的方法");

	}
}











public class Test1 {

	public static void main(String[] args) {

              One oneObject = new One();

             //static修饰属性和方法
		System.out.println(One.name);
		

                 //两种方式调用静态方法
		oneObject.staticMethod();
		One.staticMethod();
            }
}

 

static 修饰代码块  代码在进行类的装载的时候就会运行。我们在声明一个对象时静态块就会执行。而单纯的代码块,只有在为对象new出内存空间的时候(对象创建)才会执行。

 

public  class One {
	
	
	static{
		System.out.println("这是静态块");
	}
	
	{
		System.out.println("这是默认的代码块");
	}
	
	public static void main(String[] args) {
		

	}
	
}





public class Test1 {

		 public static void main(String[] args) {

		One oneObject;
		 }
	}
运行后出现的结果为:
    这是默认的代码块


public class Test1 {

		 public static void main(String[] args) {
                        
                      One oneObject = new One();
                 }
    }


运行后出现的结果为:
    这是静态块
 

 

 

static总结:static之所以会有这样的特性,我们要从内存上和类的装载上进行理解。假如一个类中有被修饰的属性,方法,代码块,类会创建一个静态内存空间,将这些被静态的修饰的放进这个内存空间。而写该类的所有对象相应的属性,方法,代码块都会指向这片内存空间。

 

 

为了更好的理解static静态装载,下面我们来看两个程序

 猜一猜输出的结果

package two;

public class Frist {

	
	public Frist() {
		System.out.println("Frist");
	}

	
}

package two;

public class Second extends Frist{

	
	public Second() {
		super();
		System.out.println("Second");
	}

	
}


package two;

public class Third {

	public static Frist frist=new Frist();
	public Second second=new Second();
	
	static{
		System.out.println("静态块of Third");
	}
	
	public static void main(String[] args) {
		
		Second t=new Second();
	

	}

}
 结果:
Frist
静态块of Third
Frist
Second

 为什么会出现这样的输出结果呢?

 

这跟类的装载顺序有关,装载的顺序为:

1,静态属性

2,静态块

3,静态方法

因为静态方法main在最后才装载,最后创建了Second的对象。

留个悬念给读者假如将Second t=new Second();改为Third ti=new Third();后运行的结果是什么呢???

 

 

  • 大小: 50.8 KB
  • 大小: 19.5 KB
  • 大小: 49.3 KB
  • 大小: 48.6 KB
  • 大小: 47 KB
  • 大小: 11.4 KB
分享到:
评论

相关推荐

    Java中final关键字的深入探究

    本文将深入探讨`final`关键字在Java中的应用及其背后的原理。 首先,`final`关键字用于修饰变量时,主要有两种情况: 1. **修饰基本数据类型变量**:一旦一个基本数据类型的变量被`final`修饰,它的值在初始化后便...

    Java学习教程-探究JAVA线程状态及转化视频

    本教程将深入探讨Java线程的五种基本状态以及它们之间的转换。 1. **新建(New)**:当使用`Thread`类的构造函数创建一个线程对象时,线程处于新建状态。此时,线程尚未启动,只是存在于内存中。 2. **就绪...

    Java多线程同步问题的探究.pdf

    总之,Java多线程同步问题的探究是一个复杂而深入的话题,涉及了synchronized关键字、JDK 5的高级锁机制、ThreadLocal的线程局部存储以及JVM的线程管理等多个方面。了解这些知识点,对于深入理解Java多线程编程和...

    java lecture note(Java学习笔记)

    本篇Java学习笔记旨在为读者提供一个深入理解Java的基础与进阶知识的框架,帮助初学者及有一定经验的开发者提升Java编程技能。 ### 一、Java入门与基本语法 #### 课程概述 Java课程旨在介绍面向对象编程的基本原则...

    JAVA思维导图9张!

    【Java思维导图9张!...每一张图都是一个独立的主题,可以作为学习和复习的起点,引导深入探究每个领域的细节。对于那些希望通过可视化方式加强记忆和理解的开发者来说,这是一个非常有效的学习工具。

    Java SE 源码 Java SE 源码

    在这个压缩包中,你可能找到了Java SE的原始源代码,这将允许你深入探究这个强大的编程语言的内部机制。 1. **类库解析**:Java SE源码涵盖了核心类库,如`java.lang`、`java.util`、`java.io`等。这些类库提供了...

    名师讲坛——Java开发实战经典 带详细书签目录版

    8. **反射机制**:探究Java运行时动态加载类、方法和字段的能力,以及其在元编程中的应用。 9. **泛型**:理解泛型的引入,如何使用泛型类、泛型方法,以及泛型通配符的使用。 10. **Java Swing和AWT**:基础的GUI...

    Java 语言程序设计-进阶篇(原书第10版).pdf

    Java是一种纯面向对象的语言,因此,对类、对象、继承、多态、封装等概念的深入探究至关重要。本书可能会详细介绍抽象类、接口、内部类以及匿名类的使用场景和设计模式。此外,还会涉及访问修饰符的作用,以及如何...

    Java语言程序设计.进阶篇.原书第10版

    《Java语言程序设计.进阶篇.原书第10版》是一本广泛认可的Java编程教程,旨在帮助读者深入理解和掌握Java编程的高级...该书的超高清正版内容下载,将为学习过程提供清晰易读的体验,助力读者深入探究Java编程的世界。

    2022年java学习心得体会_JAVA实训的心得.docx

    从理解基本语法到深入探究面向对象编程,再到熟练运用类库和处理异常,每一步都需要付出时间和努力。同时,良好的学习习惯,如主动思考、动手实践和不断反思,将极大地促进学习效果。在面对未来的考试或实际项目时,...

    五子棋源码JAVA,可视化界面

    【标题】:“五子棋源码JAVA,可视化界面”是一个基于Java编程语言开发的桌面游戏项目,它提供了用户...通过阅读和理解源码,开发者不仅可以学习到如何构建一个完整的应用程序,还能深入探究Java编程语言的特性和应用。

    java基础讲课安排

    1. **对象的本质**:深入理解面向对象编程的核心概念。 2. **类与对象**:探讨类的定义、对象的创建与使用。 3. **面向对象思想**:如何在实际编程中应用面向对象的原则。 4. **类的设计**:讨论设计类的基本原则,...

    深入探究Java多线程并发编程的要点

    本文将深入探讨Java多线程并发编程的要点,特别是关键字`synchronized`的使用以及`wait()`与`notify()`在获取对象锁方面的三种方式。 `synchronized`关键字在Java中用于实现线程同步,它可以修饰方法或代码块,以...

    JAVA毕业设计项目CD 源代码

    这个项目CD包含源代码,意味着我们可以深入探究项目的实现细节,学习到如何将理论知识转化为实际工程应用。下面将详细介绍可能涉及的Java编程知识点: 1. **基础语法**:Java的基础语法包括数据类型、变量、运算符...

    Java模拟测验+答案编程资料JAVA-内存模型编程资料java模拟测验型及作业编程资料java模拟测验库编程资料java判断题

    - 第二周:深入学习Java基础语法。 - **类之间的关系**:了解类之间的关联、聚合、继承、实现和多态等概念及其应用。 - **基本数据类型**:掌握整数型、浮点型、字符型和布尔型等基本数据类型的使用。 - **逻辑...

    java深度历险

    在《Java深度历险》这本书中,读者将深入探究这些主题,通过实例分析和实战演练,掌握Java核心技术。书中可能还会涉及编译过程、异常处理、多线程、反射等高级话题,帮助开发者从底层到应用层全面理解Java,提升编程...

    java面试评价表

    - **synchronized与volatile的区别**:对比这两种关键字的特点及应用场景,讨论锁粒度、死锁模拟、原子性与可见性的概念。 #### 三、JVM相关 - **JVM内存模型**:介绍JVM的内存分配机制,包括堆、栈、方法区等...

    JAVA认证历年真题:SCJP考试真题和解析(1).doc

    Java认证,全称为Sun Certified Programmer for the Java 2 Platform,Standard Edition (SCJP),是针对Java SE编程...在复习过程中,不仅要理解答案,还要深入探究每个选项背后的原理,这样才能在实际编程中灵活应用。

Global site tag (gtag.js) - Google Analytics