1、抽象类
 
1、抽象类:只声明方法的存在而不去具体实现它的类。
 
抽象类不能被实例化,即不能创建其对象。
 
定义时在class关键字前加关键字abstract
 
abstract class 类名 
{
   类体
}
 
2、抽象方法(在抽象类中创建的、没有实际意义的且要子类重写的方法)
 
没有方法体,只有方法的声明,没有方法的实现
 
public abstract class A {
    public abstract void a();
 
public class B extends A {
	@Override
	public void a() { 
		
	}
}
 
抽象方法不能使用private或static关键字进行修饰。
 
3、抽象类的特点
 
1、抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。
 
2、抽象类不可以直接创建对象,原因:调用抽象方法没有意义。
 
3、只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。否则该子类还是一个抽象类。即重写父类中全部的抽象方法后,子类才能被实例化。
 
4、抽象类中一定有构造器,即可以写构造方法,便于子类对象实例化使用
 
之所以继承抽象类,更多的是在思想,是面对共性类型操作会更简单。
 
2、内部类
 
内部类定义时不要加public修饰符
 
1、成员内部类
 
①作为外部类的成员:调用外部类的结构,可以被static修饰,可以被public、 protected、private等修饰 ②作为一个类:可以定义属性、方法、构造器等,可以用final、abstract修饰
 
1、成员内部类的定义
 
public class OuterClass {  
    private class InnerClass {  
    }
}
 
public class OuterClass {
	private int i 
= 0; 
	private void g() { 
		
	}
	class InnerClass{
		void f() {
			g();
			i
++; 
		}
	}
}
 
内部类的实例一定要绑定在外部类的实例上,即在外部类中初始化一个内部类对象
 
内部类的初始化使用new关键字
 
public class OuterA {
	class InnerB {
		InnerB() { 
			
		}
		public void inf() { 
			
		}
		int a
=0; 
	}
	
	InnerB in 
= new InnerB(); 
	public void outf() { 
		in
.inf(); 
	}
	
	public InnerB 
dob() { 
		
		in
.a 
= 4;
		return new InnerB(); 
	}
	public static void main(String
[] args
) {
		OuterA out 
= new OuterA(); 
		OuterA
.InnerB in 
= out
.dob(); 
	}
}
 
2、使用this关键字获取内部类与外部类的引用
 
public class TheSameName {
	private int x
;
	private class Innner {
		private int x
=9;
		public void doit(int x
) {
			x
++; 
			this.x
++; 
			TheSameName
.this.x
++; 
		}
	}
}
 
public class test {
	public static void main(String
[] args
) {
		TheSameName t 
= new TheSameName(); 
		TheSameName
.Innner i 
= t
.new Innner(); 
		i
.doit(2);
	}
}
 
运行结果 
 
2、局部内部类
 
在类的方法中定义的内部类
 
public class SellOutClass {
	private String name
; 
	public SellOutClass() { 
		name
="苹果";
	}
	public void sell(int price
) {
		class Apple { 
			int a
=0;
			public Apple(int price
) { 
				a
=price
; 
			}
			public void price() { 
				System
.out
.println("现在开始销售"+name
);
				System
.out
.println("单价为:"+a
+"元");
			}
		}
		Apple apple 
= new Apple(price
); 
		apple
.price(); 
	}
	public static void main(String
[] args
) {
		SellOutClass s 
= new SellOutClass();
		s
.sell(100);
	}
}
 
运行结果  注意:sell()方法不能访问Apple内部类,但是内部类可以访问其中的常量和外部类的所有成员。
 
3、匿名内部类
 
1、定义
 
return new A() {
			...
		};
		
 
注意:匿名内部类最后有“ ; ”分号
 
2、实例
 
public interface USB {
	public void start();
}
 
public class Computer {
	public void transfer(USB usb
) { 
		usb
.start(); 
	}
}
 
public class USBTest {
	public static void main(String
[] args
) {
		Computer c 
= new Computer();
		USB phone 
= new USB() {
			@Override
			public void start() {
				System
.out
.println("手机可以连接USB"); 
			}	
		};
		c
.transfer(phone
);
	}
}
 
运行结果 
 
4、静态内部类
 
在内部类前添加修饰符static,就是静态内部类。
 
静态内部类的特点:
 
①不可以使用外部类的非静态成员 ②创建静态内部类的对象,不需要其外部类的对象 ③不能从静态内部类的对象中访问非静态外部类的对象。 一个静态内部类中可以声明static成员,但在非静态内部类中不可以声明静态成员。 例子
 
public class StaticInnerClass {
	static int x
=100; 
	static class Inner { 
		static void doitInner() { 
			System
.out
.println("外部类的成员变量"+x
); 
		}
		public static void main(String
[] args
) {
			doitInner(); 
		}
	}
}
 
运行结果