个人java学习路线-封装,继承,多态,接口
先说说抽象
抽象见名知意。
百度百科上抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。
java中常见的是抽象类和抽象方法。
这个有啥用呢?
正如类是对象的模板,也可以简单的认为抽象类是类的模板,抽象方法是方法的模板。
抽象的关键词是abstract
抽象类,抽象方法:
public abstract class Person {
public abstract void eat();
}
抽象类中有无抽象/普通方法都可以,但普通类里不能有抽象方法。
关于抽象类的实现在继承最后再说说。
一,封装
封装,最重要的记住属性私有化就行。
class Person{
private String name;
private int age;
public void tell(){
System.out.println("hehehhe");
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
private就是私有的意思,私有化的属性外部无法访问,但是可以通过类似getName和setName的方法取得name的值或者为name赋值。这样可以更安全的保护一个类的内部属性。
二,继承
1.什么是继承,继承怎么用
如果说封装的目的是保护数据,那么继承的目的就是为了类的复用,但是在Java中,只允许类的单继承,不支持多继承,作为补充接口可以当多继承用。
1》继承:顾名思义,子继承父,继承是类的继承,子类可以通过继承获得父类的属性和方法,子类也可以扩展父类的属性和方法.
格式:
class 父类{}
class 子类 extends 父类{}
2.this和super
一》
this;
在idea自动生成的setter方法中自带就有this
public void setName(String name){
this.name = name;
}
this
可以表示类中的属性,
也可以通过this调用本类的构造方法,
this用的最多的应该还是指当前对象。
ps:this在调用构造方法时:
1.用在实例方法中代表当前对象(this.)
2.用在构造方法中,通过b构造方法调用a构造方法(this())
3.不会产生新的对象,但必须写在第一行
二》
super:
从子类调用父类中的构造方法,普通方法,属性。
在调用构造方法时,也必须放在首行。
三》
关于在调用构造方法时this和super的一些说明
1.this和super都必须写在第一行,所以只能用一种方法调用父类构造方法
2.如果两个都没写默认调用super(),一旦写了任意一个,因为不能同时存在两个,所以默认的super()会消失。
四》
其他还有this虽然适用性比super大,但也有一些情况只能用super()
3.抽象类的实现
都忘了这个了…
子类继承抽象类后,重写/实现抽象类中的抽象方法就行
需注意的是:
普通类不能有抽象方法,
抽象类中,普通方法,抽象方法有无都行,
抽象类继承抽象类时,可以不实现抽象方法,
普通类继承抽象类时,必须实现抽象方法。
三,多态
1.多态语法
多态很重要(能写下来的哪个不重要.jpg),在java中主要有两个体现
一.方法的重载和复写
二.对象的多态性
重载和复写早就接触过了,对象的多态才是重点,对象的多态也有两个类型
1.向上转型:子类对象—》父类对象
2.向下转型:父类对象—》子类对象
1》向上转型:
比如有个宠物类Pet,和继承Pet的子类Dog类,那么在创建Dog对象时就可以这么写
Pet pet2=new Dog();
可见,向上转型是可以自动转型的,至于为什么可以这么写,这就有关jvm的编译原理了,感兴趣自行深入。
2》向下转型:
与向上转型不同,向下转型必须强制转换,因为子类一定包含父类的属性方法,而父类不一定包含子类,那么向下转型就有可能出异常,所以只能手动强转,在强转的时候也有必要对父类进行判断,这时就要用到 instanceof方法了,例:
a instanceof b;a是不是b类
返回值为Boolean
一般向下转型的写法:
Pet pet2=new Dog();
if( pet2 instanceof Dog){
Dog dog=(Dog)pet2;
}
2.多态作用
需注意的是向上转型后只能用父类的方法,而想用子类的方法,必须还要向下转型回来,那么多态有什么用呢:很有用,以后就知道了…(多态最大的用途在于对设计和架构的复用,后面和接口等等组合使用时就能看出这个的重要了)
四,接口
接口的定义
特别重要的概念,是一个特殊的类,里面全是全局变量和公共的抽象方法组成,接口也可以看出一个规范,我们很多时候都是面向接口编程。
格式:
interface 接口名称{
全局变量;
抽象方法;
}
例:
interface A{
public static final double PI=3.14;
public abstract void print();
public abstract String getInfo();
}
接口中因为都是全局变量和公共的抽象方法,所以可以简化
interface A{
double PI=3.14;
pvoid print();
String getInfo();
}
都是一个意思
接口的实现
和类的继承不一样,接口是由子类来实现(implements)的,而且子类可以实现多个接口。
class 子类 implements 接口 A,接口 B,…{
}
注意:子类实现接口就必须实现接口中的所有抽象方法
总结
继承,多态,接口思想
1>继承:
is a;
cat is an animal;
is a “继承关系”
A extends B;
2>多态
has a;
i has a pen;
“关联关系”,通常以"属性"存在(夫妻例子);
A{
B b;
}
3>接口
like a;
cook like a foodmenu;
“实现关系”,类实现接口;
A implements B;
接口和抽象对比
抽象是半抽象的
接口是完全抽象的
抽象类中有构造方法
接口中没有
接口和接口之间支持多继承
类和类之间只能单继承
一个类可以同时实现多个接口
一个抽象类只能继承一个类(单继承)
接口中只有常量和抽象方法