java基础笔记009—内部类+关键字
今日内容1. 【理解】什么是内部类 2. 【掌握】匿名内部类 4. 【理解】final关键字的使用 5. 【理解】包的定义及使用 6. 【理解】权限修饰符 7. 【掌握】static关键字的使用一、内部类 1.1概念
内部类A就是定义在一个类B里面的类,A就是B的内部类,B是A的外部类
public class B{
public class A{ //成员内部类
}
public void method(){
class D{ //局部内部类
}
}
}
class C{ //C不是B的内部类,同级类
}
1.2内部类分类
1.2.1成员内部类1、成员内部类 2、局部内部类 3、匿名内部类
- 定义及格式
定义在一个类的类里,方法外的类就是成员内部类。
class B{
class A{
}
}
- 成员内部类特点
1.成员内部类中可以直接访问外部类成员,包括私有成员。 2.外部类要访问成员内部类的成员,必须创建内部类对象。 3.成员内部类可以在外部类、其他类中创建使用。
-
成员内部类的对象创建
-
在它的外部类,正常使用
成员内部类名 变量名 = new 成员内部类名();
-
在其他类中
外部类.内部类 变量名 = new 外部类().new 内部类();
-
-
成员内部类编译生成的.class文件格式
也会生成独立class文件,但会在前面加上外部类名,固定格式:外部类名$内部类名.class
- 定义及格式
定义在类中的普通方法中的类就是局部内部类。
public class B{
public void method(){
int i = 9;
class A{ //A就是B的局部内部类
}
}
}
-
局部内部类的特点
1.局部内部类和局部变量一样,定义在类中方法里 2.局部内部类随着方法的创建而创建,当方法执行完毕后将被回收 3.局部内部类只能在定义它的方法中创建对象并使用 4.局部内部类中同样可以操作外部类的所有成员,包括私有
-
局部内部类的对象创建
局部内部类只能在定义它的方法中创建对象并使用public class B{ public void method(){ int i = 9; class A{ //A就是B的局部内部类 public void show(){ System.out.println("局部内部类方法执行……"); } } //在方法中创建并使用局部内部类对象 A a = new A(); a.show(); } }
-
定义及格式
匿名内部类就是实现/重写了父接口或父类的匿名子类对象。//格式 父类/父接口 变量名 = new 父类/父接口(){ //重写方法 ...... };以接口为例:
//接口 public interface B{ void show(); } //测试类的main方法 public class Test{ public static void main(String[] args){ B b = new B(){ //实现接口B方法 public void show(){ System.out.println("匿名内部类方法执行……"); } }; } } -
匿名内部类的特点
1.匿名内部类必须是对父类或父接口声明的变量的赋值。 2.当是父类声明变量使用匿名内部类赋值时,变量只能操作父类属性和匿名内部类重写的方法,当然,父类中原有的非抽象方法就算没有重写,也能通过该变量调用。子类特有方法不能调用。 3.当是父接口声明变量使用匿名内部类赋值时,变量只能操作匿名内部类实现的接口方法,当然,接口原有的静态方法和默认方法就算没重写,也能通过该变量调用。子类特有方法不能调用。 4.本质与就是多态。
2.2final使用 2.2.1修饰类final 关键字,有道释义:最终的。可以用来修饰类、方法、和变量。
-
修饰的类,不能被继承。且不能修饰抽象类和接口。
-
格式
final class{ }
-
修饰的方法,可以被继承,不能被重写。且不能修饰抽象方法。
-
格式
访问权限修饰符 final 返回值类型 方法名(){ 方法体 }
-
修饰的变量,叫做自定义常量,
-
1.修饰局部变量–基本数据类型,只能赋值一次,再赋值会报错,可声明时赋值,也可声明后赋值。
public class A{ public void show(){ final int a = 9; final int b; b=3; //a=1; 再次赋值,报错,下同 //b=4; } } -
2.修饰成员变量–基本数据类型,只能赋值一次,再赋值报错,赋值方法有三种
//1.赋值方法一,声明时赋值,最常用 public class A{ final int a = 9; } //2.构造方法中赋值,这里需要将所有自定义构造方法都对该自定义常量进行赋值。 public class A{ final int a; public A(){ a=9; } public A(int a){ this.a = a; } } //3.静态代码块赋值,但final关键字前要加static public class A{ static final int a; static { a = 5; } } -
修饰引用数据类型,同样只能赋值一次,但引用数据类型存储涉及栈、堆、方法区(包含常量池),所以引用数据变量(栈中)存放的堆中地址不能改变,但堆中存放的常量池的内容可以改变。
public class A{ public void show(){ final B b = new B(); //b = new B(); 报错 b.属性1 = 4; //不报错 b.属性1 = 6; //不报错 } }
-
包:本质上就是文件夹
- 创建包:(单级包、多级包)
- 多级包之间使用 " . " 进行分割
- 多级包的定义规范:公司的网站地址翻转(去掉www)
- 包的命名规则:字母都是小写
www.baidu.com --> com.baidu.模块功能的名称
com.baidu.当前的项目的名称.模块功能的名称
四、访问权限修饰符 4.1四种访问权限修饰符访问权限由大-------------------->小
公共的public 受保护的protected 默认的 私有的private
4.2访问权限控制范围| 访问权限修饰符修饰属性或方法时 | 当前类 | 同package | 子孙类 | 其他package |
|---|---|---|---|---|
| public / 公共的 | √ | √ | √ | √ |
| protected / 受保护的 | √ | √ | √ | ×(子孙类可访问) |
| 不写,默认访问权限修饰法 | √ | √ | √(不同包时不可访问) | × |
| private / 私有的 | √ | × | × | × |
5.2static的使用 5.2.1修饰变量static 静态的,可修饰变量,方法,静态代码块,表示是类的,static修饰的内容只在使用被创建,方法方法区中,所有该类对象共享。
-
修饰变量,称为静态变量,可以被(类名.变量名)直接使用,所有该类对象共享。
public class A{ static int a = 9; } //测试类 public class Test{ public static void main(String[] args){ A a1 = new A(); A a2 = new A(); //一下三种调用都对,且对静态变量a造成的操作是相互叠加的。 a1.a = 8; a2.a = 4; A.a = 1; } }
-
修饰方法,称为静态方法,可以被(类名.方法)直接使用,所有该类对象共享,不能被子类重写。
public class A{ public static void show(){ System.out.println("静态方法……"); } } //测试类 public class Test{ public static void main(String[] args){ A a1 = new A(); A a2 = new A(); //一下三种调用都对。 a1.show(); a2.show(); A.show(); } }
-
修饰代码块(即一个花括号{}中的代码集合),称为静态代码块,类第一次使用时加载,且只加载一次。
public class A{ //静态代码块 static { 代码块; } }
- 静态方法只能调用静态方法和静态成员变量,不能调用普通方法和普通成员变量。
- static修饰的部分都是在类加载时执行一次,所有该类对象共享。
- static修饰内容存储结构,参考:从内存角度理解static与final关键字 - 简书
参考: java创建对象时类的加载顺序_samuBO的博客-CSDN博客
|父类静态变量 or 父类静态代码块 [看位置,顺序执行,从上往下]
| 子类静态变量 or子类静态代码块 [看位置,顺序执行,从上往下]
| 父类非静态变量 or 父类非静态代码块[看位置,顺序执行,从上往下]
| 父类构造方法
| 子类非静态变量 or 子类非静态代码块[看位置,顺序执行,从上往下]
| 子类构造方法
java基础笔记008



