Java创建对象的方式有五种
1.New关键字创建对象
People peo1 = new People ();
2.克隆创建对象
People peo2= (People ) peo1 .clone();
3.反序列化创建对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("Employee .obj"));
People peo1 = (People ) in.readObject();
4.反射的newInstance()创建对象 仅能创建无参的构造函数
People peo1 = (People ) Class.forName("org.programming.mitra.exercises.People ").newInstance();
或者
People peo1 = People .class.newInstance();
5.反射的getConstructor() 可以有参也可无参
Constructor<People > constructor = People .class.getConstructor();
People peo1 = constructor.newInstance();
特别注意:克隆和反序列化不需要构造函数
Java面向对象的特征
1.封装
表现:用private修饰词将属性私有化(一般只对属性进行私有化,方法公开,调用属性是通过get、set方法调用)
作用:外部类不能够直接访问类中的私有变量,保护私有变量的数据的操作安全
加强:内部类(嵌套类)同样也是封装的一种体现
内部类分类:(内部类可以在任何外部类中,抽象类,接口,公共类)
普通内部类(成员内部类):
public class one {
class two{//内部类
int a=0;
public void name() {
System.out.println(a);
}
}
}
成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
不过要注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:
外部类.
this
.成员变量
外部类.
this
.成员方法
虽然成员内部类可以无条件地访问外部类的成员,而外部类想访问成员内部类的成员却不是这么随心所欲了。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问。
创建内部类时需要先创建外部类,两种方式
public class Test {
public static void main(String[] args) {
//第一种方式:
Outter outter =new Outter();
Outter.Inner inner = outter.new Inner(); //必须通过Outter对象来创建
//第二种方式:
Outter.Inner inner1 = outter.getInnerInstance();
}
}
class Outter {
private Inner inner =null;
public Outter() {
}
public Inner getInnerInstance() {
if(inner ==null)
inner =new Inner();
return inner;
}
class Inner {
public Inner() {
}
}
}
内部类可以拥有private访问权限、protected访问权限、public访问权限及包访问权限。
外部类只有public和包访问权限。
局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
class People{
public People() {
}
}
class Man{
public Man(){
}
public People getWoman(){
class Womanextends People{ //局部内部类
int age =0;
}
return new Woman();
}
}
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的
匿名内部类
匿名内部类也是不能有访问修饰符和static修饰符的。
scan_bt.setOnClickListener(new OnClickListener() {//匿名内部类
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
2.继承
关键字:extends,implements
extends单继承机制,只能继承一个父类,所有类都继承java.lang.Object类
implements多继承机制,可以实现多个接口(多个接口之间用逗号隔开)
子类继承父类的属性和方法,作用是减少子类中冗余的属性和方法,子类中共有的属性和方法被抽取到父类被子类继承,同时子类具有扩展父类的能力。是属于把子类中的方法整体抽取到父类。
备注:JDK动态代理和CGLIB动态代理。 Aop切面编程的底层实现。 切面编程是将方法内的重复的冗余代码抽取到切面类,是对继承的一个有效的补充。
3.多态
所谓多态 就是同一个方法名,不同的实现结果。具体的表现是:
在一个类中,就是方法重载,方法名相同、参数列表不同、与返回值类型无关,与static无关,方法重载又叫做编译时多态。
在继承关系中,就是方法重写, 子类和父类具体相同的方法名,相同的参数列表,相同的返回值类型,static修饰的即使都相同(不是方法重写),方法重写也叫做运行时多态。
如果子类重写的方法声明的是检查异常,父类被重写的方法一定要声明大于或等于子类的检查异常。