继承、抽象类、反射

1、继承
整体作用:对同一类事物进行类定义时,很多的公共属性和方法,可以抽取到一个父类中;具体事物类只要继承这个父类,就拥有了它的属性和方法,比如下面,子类A想要继承父类B,则需要public class A extends B, 有extends这个关键字必须需要

/** 定义一个父类 Person **/

public class Person{
public String name;
public int age;
public float salry;
public void say(){
	
}

public void eat(){
	sysout("正在吃饭....")
}

}

/** 定义一个子类 ChinesePerson **/

public class ChinesePerson extends Person{
// 公共属性和方法就不需要重新定义了(父类中的私有属性和方法不会被继承)

// 可以定义特有属性
public String[] friends;

// 可以定义特有方法
public void makeFriends(String[] friends){
	this.friends = friends;
}

// 也可以重写父类中的方法
@Override
public void eat(){
	sysout("你好,吃了吗?");
}

}

2、抽象类
抽象类一般用来作为一个父类,但是里面可以有方法是抽象的,以让子类来实现
abstract 修饰符,表示这个类是一个抽象类

抽象类和普通类的区别: 抽象类中可以有抽象方法(只有方法定义,没有方法体),也可以有普通的方法,接口其实就是一个抽象类

public abstract class AbstractPerson {

public String name;
public int age;

//abstract 声明这个方法是一个抽象方法
public abstract void say();

public void eat() {
	System.out.println("正在吃饭......");
}

}

/** 继承了抽象类的子类 **/
public class JapaneseExtendsAbstractPerson extends AbstractPerson{

/**
 * 子类中必须实现抽象类中的抽象方法
 */
@Override
public void say() {
	System.out.println("雅蠛蝶");
}

}

3、 反射及配置文件的说明
反射其实就是利用字符串,通过一系列方式最终调用类其中的方法。反射的基本机制: 可以根据一个“类全名字符串” ,获得代表这个类的class对象,然后根据这个class对象构造出这个类的object对象(object对象是所有对象的父类,可以代表任何类型),再构造出方法的method对象,再进行调用,可以起到new一个类对象相似的效果。但是当大量的类的名称和方法名称存在在txt文件中,利用这种方法是很好的。

public static void main(String[] args) throws Exception, Exception
{	
	
	String classname = "com.doit.pojo.Person";
	//将字符串转换为Java识别的class对象--》forName
	Class<?> aa = Class.forName(classname);
	//然后将这个对象转变为Person类
	Product o = (Product) aa.newInstance(); 
	 //aa.newInstance()新创建一个Object实例, 
	//(Person)将这个实例强转化为 Person类。
	
	
	String methodName = "say";
	
	//从forName这个class模板中获得指定的方法
	Method method = forName.getMethod("eat", String.class);
	
	//将method在对象上执行
	//o是前面通过反射创建的类对象,food是需要传入该方法的参数
	//method.invoke(o, food)默认有返回值
	Object invoke = method.invoke(o, food);
	

}

实例2:
这是需要实现的类:

package day14;

public class A
{
	public void say(String name){
		System.out.println("hahhahaha" + name);
	}

这是通过反射调用类对象:

package day14;

import java.lang.reflect.Method;

public class Test
{

	public static void main(String[] args) throws Exception
	{
	//第一种导入这些路径、名字的方法
	//这是该类所在的位置(字符串)
		String path = "day14.A";
	//方法名(字符串)
		String func = "say";
	//方法需要传入参数的类型,如果不需要传参数,则不需要声明
		String ptype = "java.lang.String";
	//=================================================================
	/*第二种导入路径、名字的方法,通过加载配置文件来获取所要调的类名和方法名及方法参数类型
		还需要在该包的平行路径下创建一个文件:xx.properties,后缀名字需要是properties,
		properties是jAVA中创建配置文件的专用工具
		文件中的内容如下:
		path=day14.A
		func=say
		ptype=java.lang.String*/
		
	Properties props = new Properties();
	//props.load()里面需要一个流,里面的代码记着就行
	props.load(Test.class.getClassLoader().getResourceAsStream("xx.properties"));
	String path = props.getProperty("path");
	String func = props.getProperty("func");
	String ptype = props.getProperty("ptype");
		
		/*1.首先需要将路径转换为class对象
			2.将class对象实例化一个object对象,注意是一个object对象,不是类对象,所以无法
		通过这个调用该类的方法
			3.利用class对象aa得到Method对象,即得到方法对象,
			需要传入参数:第一个是方法的名字(字符串),方法需要传入参数的类型的class对象
			4.通过Method对象m调用方法invoke,需要传入两个参数,
			第一个需要是一个类的object对象,第二个参数是你想要传入的参数,
			要是方法不需要传入参数,就不需要传入第二个参数。*/

		Class<?> aa = Class.forName(path);
		Object lizi = aa.newInstance();
		Method m = aa.getMethod(func,Class.forName(ptype));
		m.invoke(lizi,“刘谦”);
		

	}

}

上面例子的运行解果是:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值