Java中的类的高级特性

1、抽象类

1、抽象类:只声明方法的存在而不去具体实现它的类。

抽象类不能被实例化,即不能创建其对象。
定义时在class关键字前加关键字abstract
abstract class 类名 {
   类体
}

2、抽象方法(在抽象类中创建的、没有实际意义的且要子类重写的方法

没有方法体,只有方法的声明,没有方法的实现

public abstract class A {
    public abstract void a();
public class B extends A {
	@Override
	public void a() { //重写父类中的方法,没有abstract关键字
		
	}
}
抽象方法不能使用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修饰的成员变量
	private void g() { //用private修饰的成员方法
		
	}
	class InnerClass{
		void f() {
			g();
			i++; //内部类中可以随意使用private修饰的变量
		}
	}
}

内部类的实例一定要绑定在外部类的实例上,即在外部类中初始化一个内部类对象

内部类的初始化使用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() { //外部类方法,返回值为内部类引用
		//a=4;    //外部类不可以直接访问内部类成员变量
		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++; //调用的是形参x
			this.x++; //调用内部类的变量x
			TheSameName.this.x++; //调用外部类的变量x
		}
	}
}
public class test {
	public static void main(String[] args) {
		TheSameName t = new TheSameName(); //先实例化外部类的对象
		TheSameName.Innner i = t.new Innner(); //才能实例化内部类的对象,使用TheSameName.Innner i创建对象,使用t.new
		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类对象
		apple.price(); //调用局部内部类的方法
	}
	public static void main(String[] args) {
		SellOutClass s = new SellOutClass();
		s.sell(100);
	}
}

运行结果
在这里插入图片描述
注意:sell()方法不能访问Apple内部类,但是内部类可以访问其中的常量和外部类的所有成员。

3、匿名内部类

1、定义

return new A() {
			...//类体
		};
		//其中A位为对象名
注意:匿名内部类最后有“ ; ”分号

2、实例

public interface USB {
	public void start();
}
public class Computer {
	public void transfer(USB usb) { //将对象作为形参
		usb.start(); //调用接口中的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); //调用外部类的成员变量x
		}
		public static void main(String[] args) {
			doitInner(); //访问内部类的方法
		}
	}
}

运行结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值