java面向对象基础

面向对象

如何创建一个对象通过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());
    }
}

继承

  1. 继承可以使代码重用
  2. 继承可以扩展父类
  3. 继承可以更抽象的描述类之间的关系
  4. java语言不支持多继承
  5. 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();
    }
}

接口

  1. 接口是一种约束
  2. 接口不能实例化,不能有构造方法
  3. 一个类可以实现多个接口(类似于多继承)
  4. 接口的所有方法都是共有抽象的,所有的属性都是共有静态常量的
//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类构造
        */
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值