java知识点拾遗(深入面向对象)

  1. 抽象类

抽象方法:

  • 使用abstract修饰的方法,没有方法体,只有声明。定义的是一种“规范”,就是告诉子类必须要给抽象方法提供具体的实现。

抽象类:

  • 包含抽象方法的类就是抽象类。通过abstract方法定义规范,然后要求子类必须定义具体实现。通过抽象类,我们就可以做到严格限定子类的设计,使子类之间更加通用。

要点:

  • 有抽象方法的类只能定义成抽象类。
  • 抽象类不能实例化。
  • 抽象类可以包含属性,方法,构造方法,但构造方法不能用来new实例,只能用来被子类调用。
  • 抽象类只能用来被继承。
  • 抽象方法必须被子类实现。
  1. 接口

定义接口的说明:

  • 访问修饰符只能是public或默认。
  • 接口名和类名采用相同命名机制。
  • 接口可以多重继承。
  • 接口中的属性只能是常量。总是public static final修饰(不写也是)。
  • 接口中的方法只能是public abstract。省略也是public abstract。

要点:

  • 接口中所有的方法都是抽象的。
  • 接口的多态只体现在其定义的抽象方法上,不体现在实现类的非抽象方法上。
  • 接口不能创建实例,但可以声明引用变量类型。
  • 一个类实现了接口,必须实现接口中的所有方法,并且这些方法只能是public的。
  • JDK1.7之前,接口中只能包含静态常量,抽象方法,不能有普通属性,构造方法,普通方法。
  • JDK1.8之后,接口中可包含普通的静态方法。
  1. 内部类

成员内部类

  • 可以使用private,default,protected,public进行修饰。
  • 类文件形如:OuterClass$InnerClass.class
  • 分为:

a 非静态内部类

1) 非静态内部类必须寄存在一个外部类对象里。因此,如果有一个非静态内部类对象那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。

2) 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。

3) 非静态内部类不能有静态方法,静态属性和静态初始化块。

4) 外部类的静态方法,静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义的变量,创建的实例。

5) 成员变量访问要点:
  ~ 内部类里方法的局部变量:变量名。
  ~ 内部类属性:this.变量名。
  ~ 外部类属性:外部类名.this.变量名。

测试非静态内部类代码:

public class TestInnerClass {
	public static void main(String[] args) {
		// 创建内部类对象。
		// 内部类对象是依托外部类对象的。有内部类对象必然已经存在外部类对象。
		Outer.Inner inner = new Outer().new Inner();
		inner.show();
	}
}

class Outer {
	private int age = 10;

	public void testouter() {

	}

	class Inner {
		int age = 20;

		public void show() {
			int age = 30;

			System.out.println("外部类的成员变量age:" + Outer.this.age);
			System.out.println("内部类的成员变量age:" + this.age);
			System.out.println("局部变量age:" + age);
		}
	}
}

b 静态内部类

使用要点:
1) 当一个静态内部类对象存在,并一定存在对应的外部类对象。因此,静态内部类的实例方法不能直接访问外部类的实例方法。

2) 静态内部类看作外部类的一个静态成员。因此,外部类的方法中可以通过:“静态内部类.名字”的方式访问静态内部类的静态成员,通过" new 静态内部类() "访问静态内部类的实例。

测试静态内部类代码:

public class TestStaticInnerClass {
	public static void main(String[] args) {
		Outer2.Inner2 inner = new Outer2.Inner2();
		inner.show();
	}
}

class Outer2 {

	static class Inner2 {
		public void show() {
			System.out.println("显示一下");
		}
	}
}

c 匿名内部类
适合只需要使用一次的类。必须借助父类或者接口来实现。
形式如下:

new 父类构造器(){
  ...
}
或者
new 实现接口() {
  ...
}
  • 匿名内部类没有访问修饰符。
  • 匿名内部类没有构造方法(没有类名)。

匿名内部类测试代码:

public class TestAnony {

	public static void invoke(AnonymouseClass a) {
		a.show();
	}

	public static void main(String[] args) {
		invoke(new AnonymouseClass() {

			@Override
			public void show() {
				System.out.println("实现匿名内部类");
			}
		});
	}
}

interface AnonymouseClass {
	void show();
}

d 局部内部类
定义在方法内部,作用域只限于本方法。
局部内部类测试代码:

public class Test2 {
	public void show() {
		// 作用域只限于本方法
		class Inner {
			public void foo() {
				System.out.println("局部内部类");
			}
		}

		new Inner().foo();
	}

	public static void main(String[] args) {
		new Test2().show();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值