关键字总结
Java语法基础篇之关键字总结:
Java的关键字有很多,下面我们主要探讨
访问限定符:public protected private 和默认的访问限定。还有this,super ,final,static这几个比较神秘的关键字。
(一)首先我们来探讨访问限定符,我们分别从修饰类,属性,方法,构造方法这四点来讨论他们的用法。
修饰类时:
使用权限
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去掉,会报错说明上述探究成立。
证明:默认的(即类前不加修饰符): 在一个包中才可以被访问
(二),下面我们讨论super和this。
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(); } }结果:
相关推荐
本文将深入探讨`final`关键字在Java中的应用及其背后的原理。 首先,`final`关键字用于修饰变量时,主要有两种情况: 1. **修饰基本数据类型变量**:一旦一个基本数据类型的变量被`final`修饰,它的值在初始化后便...
本教程将深入探讨Java线程的五种基本状态以及它们之间的转换。 1. **新建(New)**:当使用`Thread`类的构造函数创建一个线程对象时,线程处于新建状态。此时,线程尚未启动,只是存在于内存中。 2. **就绪...
总之,Java多线程同步问题的探究是一个复杂而深入的话题,涉及了synchronized关键字、JDK 5的高级锁机制、ThreadLocal的线程局部存储以及JVM的线程管理等多个方面。了解这些知识点,对于深入理解Java多线程编程和...
本篇Java学习笔记旨在为读者提供一个深入理解Java的基础与进阶知识的框架,帮助初学者及有一定经验的开发者提升Java编程技能。 ### 一、Java入门与基本语法 #### 课程概述 Java课程旨在介绍面向对象编程的基本原则...
【Java思维导图9张!...每一张图都是一个独立的主题,可以作为学习和复习的起点,引导深入探究每个领域的细节。对于那些希望通过可视化方式加强记忆和理解的开发者来说,这是一个非常有效的学习工具。
在这个压缩包中,你可能找到了Java SE的原始源代码,这将允许你深入探究这个强大的编程语言的内部机制。 1. **类库解析**:Java SE源码涵盖了核心类库,如`java.lang`、`java.util`、`java.io`等。这些类库提供了...
8. **反射机制**:探究Java运行时动态加载类、方法和字段的能力,以及其在元编程中的应用。 9. **泛型**:理解泛型的引入,如何使用泛型类、泛型方法,以及泛型通配符的使用。 10. **Java Swing和AWT**:基础的GUI...
Java是一种纯面向对象的语言,因此,对类、对象、继承、多态、封装等概念的深入探究至关重要。本书可能会详细介绍抽象类、接口、内部类以及匿名类的使用场景和设计模式。此外,还会涉及访问修饰符的作用,以及如何...
《Java语言程序设计.进阶篇.原书第10版》是一本广泛认可的Java编程教程,旨在帮助读者深入理解和掌握Java编程的高级...该书的超高清正版内容下载,将为学习过程提供清晰易读的体验,助力读者深入探究Java编程的世界。
从理解基本语法到深入探究面向对象编程,再到熟练运用类库和处理异常,每一步都需要付出时间和努力。同时,良好的学习习惯,如主动思考、动手实践和不断反思,将极大地促进学习效果。在面对未来的考试或实际项目时,...
【标题】:“五子棋源码JAVA,可视化界面”是一个基于Java编程语言开发的桌面游戏项目,它提供了用户...通过阅读和理解源码,开发者不仅可以学习到如何构建一个完整的应用程序,还能深入探究Java编程语言的特性和应用。
1. **对象的本质**:深入理解面向对象编程的核心概念。 2. **类与对象**:探讨类的定义、对象的创建与使用。 3. **面向对象思想**:如何在实际编程中应用面向对象的原则。 4. **类的设计**:讨论设计类的基本原则,...
本文将深入探讨Java多线程并发编程的要点,特别是关键字`synchronized`的使用以及`wait()`与`notify()`在获取对象锁方面的三种方式。 `synchronized`关键字在Java中用于实现线程同步,它可以修饰方法或代码块,以...
这个项目CD包含源代码,意味着我们可以深入探究项目的实现细节,学习到如何将理论知识转化为实际工程应用。下面将详细介绍可能涉及的Java编程知识点: 1. **基础语法**:Java的基础语法包括数据类型、变量、运算符...
- 第二周:深入学习Java基础语法。 - **类之间的关系**:了解类之间的关联、聚合、继承、实现和多态等概念及其应用。 - **基本数据类型**:掌握整数型、浮点型、字符型和布尔型等基本数据类型的使用。 - **逻辑...
在《Java深度历险》这本书中,读者将深入探究这些主题,通过实例分析和实战演练,掌握Java核心技术。书中可能还会涉及编译过程、异常处理、多线程、反射等高级话题,帮助开发者从底层到应用层全面理解Java,提升编程...
- **synchronized与volatile的区别**:对比这两种关键字的特点及应用场景,讨论锁粒度、死锁模拟、原子性与可见性的概念。 #### 三、JVM相关 - **JVM内存模型**:介绍JVM的内存分配机制,包括堆、栈、方法区等...
Java认证,全称为Sun Certified Programmer for the Java 2 Platform,Standard Edition (SCJP),是针对Java SE编程...在复习过程中,不仅要理解答案,还要深入探究每个选项背后的原理,这样才能在实际编程中灵活应用。