面向对象
如何创建一个对象通过new 关键字来创建
类是一个模板可以创建多个对象
class Student {
//访问修饰符 数据类型 变量名
//这些都叫类的属性,属性没有访问修饰符默认外界是不可以访问的
private int id;
private String name;
private char sex;
private int age;
//构造函数描述一个类如何初始化
public Student(int id, String name, char sex, int age) {
//this关键字代表当前对象本身
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
//方法
public void attendClass() {
System.out.println(name + "正在上课");
}
public static void main(String[] args) {
//创建对象
Student student = new Student(007, "王五", '女', 53);
//调用方法
student.attendClass();
}
}
封装
封装是通过属性私有化来管理类的
封装的目的是维持数据的完整性,使用对象更安全
一般要写get和set方法
class Student {
//访问修饰符 数据类型 变量名
//这些都叫类的属性,属性没有访问修饰符默认外界是不可以访问的
private int id;
private String name;
private char sex;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//构造函数描述一个类如何初始化
public Student(int id, String name, char sex, int age) {
//this关键字代表当前对象本身
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
//方法
public void attendClass() {
System.out.println(name + "正在上课");
}
public static void main(String[] args) {
//创建对象
Student student = new Student(1007, "王五", '女', 53);
//调用方法
student.attendClass();
//要想修改对象内部的值可以使用set方法
student.setName("杭四");
student.setId(772);
student.setAge(33);
student.setAge(43);
//要想获取对象内部的属性值可以使用get方法
System.out.println(student.getName());
}
}
继承
- 继承可以使代码重用
- 继承可以扩展父类
- 继承可以更抽象的描述类之间的关系
- java语言不支持多继承
- final关键字修饰的类不能继承,final修饰的方法不能被重写
java中所有的类都会默认继承Object类
Object类是所有类的最高抽象
重写父类方法时抛出的异常时不能比父类的异常大
class Fish {
private String name;
private String category;
public Fish(String name, String category) {
this.name = name;
this.category = category;
}
//protected 关键字表示其他包不能使用此方法,或者属性
protected void behavior() throws Exception {
System.out.println(name + "在游");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
//extends 关键字表示继承 子类拥有父类的所有共有和保护方法,所有的共有,和保护属性
class FlyingFish extends Fish {
private String flight;
public FlyingFish(String name, String category, String flight) {
super(name, category);//用来初始化父类值,此语句必须是构造方法的第一条语句
this.flight = flight;
}
// @Override 关键字表示重写此方法,名字返回值参数必须与父类一样
@Override//子类的访问权限可以大于父类但不能小于父类,异常不能抛出比父类大的异常,一个方法可以抛出多个异常
public void behavior() throws Exception, ExecutionException {
super.behavior();//可以调用父类方法
System.out.println(super.getName() + flight);
}
public static void main(String[] args) throws Exception {
FlyingFish flyingFish = new FlyingFish("飞鱼", "咸水鱼", "我会飞");
flyingFish.behavior();
}
}
多态
多态是方法的多态属性没有多态效果
class A {
public void rud() {
System.out.println("我是父类的rud()方法");
}
public void lk() {
System.out.println("我是父类的lk()方法");
}
}
class B extends A {
public void gf() {
System.out.println("我是子类的gf()方法");
}
@Override
public void rud() {
super.rud();
}
public static void main(String[] args) {
//左边类型
A v1 = new B();//右边类型
// v1.gf() 父类没有其方,多态只能用在重写的方法上,否则由左边的类型决定
v1.lk();//调用父类的方法
v1.rud();//调用子类的方法,其方法是重写的由右边的类型决定
B v2 = new B();//其可以调用父类继承下来的方法,和本类的方法
v2.gf();
}
}
如果2个类转换失败会抛出转换异常
class A {
public void rud() {
System.out.println("我是父类的rud()方法");
}
public void lk() {
System.out.println("我是父类的lk()方法");
}
}
final class M {
}
class B extends A {
public void gf() {
System.out.println("我是子类的gf()方法");
}
@Override
public void rud() {
super.rud();
}
public static void main(String[] args) {
//继承体系中只能父类引用其子类
// B v1=(B)new A();此处会抛出转换异常ClassCastException
/*
Exception in thread "main" java.lang.ClassCastException: A cannot be cast to B
at B.main(Doc.java:44)
*/
//如果想判断是否能转换可以使用instanceof关键字可以转换返回true
A v3 = new A();
//父类不能转换为子类
if (v3 instanceof B) {
System.out.println("可以转换");
B v = (B) v3;
} else {
System.out.println("不能转换");
}
}
}
抽象类
//abstract 关键字代表本类无法被创建
abstract class People {
private String name;
private int age;
private char sex;
public People(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public People() {
}
public abstract void language();//抽象方法可以不用实现
//抽象类可以拥有实例方法
public void eat() {
System.out.println("在吃东西");
}
}
//如果子类继承抽象类不实现抽象方法就必须设置为抽象类
abstract class Savage extends People {
}
//子类继承抽象父类的方法必须实现父类的抽象方法
class ChinesePeople extends People {
public ChinesePeople() {
}
public ChinesePeople(String name, int age, char sex) {
super(name, age, sex);
}
//实现抽象类的方法
@Override
public void language() {
System.out.println("汉字");
}
//重写抽象类的方法
@Override
public void eat() {
System.out.println("在吃米饭");
}
public static void main(String[] args) {
//People people=new People(); 无法创建抽象类的对象
People people = new ChinesePeople();
people.eat();
}
}
接口
- 接口是一种约束
- 接口不能实例化,不能有构造方法
- 一个类可以实现多个接口(类似于多继承)
- 接口的所有方法都是共有抽象的,所有的属性都是共有静态常量的
//interface关键字用来声明接口
abstract interface A {
public abstract void a();
}
interface B {
public final static int BsT = 22222;
public abstract void b();
}
//可以实现多个接口使用implements关键字
class C implements A, B {
//必须实现每个接口的方法,否则该类是抽象类
@Override
public void a() {
//使用接口定义的常量
System.out.println(B.BsT);
}
@Override
public void b() {
}
}
内部类(奇葩)
成员内部类
public class A {
public void t() {
System.out.println("我是外部类");
}
private static int id;
//成员内部类不能拥有静态方法
public class B {
public void s() {
//成员类部类可以使用外部类的所有方法和属性
id = 22;
System.out.println("我是内部类");
}
}
public static void main(String[] args) {
A a = new A();
//必须通过外部类类创建内部类
A.B b = a.new B();
b.s();
}
}
静态成员内部类
public class A {
public A() {
System.out.println("我是外部类构造");
}
public void t() {
System.out.println("我是外部类");
}
private int id = 2;
//静态成员内部类可以拥有静态方法
public static class B {
public B() {
System.out.println("我是内部类构造");
}
public static void s() {
//静态方法不能使用非静态属性
// id = 22;
System.out.println("我是内部类");
}
}
public static void main(String[] args) {
A a = new A();
// //不需要通过外部类创建
A.B b = new B();
b.s();
}
}
局部内部类
public class A {
public A() {
System.out.println("我是外部类构造");
}
private void d() {
System.out.println("ddddd");
}
public void s() {
//局部内部类
class p {
public void j() {
d();//可以访问外部的所有方法属性
}
}
//只能在局部创建
new p();
}
public static void main(String[] args) {
A a=new A();
}
}
匿名内部类
public class A {
public static void main(String[] args) {
//匿名类部类
new B() {
@Override
public void s() {
}
};
}
}
扩展
静态代码块
//静态导入包
import static java.lang.Math.E;
import static java.lang.Math.sqrt;
class A {
private int s;
private static int p;
public A() {
System.out.println("A类构造");
}
//普通代码块创建多个对象,会执行多次
{
System.out.println("A类普通代码块");
}
//静态代码块创建多个对象,只会执行一次,静态代码块不能调用非静态属性
static {
System.out.println("A类静态代码块");
}
public static void main(String[] args) {
sqrt(E);//静态导入的方法和属性可以直接使用不用加全称限定符
A a = new A();
/*
A类静态代码块
A类普通代码块
A类构造
*/
}
}