包的作用和特点
包的特点:可以有多层
不同包下的文件名可以重复
包的声明必须是第一行代码
不同包之间的互相访问
使用类的全名
使用关键字import将类导入
注意:*代表的是通配符,代表导入了这个包下所有的类,并没有导入子包下的类
类的全名:包名.类名
权限修饰符
public
default
private
protected
常见规则:
以后使用public来修饰类,一个java文件中只有一个类,如果一个文件中有
多个类,类名和文件名一样的类名,必须用public修饰,其他的类不能
使用public修饰
以后所有的成员变量都使用private修饰
以后所有的方法使用public修饰
以后所有的构造方法用public修饰,若不想让创建对象,使用private修饰
内部类的概述
A:什么是内部类
将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在
其他类内部的类就称为内部类。其他类也称为外部类。
B:什么时候使用内部类
在描述事物时,若一个事物内部还包含其他可能包含的事物,比如在描述汽
车时,汽车中还包含这发动机,这时发动机就可以使用内部类来描述。
class 汽车 { //外部类
class 发动机 { //内部类
}
}
内部类分类
成员内部类
局部内部类
匿名内部类(对象)
共性:
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.calss文件,但是前面冠以外部类的类名和¥符号
内部类不能用普通的访问方式。内部类是外部类的一个成员,因此内部类可以自由的访问外部类的成员变量,无论是否是private
成员内部类的概述和使用
成员内部类
定义在外部类中的成员位置。与类中的成员变量相似,可通过外部类对象进行访问
定义格式
class 外部类 {
修饰符 class 内部类 {
//其他代码
}
}
访问方式
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
案例
/*
* 成员内部类:
* 在类的成员位置,和成员变量以及成员方法所在的位置是一样的
* 在内部类当中,可以直接访问外部类的成员,包括私有成员
*/
public class InnerDemo {
public static void main(String[] args) {
//Outer o = new Outer();
//o.method();
Outer.Inner i = new Outer().new Inner();
i.function();
}
}
class Outer {
private int num = 10;
public void method() {
Inner i = new Inner();
i.function();
}
class Inner {
public void function() {
System.out.println(num);
}
}
}
成员内部类的修饰符
成员内部类的修饰符:
-
我们可以使用权限修饰符修饰成员内部类,但是如果使用私有来修饰,则无法在其他类中访问
-
我们可以使用static修饰成员内部类,不用再创建外部类的对象了
-
我们可以使用abstract,final修饰成员内部类
package com.itheima_01;
public class InnerDemo2 {
public static void main(String[] args) {
//Outer2.Inner2 i;
//Outer2.Inner2 i = new Outer2.Inner2();
//i.function();
Outer2.Inner2.function();
}
}
class Outer2 {
public void method() {
Inner2 i = new Inner2();
}
static class Inner2 {
public static void function() {
System.out.println("function");
}
}
}
局部内部类的概述以及使用(了解)
局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问
定义格式
class 外部类 {
修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}
访问方式
在外部类方法中,创建内部类对象,进行访问
package com.itheima_02;
/*
* 局部内部类
* 在方法内,出了方法之后就无法使用
*
*
*/
public class InnerDemo3 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
class Outer {
public void method() {
int num = 10;
class Inner {
public void function() {
System.out.println("function");
}
}
Inner i = new Inner();//不能放在内部类Inner之前
i.function();
}
public void test() {
//Inner i = new Inner();报错
//System.out.println(num);报错
}
}
匿名内部类概述和格式
匿名内部类:
可以把匿名内部类看成是一个没有名字的局部内部类
定义在方法中
必须在定义匿名内部类的时候创建它的对象
格式:
new 类/接口 (){
如果是创建了继承这个类的子类对象,可以重写父类的方法
如果创建了实现这个接口的子类对象,必须实现该接口的所有方法
}
原理:
是创建了继承这个类的子类对象或者是创建了实现这个接口的子类对象
作用:
匿名内部类是创建某个类型子类对象的快捷方式。
public class InnerDemo4 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
interface Inner {
public void function();
}
class Outer {
public void method() {
/*new Inner() {// 只能一次使用
@Override
public void function() {
System.out.println("function");
}
}.function();;*/
Inner i = new Inner() {//向上转型
@Override
public void function() {
System.out.println("function");
}
};
i.function();
i.function();
}
}
匿名内部类应用场景
public interface Animal {
public abstract void eat();
}
public class Cat implements Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("狗啃骨头");
}
}
/*
* 匿名内部类的应用场景:
* 作为参数进行传递
*
*
*/
public class InnerDemo5 {
public static void main(String[] args) {
//method(new Dog());
//method(new Cat());
//相比较上面创建Dog、Cat类,而使用匿名内部类可以减少这个步骤
method(
new Animal() {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
);
}
public static void method(Animal a) {
a.eat();
}
}