Java面向对象编程的特性
- 抽象(Abstract)
简单的说就是想。忽略掉事物的外在,把它最本质的特性提取出来。就比如说人,不管你长得高矮胖瘦,被天使吻过还是被二哈舔过,忽略掉你的外在,提取你拥有的最本质的东西。作为一个人,你有名字、性别、年龄…这些,就是抽象所需要提取的东西。 - 封装(Encapsulation)
简单地说就是将属性隐藏,怎么隐藏,使用private修饰符。这样与一般来说外界是获取不到类中的属性了(除非你用反射),然后再根据需求向外界暴露一些获取属性方法。 - 继承(Inheritance)
站在巨人的肩膀上,父类有而子类没有的方法可以用父类的,如果子类也有,就用子类的。 - 多态(polymorphism)
首先,多态是方法的多态,不是属性的多态;其次,多态要满足3个条件:继承(或实现)、重写父类方法、父类引用指向子类对象。
下面来看看多态
- 具体类的多态
class Animal{
public void eat(){
System.out.println("动物吃XX");
}
public static void sleep(){
System.out.println("动物睡觉");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public static void sleep(){
System.out.println("猫睡觉");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃肉");
}
}
public static void main(String[] args){
Animal a1 = new Cat();
Animal a2 = new Dog();
a1.eat();
a1.sleep(); //静态方法不能被重写,所以调用的是父类的sleep方法
a2.eat();
}
结果:
猫吃鱼
动物睡觉
狗吃肉
- 抽象类的多态
abstract class Wine{
void type(){
System.out.println("酒");
}
}
class NuoMi extends Wine{
@Override
void type() {
System.out.println("糯米酒");
}
}
class YangMei extends Wine{
@Override
void type() {
System.out.println("杨梅酒");
}
}
public static void main(String[] args){
Wine w1 = new NuoMi();
Wine w2 = new YangMei();
w1.type();
w2.type();
}
结果:
糯米酒
杨梅酒
- 接口的多态
interface Person{
void say();
static void anyway(){
System.out.println("诶嘿嘿");
}
}
class Teacher implements Person{
@Override
public void say() {
System.out.println("老师教书");
}
public void anyway() {
System.out.println("老师诶嘿嘿");
}
}
class Student implements Person{
@Override
public void say() {
System.out.println("学生回答问题");
}
}
public static void main(String[] args){
Person p1 = new Teacher();
Person p2 = new Student();
p1.say();
// p1.anyway(); //接口中的静态方法只能通过类名调用,不能通过父类引用调用。
//因为静态方法不能被重写,而且接口没有实例,所以只能通过类名调用
p2.say();
}
结果:
老师教书
学生回答问题
重写和重载的区别
ok,说到重写。咱们来对比一下重写和重载。
- 重写:
1.方法名相同,参数列表相同
2.返回类型相同或是原返回类型的子类型
3.访问范围不能被缩小
4.异常不能被扩大 - 重载:
方法名相同,参数列表不同,其他随意。
类的初始化顺序
java类初始化顺序
-
普通类:
1.静态属性
2.静态代码块
3.普通属性
4.普通代码块
5.构造函数 -
继承的子类:
1.父类静态属性
2.父类静态代码块
3.子类静态属性
4.子类静态代码块
5.父类普通属性
6.父类普通代码块
7.父类构造函数
8.子类普通属性
9.子类普通代码块
10.子类构造函数
ps:可以这么记:父父子子,父父父子子子注:静态代码块只执行一次,构造器和普通代码块每new一次执行一次