Java基础 | 包和内部包

发布时间:2024年01月19日


所有知识点均来源于《Java从入门到精通》(第六版)。

Java类包

Java每定义一个类就会生成一个.class的文件,但会很容易出现类名称冲突的现象,可以用类包来管理类文件的机制。

类名的冲突

java每个接口或者类都来自不同的包类。一个包类里包含一些类和接口。编译器不会允许存在同名的类文件,所以需要把这两个类放在不同的包里。

类包的名字

组成一般是包名.类名。

java.lang.String

java.lang是包名,String是类名。同一个包中的类互相访问时可以不指定包名。
比如说一个包命名为com.mr意思是位于com文件夹下的mr子文件夹下。没有定义包的类会被放在默认包(default package)下。
下面语法必须放在代码的第一行,java包的命名规则是全部使用小写字母。

package 包名

导入

用import导入包

*可以导入包里所有的类

import java.util.*

用import导入静态成员

import除了可以导入包以外还可以导入静态成员

导入静态成员方法
import static java.lang.Math.max
导入静态成员变量
import static java.lang.System.out

导入之后,主方法就可以直接用out.println()和max(),代替写全称。

内部类

如果在类中再定义一个类,那将在类中再定义的那个类称为内部类。内部成员类和匿名类为常见的内部类。

内部成员类

class OuterClass{
	private int i = 0;
	private void g(){
	
	}
	class InnerClass{
		都可以直接用
		g();
		i++;
	}
}
  • 在成员内部类中可以随意使用外部类的成员方法以及成员变量,即使是private修饰的。

  • 内部类的实例一定要绑定在外部类的实例上,如果从外部类中初始化一个内部类对象,那么外部类对象就会绑定在外部类对象上。内部类初始化方式和其他类的初始化方式都是一样的用new关键字。

  • 例子:Car.Engine engine = car.new Engine("EA211");

public class Car{
	private String brand;
	public Car(String brand){
		this.brand = brand;
	}
	//内部类
	class Engine{
		String model;
		//Engin类的构造方法
		public Engine(String model){
			this.model = model;
		}
		public void ignite(){
			System.out.println("发动机"+this.model+"点火");
		}
	}


	public void start(){
		System.out.println("启动"+this.brand);
	}
	public static void main(String[] args){
		Car car = new Car("大众朗行");
		car.start();
		Car.Engine engine = car.new Engine("EA211");
		engine.ignite();
	}
}
  • 成员内部类不止在外部类中使用,在其他类中也可以使用,内部类会依赖外部类,除非已经存在一个外部类对象,否则类中不会出现内部类对象,在其他类中创建内部类的语法:
外部类 outer = new 外部类();
外部类.内部类 inner = outer.new 内部类();
  • 可以使用this关键字获取内部类与外部类的引用,如果外部类中定义的成员变量和内部类中的成员变量名字相同,可以用this,例子:
public class TheSameName{
	private int x = 7; //外部类x
	//内部类
	private class Inner{
		private int x = 9; //内部类x
		public void doit(){
			int x = 11; //局部变量x
			x++;
			this.x++; //调用内部类的x
			TheSameName.this.x++; //调用外部类的x
		}
	}
}

匿名内部类

匿名类是只在创建对象的时候才会编写的一种写法。匿名类的特点是“现学现用”:

new 父类/父类接口(){
	子类实现的内容;
};//有分号
  • 可以使本来没有办法创建对象的抽象类用new关键词来创建,而创建出来的对象并不是一个具体子类,可以称为一个具体的无名之类。
  • 匿名类的原则:匿名类不能写构造方法;匿名类不能定义静态的成员;如果匿名类创建的对象没有赋值给任何引用变量,会导致该对象用完一次就被销毁。
  • 例子:
abstract class Dog{
	String Color;
	public abstract void move();
	public abstract void call();
}
public class Demo{
	public static void main(String[] args){
		Dog maomao = new Dog(){
			public void move(){
				System.out.println("四脚狂奔");
			}
			public void call(){
				System.out.println("汪~");
			}
		};
		maomao.Color = "灰色";
		maomao.move();
		maomao.call();
	}
}

得到结果:

四脚狂奔
汪~

这里的maomao就是没有具体的品种但是是一只狗,而且抽象方法都被重新定义过的狗。

文章来源:https://blog.csdn.net/zszq111/article/details/135567140
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。