java day7 final 抽象类 接口等 2019.7.15

博客介绍了子父类构造函数特点、final修饰符、抽象类及其实战应用,还提及模板方法模式。同时阐述了接口相关内容,包括混合继承和具体举例,这些都是Java编程中的重要概念。

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

  • 子父类中构造函数的特点
  • final修饰符
  • 抽象类
  • 抽象类实战
  • 模板方法模式
  • 接口
  • 接口的混合继承
  • 接口具体举例

子父类中构造函数的特点

/**
父类中的构造函数也被调用的原因:
每一个子类中构造函数前会默认有一条super();
但是当父类中没有无参的构造函数,就必须手动的调用父类的构造函数(必须写,不然会调用隐式的super()造成错误)
比如父类中fu(int x),子类第一行必须先super(3);
*/

class fu
{
	fu()
	{
		System.out.println("fu");
	}
}


class zi extends fu
{
	zi()
	{
		//super();
		System.out.println("zi");
	}
	zi(int x)
	{
		//this();如果写了这句,则也不会有super();只会有一个构造语句执行
		//super();//依旧是super而不是super(4)
		System.out.println("zi.....x");
	}
}

class Demo3 
{
	public static void main(String[] args) 
	{
		zi z=new zi();
		zi z1=new zi(4);
		//System.out.println("  "+z.num);
	}
}

final修饰符

/*
final:最终,最为一个修饰符
1.可以修饰类,函数,变量
2.被final修饰的类不可以被继承,为了避免被继承,被子类复写功能
3.被final修饰的方法不会被复写 
4.被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,又可以写诗局部变量
  即使是赋相同的值也叫赋值
  如果变量被final修饰,变量必须全部大写。
*/

抽象类


/*
当多个类中出现相同功能,但是功能主体不同,
这是可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主题。

抽象:即看不懂

抽象类的特点:
1.抽象方法一定定义在抽象类中
2.抽象方法和抽象类必须都被abstract修饰
3.抽象方法不可以用new创建对象。因为调用抽象方法没有意义
4.抽象类中的方法要被使用,必须由子类复写其所以的抽象方法后,建立子类对象使用
  如果不复写所有的抽象方法,那么该子类还是一个抽象类

抽象类和一般类没有太大的不同
该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂的东西
这些不确定的部分,也是事物的功能,需要明确出现,但是无法定义主体
通过抽象方法来表示

抽象类比一般类多了个抽象函数,就是可以在类中定义抽象方法(也不可没有抽象方法)
抽象类不可以实例化

特殊:抽象类中可以不定义抽象方法,这样仅仅是不让该类建立对象

*/


abstract class Stu
{
	abstract void study();
}

class BaseStu extends Stu
{
	void study()
	{
		System.out.println("base learn");
	}
}

class AdvStu extends Stu
{
	void study()
	{
		System.out.println("Adv learn");
	}
}

class StuDemo 
{
	public static void main(String[] args) 
	{
		new AdvStu().study();
	}
}

抽象类实战

/*抽象类实战

发现父类的私有变量可以继承,但是不能使用。。。。。。
*/


abstract class Employee
{
	private String name;
	private int age;
	private int pay;
	Employee(String name,int age,int pay)
	{
		this.name=name;
		this.age=age;
		this.pay=pay;
	}

	public abstract void work(); 
}

class ProWork extends Employee
{
	ProWork(String name,int age,int pay)
	{
		super(name,age,pay);
	}

	public void work()
	{
		//System.out.println(super.name+"  "+super.age+"  "+super.pay);
		System.out.println("Pro work");
	}
}

class Manager extends Employee
{
	private int bonus;
	Manager(String name,int age,int pay,int bonus)
	{
		super(name,age,pay);
		this.bonus=bonus;
	}
	
	public void work()
	{
		//System.out.println(name+"  "+age+"  "+pay+"  "+bonus);
		System.out.println("man work");
	}
}
class ShiZhan
{
	public static void main(String[] args) 
	{
		new Manager("zhangsan",40,8000,2000).work();
		new ProWork("lisi",40,5000).work();
	}
}

模板方法模式

abstract class GetTime//zhege
{
	public final void aha()//此部分不允许被修改,加上final修饰符
	{
		long start=System.currentTimeMillis();

		run();//如此之作只需要这一部分代码即可;

		long end=System.currentTimeMillis();

		System.out.println("运行毫秒:"+(end-start));

	}

	public abstract void run();//用public把允许修改的部分暴露出去
}

class Get extends GetTime
{
	public void run()
	{
		for(int x=1;x<=1000;x++)
		{
			System.out.print(x+" ");
		}
	}
}

class TimeDemo 
{
	public static void main(String[] args) 
	{
		new Get().aha();
	}
}

接口

/*
接口:初期理解,可以认为是一个特殊的抽象类
   当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示

class用于定义类
interface用于定义接口

接口定义时,格式特点:
1.接口中常见定义:常量。抽象方法。
2.接口中的成员都有固定修饰符
   常量:public static final
   方法:public abstract

 结论:接口中的成员都是public的


接口:时不可以创建对象的,因为有抽象方法
需要被子类实现,子类对接口中的抽象方法全部覆盖后,子类才可以实例化
否则子类是一个抽象类

*/

interface Inter
{
	public static final int NUM=3;
	public abstract void show();
}

class Test implements Inter
{
	public void show(){}
}

class  Demo4
{
	public static void main(String[] args) 
	{
		Test t=new Test();
		System.out.println(t.NUM);
		System.out.println(Test.NUM);
		System.out.println(Inter.NUM);
	}
}

接口的混合继承

/*
接口可以被类多实现,也是多不支持继承得转换形式。Java支持多实现

而且,接口之间也可以继承,还可以多继承

*/

interface Inter
{
	public static final int NUM=3;
	public abstract void show();
}

interface InterA
{
	public abstract void method();
}

class function
{
	public void speak(){}
}

class Test extends function implements Inter,InterA
{
	public void show(){}
	public void method(){}
}


class  Demo5
{
	public static void main(String[] args) 
	{
		Test t=new Test();
		System.out.println(t.NUM);
		System.out.println(Test.NUM);
		System.out.println(Inter.NUM);
	}
}

接口的具体举例

abstract class Stu
{
	public abstract void study();//每个人都会学习,但学习的内容不同,所以是抽象的
}



interface Smoking//可以把接口理解为一个对象的拓展功能,并不是每个人都会抽烟,像插件一样
{
	public abstract void smoke();
}

class lise extends Stu implements Smoking
{
	public void study()
	{
		System.out.println("study java ");
	}

	public void smoke()
	{
		System.out.println("i like somke");
	}
}

class Demo6 
{
	public static void main(String[] args) 
	{
		new lise().study();
	}
}

<think>我们正在寻找java.lang包中抽象类的使用示例。java.lang包是Java的核心包,其中包含了一些抽象类。我们需要找出这些抽象类并提供使用示例。首先,回顾java.lang包中的抽象类。常见的抽象类包括: -Number:是数值包装器类(如Integer、Double等)的抽象父类。- Enum:所有枚举类型的公共基类。- Process:表示一个本地进程。- ClassLoader:用于加载类的对象。- AbstractStringBuilder:StringBuilder和StringBuffer的抽象父类(注意:这个类在java.lang包中,但它是包级私有的,通常不直接使用)。由于用户要求的是使用示例,我们将重点放在公开的抽象类上,特别是Number和Enum。1.Number类:Number是一个抽象类,它定义了各种数值类型(如int、double、byte等)的包装类的通用方法。它提供了将数值转换为byte、short、int、long、float、double的方法,但这些方法都是抽象的,需要子类实现。示例:使用Integer(Number的子类)```javaNumber num= Integer.valueOf(10);intintValue= num.intValue(); //返回int值10double doubleValue =num.doubleValue(); //返回double值10.0```2.Enum类:所有枚举类型都隐式继承Enum类。我们不能显式地继承Enum,因为Java枚举是通过关键字enum定义的。示例:定义一个枚举类型并使用```javapublicenum Day{SUNDAY,MONDAY, TUESDAY, WEDNESDAY,THURSDAY,FRIDAY,SATURDAY}//使用Day today= Day.MONDAY;System.out.println(today.name());//输出:MONDAY```3.Process类:Process是一个抽象类,用于表示本地进程。我们可以通过Runtime.exec()或ProcessBuilder.start()方法创建一个本地进程,并返回一个Process子类的实例。示例:执行一个系统命令并获取输出```javatry {Processprocess =Runtime.getRuntime().exec("cmd /c dir");BufferedReader reader= newBufferedReader(newInputStreamReader(process.getInputStream()));Stringline;while((line= reader.readLine())!= null) {System.out.println(line);}intexitCode= process.waitFor();System.out.println("Exitedwith code: "+ exitCode);}catch (Exception e) {e.printStackTrace();}```4. ClassLoader类:这是一个抽象类,负责加载类。我们可以通过继承ClassLoader来创建自定义的类加载器。示例:自定义类加载器(简化版)```javapublicclass MyClassLoaderextends ClassLoader {@OverrideprotectedClass<?> findClass(Stringname)throws ClassNotFoundException {//自定义加载类的逻辑,例如从某个字节数组加载类byte[]classData= getClassData(name); //假设这个方法获取类的字节码if (classData== null) {thrownew ClassNotFoundException();}returndefineClass(name,classData,0,classData.length);}privatebyte[]getClassData(StringclassName){//实现从文件系统或网络等获取类字节码//这里仅为示例,返回nullreturn null;}}```注意:AbstractStringBuilder是包级私有的,所以我们不能直接使用它。因此,我们主要展示上述四个公开的抽象类。根据引用[2]:Number类是一个抽象类,其中实现的方法多数都是一些数值之间的转换。比如Integer->Byte,虽然可能会造成数据丢失。同时,引用[2]还提到了Comparable接口,但接口不是抽象类,所以我们不在这里展开。因此,我们可以总结出以下示例:示例1:使用Number抽象类示例2:使用Enum抽象类(通过枚举)示例3:使用Process抽象类示例4:使用ClassLoader抽象类现在,我们将按照要求生成相关问题。</think>### Java.lang包抽象类使用示例 在Java核心包`java.lang`中,抽象类为特定领域的类提供了基础框架和部分实现。以下是关键抽象类的使用示例: #### 1. **Number抽象类** 所有数值包装类的基类(如`Integer`、`Double`),提供数值转换方法: ```java Number num = Double.valueOf(3.14); int intVal = num.intValue(); // 3 (精度丢失) double dblVal = num.doubleValue(); // 3.14 ``` - **作用**:统一数值类型的转换接口 - **设计特点**:强制子类实现`intValue()`、`doubleValue()`等转换方法[^2] #### 2. **Enum抽象类** 所有枚举类型的隐式基类,提供枚举基础能力: ```java enum Color { RED, GREEN, BLUE } Color red = Color.RED; String name = red.name(); // "RED" int ordinal = red.ordinal(); // 0 ``` - **核心方法**: - `name()`:返回枚举常量名 - `ordinal()`:返回声明顺序索引 - **限制**:开发者不能显式继承`Enum`,需通过`enum`关键字创建 #### 3. **ClassLoader抽象类** 类加载机制的核心抽象,实现自定义加载逻辑: ```java class CustomLoader extends ClassLoader { @Override protected Class<?> findClass(String name) { byte[] bytecode = loadClassData(name); // 自定义加载逻辑 return defineClass(name, bytecode, 0, bytecode.length); } } ``` - **典型应用**:实现热部署、模块化加载等场景 #### 4. **Process抽象类** 表示本地操作系统进程: ```java Process process = Runtime.getRuntime().exec("ping 127.0.0.1"); try (BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream()))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); // 输出ping结果 } } ``` - **关键功能**:`getInputStream()`获取进程输出流,`destroy()`终止进程 #### 5. **AbstractStringBuilder** `StringBuilder/StringBuffer`的包级私有基类(JDK内部使用): ```java // 实际使用其子类 StringBuilder sb = new StringBuilder(); sb.append("Hello").insert(5, " World"); System.out.println(sb); // "Hello World" ``` - **设计目的**:封装可变字符序列的核心操作,避免代码重复 --- ### 抽象类设计特点 1. **部分实现 + 抽象方法** 如`Number`提供基础方法,但强制子类实现类型转换逻辑。 2. **模板方法模式** `ClassLoader`的`loadClass()`方法定义加载流程,子类实现`findClass()`。 3. **限制实例化** 所有抽象类不能直接实例化,需通过子类或工厂方法(如`Runtime.exec()`创建`Process`子类实例)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值