1.如果我们没有定义类的构造器,系统默认提供空参的构造器
2.定义构造器的格式:权限修饰符,类名(形参列表){}
3.构造器可以重载
4.我们定义了类的构造器系统提供默认的空参构造
5.一个类至少有一个构造器
1.使用new关键字
2.使用Class类的newlnstance方法,newlnstance方法调用无参的构造器创建对象(反射)Class.forName.newlnstance
3.使用clone方法
4.反序列化
使用构造器的三种(new和反射的两种newlnstance),没用构造器的两种(clone和反序列化)
初始化类和对象的信息
静态代码块:
内部可以输出语句
随着类的加载而执行,而且只执行一次
作用:初始化类的信息
如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
静态代码块的执行要优先于非静态代码块的执行
静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构
非静态代码块
内部可以输出语句
随着对象的创建而执行
每创建一个对象,就执行一次非静态代码块
作用:可以在创建对象时,对对象的属性等进行初始化
如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
非静态代码块内可以调用静态的属性、静态的方法,或非静态的属性、非静态的方法
成员内部类
一方面,作为外部类的成员:
>调用外部类的结构
>可以被static修饰
可以被4种不同的权限修饰
另一方面,作为一个类:
> 类内可以定义属性、方法、构造器等
> 可以被final修饰,表示此类不能被继承。言外之意,不使用final,就可以被继承
> 可以被abstract修饰
成员内部类如何创建和实例化:
class Person{
String name = "小明";
public void eat(){
}
//非静态成员内部类
class Bird{
String name = "杜鹃";
public void display(String name){
System.out.println(name);//方法的形参
System.out.println(this.name);//内部类的属性
System.out.println(Person.this.name);//外部类的属性
//Person.this.eat();
}
}
//创建静态的Dog内部类的实例(静态的成员内部类):
Person.Dog dog = new Person.Dog();
//创建非静态的Bird内部类的实例(非静态的成员内部类):
Person p = new Person();
Person.Bird bird = p.new Bird();
局部内部类
位置:方法内,构造器内,代码块内
//返回一个实现了Comparable接口的类的对象
public Comparable getComparable(){
return new Comparable(){
@Override
public int compareTo(Object o) {
return 0;
}
};
}
成员内部类和局部内部类,在编译以后,都会生成字节码文件。
格式:成员内部类:外部类$内部类名.class
局部内部类:外部类$数字 内部类名.class
权限修饰符
体现:
将类的属性xxx私化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值
不对外暴露的私有的方法
单例模式(将构造器私有化)
如果不希望类在包外被调用,可以将类设置为缺省的
一旦子类A继承父类B以后,子类A中就获取了父类B中声明的所有的属性和方法
父类中声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类中私的结构。只因为封装性的影响,使得子类不能直接调用父类的结构而已。
子类继承父类以后,还可以声明自己特有的属性或方法:实现功能的拓展
多态的理解(多态的实现方式)
(方法重载(overload)实现的是编译时的多态性(也称为前定)。
(方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西。
要实现多态需要做两件事:1).方法重写(子类继承父类并重写父类中已有的或抽象的方法);2).对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。
项目中对多态的应用
(举一个简单的例子,在物流信息管理系统中,有两种用户:订购客户和卖房客户,两个客户都可以登录系统,他们有相同的方法Login,但登陆之后他们会进入到不同的页面,也就是在登录的时候会有不同的操作,两种客户都继承父类的Login方法,但对于不同的对象,拥有不同的操作。
Java 中 static 方法不能被覆盖, 因为方法覆盖是基于运行时动态绑定的, 而 static 方法
是编译时静态绑定的。 static 方法跟类的任何实例都不相关, 所以概念上不适用。
java 中也不可以覆盖 private 的方法, 因为 private 修饰的变量和方法只能在当前类中使用,
如果是其他的类继承当前类是不能访问到 private 变量或方法的, 当然也不能覆盖。
原文:https://www.cnblogs.com/mankaixin/p/13601084.html