面向对象的基本概念,包括:
类
实例
方法
面向对象的实现方式,包括:
继承
多态
Java语言本身提供的机制,包括:
package
classpath
jar
以及Java标准库提供的核心类,包括:
字符串
包装类型
javaBean
枚举
常用工具类
类:
定义了class,只是定义了对象模版,而要根据对象模版创建出真正的对象实例,必须用new操作符。
new操作符可以创建一个实例,然后,我们需要定义一个引用类型的变量来指向这个实例:
Person p = new Person();
一个Java源文件可以包含多个类的定义,但只能定义一个public类,且public类名必须与文件名一致。
如果要定义多个public类,必须拆到多个Java源文件中。
面向对象的本质是:以类的方式组织代码,以对象的方式组织(封装)数据。
构造器:
相当于构造函数。一旦有了有参构造,无参构造就必须显示定义。
alt+insert快捷键可以帮助生成构造器、get,set等
封装:
程序追求”高内聚,低耦合“。高内聚:类的内部数据操作细节自己完成,不允许外部干涉,
低耦合:仅暴漏少量的方法给外部使用。
属性私有,通过get set方法来操作属性。
继承:
public class Person{}
public class Student extends Person{}
在java中所有的类都默认直接或间接继承Object类
快捷键ctrl+h可以查看继承的关系
super:可以在子类中调用父类的属性和方法(私有的不能调用),当new子类时,会自动调用父类的无参构造方法
super注意点:1.super调用父类的构造方法,必须在构造方法的第一个。
方法的重写:重写只和非静态方法有关,需要有继承关系,子类重写父类的方法、
1.方法名必须相同,方法体不同
2.参数列表必须相同
3.修饰符:范围可以扩大 private->public
4.抛出的异常,范围可以缩小不可以扩大。
为什么重写:
1.父类的功能,子类不一定需要或者不一定满足。
多态:
多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。
Person s1 = new Student;
Student s2=new Student;
s1.run();
s2.run();
一个对象的实际类型是确定的,但可以指向对象的引用类型有很多。
多态存在的条件:
1.有继承关系
2.子类重写父类方法
3.父类引用指向子类对象
注意:当子类重写父类方法时,调用子类重写的方法,父类的引用指向子类的对象s1不能够调用子类特有的方法。
但可以通过强制转换类型实现。
instanceof
判断类型是否有父子关系
Person p1 = new Student();
System.out.println(p1 instanceof Student);//true
System.out.println(p1 instanceof Person);//true
System.out.println(p1 instanceof Tercher);//false
System.out.println(X instanceof Y);//编译能不能通过看X和Y有没有父子关系,返回true和false 看X和Y是否在父子类一条线上。
父类子类类型转换:
高转低要强制转换:
Person p1= new Student();//现在p1为Person类不能够调用Student类中的方法
Student p2 = (Student)p1;//p1被转为Student类,用p2引用接收。
抽象类:
抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。
如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法。
抽象类的所有方法,子类都必须要重写(子类也为抽象类除外)。
1.不能new抽象类。
2.抽象类可以写普通方法,抽象方法必须写在抽象类中。
接口:
只有规范。比抽象类还要抽象。定义的方法默认就是public static,定义的属性默认就是常量 public static final
接口的定义:public interface UserService{} //关键字interface
类继承接口的定义:public class UserServiceImpl implements UserService{} //关键字implements
可以通过接口实现多继承。
一个interface可以继承自另一个interface。interface继承自interface使用extends,它相当于扩展了接口的方法。
合理设计interface和abstract class的继承关系,可以充分复用代码。一般来说,公共逻辑适合放在abstract class中,
具体逻辑放到各个子类,而接口层次代表抽象程度。
default方法:
当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default方法,那么子类就不必全部修改,
只需要在需要覆写的地方去覆写新增方法。
内部类:
一个java文件里只能有一个public类,但可以有很多个class。
成员内部类:
在一个类中再写一个类。实例化是通过外部类来实现实例化, Outer.Inner innner = Outer.new Inner();
内部类可以获取外部类的私有属性。它与普通类有个最大的不同,就是Inner Class的实例不能单独存在,必须依附于一个Outer Class的实例。
静态内部类:
没办法直接访问外部类的非静态属性,因为在加载类的时候先加载静态内容,在加载静态内部类的时候还没有定义识别到外部类的非静态属性。
局部内部类:
写在方法里面的类(匿名类(Anonymous Class))