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刘谦