实训笔记6.6

实训笔记6.6

  • 6.6
    • 一、座右铭
    • 二、知识回顾
      • 1、方法和构造方法
        • 1.1 Java方法
        • 1.2 Java构造方法(构造器)
    • 三、类中的代码块
      • 3.1 代码块的概念和声明语法
      • 3.2 代码块的分类
      • 3.3 代码块调用本类属性和方法的问题
    • 四、final修饰的常量属性问题
      • 4.1 问题出现的缘由
      • 4.2 常量属性的手动赋值的位置
      • 4.3 代码块的使用场景
    • 五、类的第五大组成成分-内部类
      • 5.1 内部类的定义和语法
        • 5.1.1 内部类的声明语法
      • 5.2 内部类的分类-内部类的加载时机是和对象以及外部类的加载时机有关系的
      • 5.3 内部类如何使用
      • 5.4 内部类的高级使用方式:Java继承概念有关系的
    • 六、面向对象中常用两个关键字:package和import
      • 6.1 package关键字
      • 6.2 import关键字
    • 七、Java面向对象的三大特征之一:继承性
      • 7.1 概念
      • 7.2 继承的语法
      • 7.3 继承中的属性问题
      • 7.4 继承中方法问题

6.6

一、座右铭

我的故事你说,我的文字我落,我值几两你定,我去何方我挑。

二、知识回顾

1、方法和构造方法

1.1 Java方法

  1. 方法的声明和调用方式
  2. 方法的分类
  3. 方法的返回值问题
  4. 方法名
  5. 方法的形参列表问题
  6. 方法的重载问题
  7. 方法的JVM内存问题(方法的声明时机、方法的调用内存)
  8. 方法和方法之间可以相互调用的

1.2 Java构造方法(构造器)

  1. 构造器的声明和调用方法
  2. 默认构造器的问题
  3. 构造参数的问题
  4. 构造器的JVM内存问题(声明时机、调用时机)

三、类中的代码块

3.1 代码块的概念和声明语法

代码块是类中唯一的一段可以自动执行的代码区域,代码块中内容我们无法手动调用执行,只能让其自动执行。

  • 声明

[static] {

代码块体;

}

【注意】

  1. 在一个类当中可以存在多个代码块,多个代码块再执行的时候会从上而下依次执行。

    package codeblock;
    
    public class Demo01 {
    	{
    		System.out.println("第一个非静态代码块");
    	}
    	
    	static {
    		System.out.println("第一个静态代码块");
    	}
    	
    	{
    		System.out.println("第二个非静态代码块");
    	}
    	
    	static {
    		System.out.println("第二个静态代码块");
    	}
    	
    	public Demo01() {
    		System.out.println("构造器执行了");
    	}
    	public static void main(String[] args) {
    		Demo01 d = new Demo01();
    		Demo01 d1 = new Demo01();
    	}
    }
    
    

3.2 代码块的分类

  • 非静态代码块:

    调用任何一种构造方法构建对象之前先会执行一次非static的代码块,非静态代码块调用一次构造函数执行一次

    执行时机:构造函数执行之后、构造体执行之前

  • 静态代码块:
    在类加载的时候就会执行静态代码块。静态代码块只有在类加载的时候会执行一次,以后就再也不执行了。

3.3 代码块调用本类属性和方法的问题

非静态代码块可以调用所有的属性和方法

静态代码块只能调用static的属性和方法

四、final修饰的常量属性问题

4.1 问题出现的缘由

Java中属性又名成员变量,而变量必须初始化之后才能使用,局部变量必须得手动初始化才能使用,属性可以不用手动初始化,因为JVM内存在类加载或者创建对象的时候会给没有初始值的属性赋予一个默认值,通过默认值完成初始化过程。

虽然属性没有被赋值的时候内存会自动初始化,赋予默认值,但是final修饰的属性不在此JVM自动初始化行列之内。因为final修饰的属性不可变更值,如果final修饰的属性是一个引用数据类型,按道理会赋予null值,但是null值因为final原因不可更改,导致NullPoniterException的产生。

4.2 常量属性的手动赋值的位置

常量数据又分为静态常量属性和非静态常量属性

  • 静态常量属性可以在两个位置进行初始化操作:

    1. (1)声明的时候直接赋值
    2. (2)静态代码块当中
  • 非静态常量属性可以三个位置进行初始化操作:

  1. (1)声明的时候直接赋值
  2. (2)非静态代码块赋值
  3. (3)构造器中进行赋值

4.3 代码块的使用场景

如果类中存在常量属性、常量属性需要赋值操作才能使用,赋值操作一般都建议在代码块中赋值使用。

五、类的第五大组成成分-内部类

5.1 内部类的定义和语法

内部类是声明在类中的一个类,内部类是用来扩充外部类的功能的。

5.1.1 内部类的声明语法

访问控制修饰符 [static|final] class 类名 {

类体:类的五大组成成分

}

5.2 内部类的分类-内部类的加载时机是和对象以及外部类的加载时机有关系的

静态内部类:外部类加载的时候会加载。

非静态内部类:外部类创建对象的时候才会加载,非静态内部类中不能存在静态内容。

5.3 内部类如何使用

静态内部类的创建对象方式:

new 外部类.内部类(实参);

//静态内部类创建对象
InnerClass02 i1 = new  OuterClass.InnerClass02();

非静态内部累的创建对象方式

new 外部类().new 内部类(实参);

//非静态内部类创建对象
InnerClass01 i = new OuterClass().new InnerClass01();

5.4 内部类的高级使用方式:Java继承概念有关系的

内部类也可以声明在方法内部

六、面向对象中常用两个关键字:package和import

6.1 package关键字

package是Java中的包,包就等同于一种文件夹,是用于分类存放不同类型的代码的。在Java中一旦把一个类声明到某一个包下,那么会在这个类的首行使用package包名.包名……的形式声明类是这个包下的类。

在Java当中,包名是可以多个层级的,包下可以有类,也可以有另外一个包。

JRE,Java运行时环境,包含了JVM以及Java的基本类库-Java提供的一些常用类,常用类库都在rt.jar压缩包当中,

  • java.lang—Java常用工具类
  • java.util----Java集合常用类
  • java.io----Java I0流常用类
  • java.sql----JDBC常用类
  • java.lang.reflect—java反射代码

【注意】

  1. 同一个包下不允许出现重名的类,但是不同的包下允许出现重名类
  2. 我们在创建Java代码的时候,创建包的时候,包是有一个起名的规则,必须先在项目定义两个层级包,层级包是用于告诉别人这个代码是谁或者哪个组织写的,包一般是我们公司或者组织、个人域名的倒写。

6.2 import关键字

在Java当中,编写代码的时候,经常会遇到使用自己编写的其他类,或者JRE提供的基本类库、或者是第三方给我们提供的代码,但是这些代码可能不在同一个包下,如果我们要使用不同包下的代码,必须在当前类的package声明之下,class声明之前使用import全限定类名的方式将这个类导入到我们的当前类中,我们才能去使用

全限定类名就是包名.包名.xxxx.类名

Java中声明的每一个类,默认会给我们导入两个包,这两个包不需要我们手动导入,全自动化完成,本类所在的包、java.lang包

import xxx.*: 将xxx包下的所有Java类给导入进来,xxx包下的子包中的内容不会引入进来。

七、Java面向对象的三大特征之一:继承性

7.1 概念

继承是Java用于解糊合的一种手段,如果多个类当中出现了重复性的行为方法,那我们就可以把这些方法抽取到一个父类当中,然后由子类去继承父类,子类一旦继承父类之后,子类就会拥有父类中声明的这些方法(不一定是所有的)。

7.2 继承的语法

class Son extends Father{

}

【注意点】:Java是单继承的,一个字类只能继承一个父类,但是Java支持多层继承,子类继承父类、父类继承另外一个父类,那么子类会同步继承另外一个父类的能力.

7.3 继承中的属性问题

属性可以被子类继承的,子类能不能有一个和父类同名的属性?

子类可以拥有和父类重名的属性,默认情况下使用子类的属性,如果子类要使用父类的属性,必须使用super.属性名的方式调用父类的属性名,但是有一个前提,super关键字不能使用在static方法中。

最好不要存在和父类同名的属性。

	public void print(String name) {
		System.out.println(name);//输出的距离最近的局部变量
		System.out.println(this.name);//输出的是本类的属性
		System.out.println(super.name);//输出的是父类的属性
	}

7.4 继承中方法问题

子类可以继承父类的方法,子类也可以有自己的方法。

子类如果继承父类的方法时,觉得父类的方法不满足我的需求,可以在满足某种规则的前提下将父类的方法给重写了。

子类也具备这个能力,只不过就是父类方法中定义的方法体不满足子类的要求,所以子类需要把父类定义的方法的方法体给修改了。这样的方法成为方法重写;

一旦方法重写了,方法上最好加上一个@Override注解。

重写方法必须满足以下几个规则:

  1. 必须位于子类和父类中,而且是子类重写父类的方法

  2. 子类的方法名以及方法的参数列表、方法的返回值类型必须和父类保持一致

    	@Override
    	public void shouted() {
    		System.out.println("狗汪汪汪 啊呜的叫");
    	}
    

你可能感兴趣的:(实训,笔记,jvm,java)