
面向对象编程
本质
以类的方式组织代码,以对象组织(封装)数据
抽象(将像的部分抽离出来)
三大特性
封装
该露的露,该藏的藏
"高内聚,低耦合",高内聚:就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用
1,提高程序的安全性,保护数据
2,隐藏代码是实现过程
属性私有,get/set
public class Demo7 {
private int id;
// 获得这个数据
public int getId() {
return id;
}
// 设置这个数据
public void setId(int id) {
this.id = id;
}
public static void main(String[] args) {
Demo7 demo7=new Demo7();
demo7.setId(72);
System.out.print(demo7.getId());
}
}
继承(如:直角三角形继承于三角形,前者是后者的子类)
本质是对某一类的抽象,从而实现对现实世界更好的建模
1,子类继承父类就有了父类的所有方法
2,java中所有的类都默认继承Object类
3,java中只有单继承没有多继承 父类只能有一个,子类可以有多个
4,私有的属性无法被继承
extends 继承
super
public class person{
public String name="opq";
public void f(){
}
}
class student extends person{
public String name="waz";
public void f(){
this.name;//子类的name=waz
super.name;//父类的name=opq
}
public void k(){
this.f();//子类的方法
super.f();//父类的方法
}
}
当子类实例化运行时,会调用父类默认的方法
super();在子类中一般被隐藏了指的的 super.person();
调用父类的构造器必须要在子类的第一行
当父类为有参构造时,子类的构造器也必须为有参构造
super的注意点
super调用父类的构造方法,必须放在子类构造方法的第一个
super必须只能出现在子类的方法或构造器中
super和this不能同时调用构造方法
this 区别
this:本身调用者这个对象
super:代表父类对象的应用
前提
this:没有继承也可以使用
super:必须继承后才能使用
构造方法
this(); 子类的构造方法
super(); 父类的构造方法
方法的重写
重写都是方法的重写,与属性无关
public class A{
@Override //重写
public void test(){
super.test();
}
}
public class B extends A{
public void test(){
}
}
public static void main(String[] args) {
//静态方法:调用只和左边,定义的数据类型有关
//非静态方法;重写
A a=new A();
a.test();//A
//父类的引用指向了子类
B b=new A();
b.test();//非静态为A,静态为B
}
重写:需要有继承关系,子类重写父类的方法
重写:子类的方法和父类必须相同:方法体不同
方法名必须相同
参数列表必须相同
修饰符:范围可以扩大,不能缩小
抛出的异常:范围,可以缩小,但不能扩大
为什么要重写
父类的功能,子类不一定需要,或者不一定满足
多态(同一种事物会有多种形态,每种形态都不一样)
认识角度,先有对象后有类
代码角度,先有类后有对象
多态存在条件
有继承关系
子类重写父类方法
父类指向子类对象
一个对象的实际类型是确定的,但可以指向的引用类型不确定了:父类的引用指向子类
public class person{
}
public class student extends person{
}
public static void main(String[] args)
{
//一个对象的实际类型是确定的
new student();
new person();
//指向的引用类型不确定:父类的引用指向子类
//student 能调用的方法都是自己的或者继承父类的
student s1=new student();
//person 父类型,可以指向子类,但是不能调用子类独有的方法
person s2=new student();
object s3=new student();
}
总结:编译,看左边;运行,看右边
多态注意事项
多态是方法的多态,属性没有多态
父类和子类,有联系,类型转换异常(ClassCastException)
存在条件:继承关系,方法需要重写。父类引用指向子类
无法重写的情况
static 方法,属于类,它不属于实例
final 常量,final修饰的方法也不能被继承
private 方法
instanceof
判断类的类型是否相似
public class person{
}
public class student extends person{
public void go(){
}
}
public class teacher extends person{
}
public static void main(String[] args)
{
// Object>person>studnet
//Object>person>teacher
Object o=new student();
System.out.print(o instanceof person); true
System.out.print(o instanceof student); true
System.out.print(o instanceof object); true
System.out.print(o instanceof teacher); flase
}
总结 System.out.print(A instanceof B);/当A与B有关系时,编写通过,否则,编译不通过
类型的转换 父 子
高 低
//父类转换为子类时,才能调用子类独有的方法
person p=new studnet();
student s=(student) p;
s.go();
低 高
//子类转换为父类可能会丢失自己本来的一些方法
student s=new studnet();
person p=s;
public class person{
//2
{
System.out.print("匿名代码块");
}
//1最先执行 只会执行一次 跟着类一起执行
static{
System.out.print("静态代码块");
}
//3
public person(){
System.out.print("构造方法")
}
}
抽象类
abstract 抽象类 单继承 extends
//abstract 抽象方法,只有方法名字,没有方法的实现 public abstract void doSomething(); 1,不能new这个抽象类,只能靠子类去实现它:约束 2,抽象类中可以写普通的方法 3,抽象方法必须写在抽象类中 抽象类可以提高开发效率