package-内部类-四种权限修饰符
包的定义及注意事项
-
定义包的格式
- package 包名
- 多级包用.分开即可
-
定义包的注意事项
-
package语句必须是程序的第一条可执行的代码
-
package语句在一个Java文件中只能有一个
-
如果没有package,默认表示无包名
package com.heima;
class Demo_package {
public static void main(String[] args) {
System.out.println("hahaha");
}
}
-
-
如何编译运行带包的类?
-
1、Javac编译的时候带上-d即可:javac -d . HelloWord.Java
-
2、通过Java命令执行:Java 包名.HelloWord
package com.heima;
import com.baidu.Person; //在开发中都是导入具体的类
class Demo_package {
public static void main(String[] args) {
Person p = new Person("张三",23);
System.out.println(p.getName() + "------" + p.getAge());
}
}另一个.class文件
package com.baidu;
public class Person {
private String name;
private int age;public Person() {}
public Person(String name,int age) {
this.name = name;
this.age = age;
}public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
-
四种权限修饰符的测试
四种访问修饰符的权限:
本类 同一个包下(子类和无关类) 不同包下(子类) 不同包下(无关类)
private Y
默认 Y Y
protected Y Y Y
public Y Y Y Y
类及其组成所使用的常见修饰符
类及其组成所使用的常见修饰符
1、修饰符:
(1)权限修饰符:private,默认的,protected,public
(2)状态修饰符:static,final
(3)抽象修饰符:abstract
2、类:
(1)权限修饰符:默认的,public
(2)状态修饰符:final
(3)抽象修饰符:abstract
*用的最多的是:public
3、成员变量:
(1)权限修饰符:private,默认的,protected,public
(2)状态修饰符:static,final
*用的最多的是:private
4、构造方法:
(1)权限修饰符:private,默认的,protected,public
*用的最多的是:public
5、成员方法:
(1)权限修饰符:private,默认的,protected,public
(2)状态修饰符:static,final
(3)抽象修饰符:abstract
*用的最多的是:public
6、除此以外的组合规则:
(1)成员变量:public static final
(2)成员方法:public static
public abstract
public final
内部类概述及访问特点
-
内部类与外部类的访问
class InnerClass {
public static void mian(String [] agrs) {//外部类名.内部类名 = 外部类对象.内部类对象
Outer.Inner oi = new Outer().new Inner();//创建内部类对象
oi.method();
}}
class Outer { //外部类
private int num = 10; //内部类 可以直接访问外部类的成员,包括私有
class Inner { //内部类
public void method() {
System.out.println(num);
}
}
}输出结果:10
-
成员内部类私有使用
class InnerClass {
public static void main(String [] agrs) {
Outer o = new outer();
o.print();
}
}
class Outer {
private int num = 10;
private class Inner { //私有化
public void method() {
System.out.println(num);
}
}public void print() { //内部类私有的访问方法 通过创建外部类里的访问方法
Inner i = new Inner();
i.method();
}
}输出结果:10
-
静态成员内部类
class InnerClass {
public static void mian(String [] agrs) {
//外部类名.内部类名 对象名 = 外部类名.内部类对象
// Outer.Inner oi = outer.new Inner(); 一般会把new提前
Outer.Inner oi = new Outer.Inner();//创建内部类对象
oi.method();Outer.Inner2.print();
}
}
class Outer { //外部类
static class Inner { //静态内部类 非静态方法
public void method() {
System.out.println("method");
}
}static class Inner2 { //静态内部类 静态方法
public static void print() {
System.out.println("print");
}
}
}
成员内部类的面试题
要求在填空输出语句,在控制台输出30, 20, 10
class Test_Innerclass {
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
}
}
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(outer.this.num);
}
}
}
局部内部类访问局部变量的问题(很少出现)
Class InnerClass {
public static void main(String [] agrs) {
Outer o = new Outer();
o.method();
}
}
//局部内部类
class Outer {
public void method() {
final int num = 10;
class Inner {
public void print() {
System.out.println(num);
}
}
Inner i = new Inner();
i.print(); //局部内部类只能在其所在的方法中访问
}
}
输出结果:10
1、局部内部类访问局部变量必须用final修饰
2、局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?
答:因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用 但是JDK1.8取消了这个事情,所以我觉得这是个bug
匿名内部类
-
匿名内部类的格式和理解
class Outer {
class Inner implements Inter {
public void print() {
System.out.println("print");
}
}public void method() {
new Inter() { //实现Inter接口
public void print() { //重写抽象方法
System.out.println("print");
}
}.print();
}
} -
匿名内部类重写多个方法调用
- 匿名内部类只针对重写一个方法时候使用
- 如果重写多个方法,子类要重写多次
-
匿名内部类在开发中的应用
有名字的来做
class Test {
public static void main(String[] args) {
PersonDemo pd = new PersonDemo();
pd.method(new Student());
}
}//这里写抽象类,接口都行
abstract class Person {
public abstract void show();
}class PersonDemo {
public void method(Person p) { //Person p = new Student();
p.show();
}
}class Student extends Person {
public void show() {
System.out.println("show");
}
}用匿名来做
class Test {
public static void main(String[] args) {
PersonDemo pd = new PersonDemo();
pd.method(new Person() { //匿名内部类当作参数传递(本质把匿名内部类看做一个对象)
public void show() {
System.out.println("show");
}
});
}
}//这里写抽象类,接口都行
abstract class Person {
public abstract void show();
}class PersonDemo {
/Person p = new Person() { //父类引用指向子类对象
public void show() {
System.out.println("show");
}
}/
public void method(Person p) {
p.show();
}
}class Student extends Person {
public void show() {
System.out.println("show");
}
}
匿名内部类的面试题
按要求补全代码,在控制台输出HelloWord!
class Test {
public static void main(String[] args) {
Outer.method().show();
//链式编程,每次调用方法后还能继续调用方法,证明调用方法返回的是对象
//这里可以写成:Inter i = Outer.method();
i.show();
}
}
interface Inter {
void show();
}
class Outer {//补全代码
public static Inter method() {
return new Inter() {
public void show() {
System.out.println("Helloword!");
}
}
}
}

浙公网安备 33010602011771号