面向对象核心技术

本文深入探讨Java中的类继承、多态、抽象类、接口、内部类等高级概念,解析super关键字、final修饰符、静态内部类及匿名类的使用场景与规则,适合进阶学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类的继承

只支持单继承、即一个子类只能继承一个父类

child extends parents

重写父类

重写时不能降低方法的修饰权限范围,父类的protected可以改为public ,但不能private

parents a=new child();
//父类声明,子类实现
child a=new parents();//这是错误的

super关键字

super.property;//调用父类属性
super.method();//调用父类的方法

getClass()
返回对象执行时的Class实例,getName取得类的名称

System.out.println(b.getClass().getName());
=>xiaoxiong1.Computer2

System.out.println(b.getClass());
=>class xiaoxiong1.Computer2

System.out.println(new Computer2());
=>xiaoxiong1.Computer2@15db9742

多态

重载

参数个数不同、参数类型不同、参数顺序不同

return (int) (a+b);
//输出为int型

向上转型:
将子类对象看作是父类对象
向下转型:
将父类对象赋予子类对象,并强制转换为子类型

parents a=new child();
child b=(child) a;

instanceof关键字

当在程序中执行向下转型操作时,如果父类对象不是子类对象的实例,就会发生Class否为CastException异常,所以在执行向下转型之前需要养成个良好的习惯, 就是判断父类对象是否为子类对象的实例。这个判断通常使用instanceof操作符来完成
用它来判断个实例对象是否属于一个类。

if (q instanceof Square) {
	Square s = (Square) q; // 进行向下转型操作
}

抽象类与接口

abstract关键字
构造方法不能定义为抽象方法

public abstract class Market {
	public String name;//商场名称
    public String goods;//商品名称
    public abstract void shop();//抽象方法,用来输出信息
}
public class TaobaoMarket extends Market {
    @Override
	public void shop() {
		// TODO Auto-generated method stub
		System.out.println(name+"网购"+goods);
	}
}

接口

interface关键字

interface drawTest { // 定义接口
	public void draw(); // 定义方法
}

一个类实现一个接口用implements关键字

class ParallelogramgleUseInterface implements drawTest {
	public void draw() { // 由于该类实现了接口,所以需要覆盖draw()方法
		System.out.println("平行四边形.draw()");
	}
}
class me implements IFather,IMother;
//多个接口对象,用,隔开

接口中的方法都是抽象的,因此,当子类实现接口时,必须实现接口中的所有方法
多重继承
如果是接口继承接口,使用extends关键字

interface intf1{
    void a();
}
interface intf2 extends intf1{
    void b();
}
public class intf3 implements intf2{//实现子接口,但必须重写所有方法
    public void a(){
    }
    public void b(){
    }
}    

(1)子类只能继承一个抽象类,但可以实现任意多个接口。
(2)一个类要实现一个接口必须实现接口中的所有方法,而抽象类不必。
(3)抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是public static final的(4)接口中只能定义抽象方法,而抽象类中可以定义非抽象方法。
(5)抽象类中可以有静态方法和静态代码块等,接口中不可以。
(6)接口不能被实例化,没有构造方法,但抽象类可以有构造方法。
在这里插入图片描述

访问控制

不使用public修饰符设置类的权限,则默认为default(缺省)修饰,本类、本类所在包可见;其他包中的子类、其他包中的非子类不可见

import xiaoxiong.*;     //指定包中所有类在程序中可使用
import xiaoxiong.Math  //指定包中Math类在程序中可使用

final关键字

不能被继承、不能改动、不能覆盖

final double PI=3.14;

也不是恒定不变

private static Random rand = new Random();
private final int a1 = rand.nextInt(10);
//每次运行随机产生0~10之间的随机数赋予定义为final的a1

private static final int a2 = rand.nextInt(10);
//static 不变化

通常使用public static final修饰,这样的常量只能在定义时被赋值

内部类

public class OutClass{  //外部类
	private class InnerClass{  //内部类
		
	}
}

内部类可以使用外部类的成员

外部类不可以直接访问内部成员变量

非内部类不能被声明为private或protected访问类型

使用this关键字获取内部类与外部类的引用

public class TheSameName {
	private int x;
	private class Inner {
		private int x = 9;
		public void doit(int x) {
			x++; 					//调用的是形参x
			this.x++; 					//调用内部类的变量x
			TheSameName.this.x++; 	//调用外部类的变量x
		}
	}
}

局部内部类

interface OutInterface2 { // 定义一个接口
}
class OuterClass3 {
	public OutInterface2 doit(final String x) { // doit()方法参数为final类型
		// 在doit()方法中定义一个内部类
		class InnerClass2 implements OutInterface2 {
			InnerClass2(String s) {
				s = x;
				System.out.println(s);
			}
		}
		return new InnerClass2("doit");
	}
}

匿名内部类

return new A(){
    //.....
};
interface OutInterface2 { // 定义一个接口
}

class OuterClass4 {
	public OutInterface2 doit() { // 定义doit()方法
		return new OutInterface2() { // 声明匿名内部类
			private int i = 0;
			public int getValue() {
				return i;
			}
		};
	}
}

(1)匿名类没有构造方法;
(2)匿名类不能定义静态的成员;
(3)匿名类不能用private. public. protected、 static. final. abstact 等修饰;
(4)只可以创建一个匿名类实例。

静态内部类

不能使用外部类的非静态成员,如果创建静态内部类的对象,不需要创建其外部类的对象

public class StaticInnerClass {
	int x = 100;

	static class Inner {
		void doitInner() {
			// System.out.println("外部类"+x);
			//不能调用外部类的成员变量x
		}

		public static void main(String args[]) {
			System.out.println();
		}
	}
}

内部类的继承

public class OutputInnerClass extends ClassA.ClassB { // 继承内部类ClassB
	public OutputInnerClass(ClassA a) {
		a.super();
	}
}

class ClassA {
	class ClassB {
	}
}

在某个类继承内部类时,必须硬性给予这个类一个带 多数的构造方法,并且该构造方法的参数必须是该内部类的外部类引用,就像例子中的ClassA a,同时在构造方法体中使用a。super()语句。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值