抽象类

  • 没有方法体的方法叫做抽象方法,必须用abstract
  • 抽象类不一定有抽象方法
  • 有抽象方法的类一定是抽象类
abstract class A{
    abstract public void f():
}
class B extends A{
    public void f(){
        System.out.println("bbb");
    }
}
public class T{
    public static void main(String[] args){
        A aa;//可以定义一个抽象类的引用,但不可以定义一个抽象类的引用
        aa=bb;
        aa.f();//实现多态
    }
}

final

  • 可以修饰整个类

表示该类不能被继承

public final class A{}//public和final可互换
  • 可以修饰类中的若干个属性

表示常变量,必须赋初值,并且只能被赋一次值,默认值不算真正的赋值

初始化两种方法:
在定义成员变量的同时初始化
在类中所有的构造函数中初始化

  • 可以修饰类中的若干个方法

表示该方法可以被子类继承,但不可以被子类重写

接口

  • 接口中定义的属性必须是public static final的,定义的方法是public abstract可省略
  • 接口定义的属性在类里不能被更改
  • 接口可以继承多个接口
  • 如果一个类只 实现了一个接口的部分方法,则该类必须要声明为抽象类
  • 一个类可以在继承一个父类的同时实现一个或多个接口但extends关键字必须在implements之前
  • 不可以new接口对象,但可以定义一个接口引用类型的变量并将其指向实现接口的对象,达到多态的目的

局部变量不初始化会报错,属性和形参不初始化会有默认值

interface It{
    void f();
}
class A implements It{
        public void f(){  //前面必须写public ,不能权限过低
        System.out.println("aaa");
    }
        public void g(){
    }
}
class D{
    public static void main(String[] args){
       It it;//不出错
        it=new A();
        it.f(); 
        it.g();//error,父类接口不能访问子类特有方法
    }
}

面向对象特点

封装:

访问控制符

  • 只有private的不能在外部访问
  • 类内部访问透明

构造方法
定义:名字和类名一样,无返回值

注意事项:

  • 一个类对象只能调用一个构造方法
  • 一个类至少有一个构造方法
  • 如果自己定义了构造方法,编译器将不再提供默认的构造方法

this: 一个对象只含有属性的空降,n个对象公共一份方法的拷贝
static

继承
  • java允许单继承
  • 私有成员无法被继承
  • 重写:方法名和参数列表和返回值必须一致,访问权限不能过低
多态

package zhangsan.lisi;
  • package语句必须得是第一条语句
  • package zhangsan.lisi;表示:把该文件中所有类放在zhangsan.lisi这个包中,并且文件中所有的类真正名字将是包名和类名的组合
  • 类名将变成zhangsan.lisi.类名
  • 编译时建议使用javac -d . 类名.java

set classpath 查看=可设置classpath变量

不同包类的相互访问

package zhangsan.lisi;
public class A{
    public void f(){
        System.out.println("aaa");
    }
}

package com.ruide;
import zhangsan.lisi.*;
class B{
    public static void main(String[] args){
        //zhangsan.lisi.A aa=new zhangsan.lisi.A();
        A aa=new A();
        aa.f();
    }
}

两个文件一起编译 javac -d. A.java B.java

  • 在不同包没有任何关系的两个类,只有public类的public成员才可以被另一个包中的类访问
  • 在不同包中有继承关系的两个类,只有public类的public成员和public类的protected成员可以被另一个包中的子类在内部使用,但是在子类的外部,通过子类对象名只能访问父类的public成员
package zhangsan.lisi;
public class A{
    public void g(){
        System.out.println("gggg");
    }
    protected void b(){
        System.out.println("bbbb");
    } 
}


package com.ruide;
import zhangsan.lisi;
class B extends A{
    public void f(){
        g();
        b();//在子类内部可以访问从另一个包继承过来的父类的public和protected成员
    }
}
class M{
    public static void main(String[] args){
        B bb=new B();
        bb.b();//
    }
}

生成jar包

jar cvf T.jar*

  • cvf 参数
  • T jar包名字
  • *当前目录下的全部文件

jar包双击打不开,用压缩工具
jar -tf c.jar 这个包解压后的文件内容