static叫静态,可以修饰成员变量、成员方法
成员变量按照有无static修饰,分为两种
类变量 : 有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享
实例变量*(对象的变量): 无static修饰,属于每个对象的。
类方法 : 类方法最常见的应用场景是做工具类
代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。
代码块分为两种:
实例代码块:
子类写了一个方法名称,形参列表与父类某个方法一样的方法去覆盖父类的该方法
当子类觉得父类的方法不好用,或者不满足自己的需求时,就可以用方法重写。
可以通过super关键字,指定访问父类的成员: super.父类成员变量/父类成员方法
多态:多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态
定义方法时,使用父类类型作为形参,可以接收一切子类对象,扩展行更强,更便利。
public class Test2 {
public static void main(String[] args) {
// 目标:掌握使用多态的好处
Teacher t = new Teacher();
go(t);
Student s = new Student();
go(s);
}
//参数People p既可以接收Student对象,也能接收Teacher对象。
public static void go(People p){
System.out.println("开始------------------------");
p.run();
System.out.println("结束------------------------");
}
}
解决办法:使用instanceof判断当前对象的真实类型:然后在进行转换
//如果p接收的是子类对象
if(父类变量 instance 子类){
//则可以将p转换为子类类型
子类 变量名 = (子类)父类变量;
就可以调用子类的独有方法
final关键字是最终的意思,可以修饰类、修饰方法、修饰变量。
都是用abstract修饰的;抽象方法只有方法签名,不能写方法体
抽象类中可以不写抽象方法,但有抽象方法的类一定是抽象类
功能其实是更好地支持多态,把功能抽象出来,其实也和多态继承重写一个意思,不过这样的化更加专业,最佳实践。
父类知道每个子类都要做某个行为但每个子类要做的情况不是父类定,交给子类去重写实现,我们抽出这样的抽象类,就是为了更好的支持多态
模板方法模式解决了多个子类中有相同代码的问题。具体实现步骤如下:
模板方法设计模式的写法
1、定义一个抽象类
2、在定2个方法
接口中只有抽象方法和常量
public interface 接口名{
//成员变量(常量)
//成员方法(抽象方法)
}
一个类可以实现多个接口(接口可以理解成干爹),实现类实现多个接口,必须重写完全部接口的全部抽象方法,否则实现类需要定义成抽象类。
class Student{
}
interface Driver{
void drive();
}
interface Singer{
void sing();
}
//A类是Student的子类,同时也实现了Dirver接口和Singer接口
class A extends Student implements Driver, Singer{
@Override
public void drive() {
}
@Override
public void sing() {
}
}
public class Test {
public static void main(String[] args) {
//想唱歌的时候,A类对象就表现为Singer类型
Singer s = new A();
s.sing();
//想开车的时候,A类对象就表现为Driver类型
Driver d = new A();
d.drive();
}
}
解释:
1、使用接口有啥好处,第一个好处是什么?
2、为什么我们要通过接口,也就是去找干爹,来扩展自己的功能呢?
3、使用接口的第二个好处是什么?
Driver d = new A();
d.drive();
这里使用接口Driver指向实现类对象,后期可以随时修改实现类,达到接口的一个多态形式
功能: 实际开发中用得最多的一种内部类
new 父类/接口(参数值){
@Override
重写父类/接口的方法;
}
下面是具体实现代码:
public interface Swimming{
public void swim();
}
public class Test{
public static void main(String[] args){
Swimming s1 = new Swimming(){
public void swim(){
System.out.println("狗刨飞快");
}
};
go(s1);
Swimming s1 = new Swimming(){
public void swim(){
System.out.println("猴子游泳也还行");
}
};
go(s1);
}
//形参是Swimming接口,实参可以接收任意Swimming接口的实现类对象
public static void go(Swimming s){
System.out.println("开始~~~~~~~~");
s.swim();
System.out.println("结束~~~~~~~~");
}
}
可以发现我们把匿名内部类创建的类对象作为方法传入到方法中,减少了一个类的创建,简化开发人员的工作。