面向对象编程笔记

什么是面向对象

面向过程&面向对象

什么是面向对象



回顾方法的定义

回顾方法及加深

public class Demo01 {

    //main 类
    public static void main(String[] args) {
        new Demo01();
    }
    /*
    修饰符   返回值类型   方法名(){
          //方法体
          return 返回值;
    }
     */
    //return  结束方法,返回一个结果!
    public String sayHello(){
        return "hello,world!";
    }
    public  int max(int a,int b){
        return a>b ? a:b;  //三元运算符
    }

    //数组下标越界:Arrayindexoutofbounds
    public void readFile(String file) throws IOException {
    }
}

回顾方法的调用

public class Student {
    //方法
    public static void main(String[] args) {
    }
    public static void  say(){
        System.out.println("学生说话了");
    }
}
public class Demo02 {
    //静态方法  static
    //非静态方法
    public static void main(String[] args) {
        //Student.say();
        //实例化
        //对象类型  对象名  =对象值;
        Student student = new Student();
        student.say();
    }
    //和类一起加载的
    public static void a(){
        b();
    }
    //类实例化  之后才存在
    public static void b(){}

}
public class Demo03 {
    public static void main(String[] args) {
        //实际参数和形式参数的类型要对应
        int add = add(1, 2);
        System.out.println(add);
//        new Demo03().add(1,2);
        System.out.println(new Demo03().add(1,2));
        System.out.println(add(1,2));
    }
    public  static int add(int a,int b){
         return a+b;
    }
}
public class Demo04 {
    public static void main(String[] args) {
        int a =1;
        System.out.println(a);
        Demo04.change(a);
        System.out.println(a);
    }
    //返回值为空
    public static void change(int a ){
        a=10;
    }
}
//引用传递
public class Demo05 {

    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.name);//null
        Demo05.change(person);
        System.out.println(person.name);//wang
    }
    public static void change(Person person){
        person.name ="wang";
    }
}

//定义了一个Person类,有一个属性:name
class Person{
    String name;
}

类与对象的创建

类与对象的关系

创建与初始化对象

构造器详解

alt+insert

public String name;//此处不加public也行,加public的原因是:
public int age;    //public的权限较高,以后还会学习私有的,目前知道就行

类的小结与对象

/*
1.类与对象
类是一个模板:抽象,对象是一个具体的实例
2.方法
定义,调用!
3.对应的引用
引用类型:  基本类型(8)
对象是通过引用来操作的: 找---》堆
4.属性:字段Field  成员变量
默认初始化:
数字:0   0.0
char:  u0000
boolean:  false
引用:  null

修饰符  属性类型 属性名  ==属性值!

5.对象的创建和使用
- 必须使用new  关键字创造对象,构造器 Person wang=new Person();
-对象的属性 wang.name
-对象的方法 wang.sleep()

6.类:
静态的属性  属性
动态的行为 方法

JAVA三大特性:封装、继承、多态

 */

封装详解

什么是继承

package oop.Demo04;
public class Student {
    //属性私有
    private String name;//名字
    private int id; //学号
    private char sex;//性别
    private int age;//年龄
    //提供一些可以操作这个属性的方法!
    //提供一些public的get.set方法
    //get 获得这个数据
    public String getName(){
        return this.name;
    }
    //set 给这个数据设置值
    public void  setName(String name ){
        this.name=name;
    }
    public int getId(){
        return id;
    }
    public  void setId0(int id){
        this.id=id;
    }
    public  char geSex(){
        return sex;
    }
    public void setSex(char sex){
        this.sex=sex;
    }
    public int getAge(){
        return age;
    }
    public void setAge(int age){
        if (age>120||age<0){
            age=3;
        }
            this.age=age;
        this.age =age;
    }

}
package oop.Demo04;

/*
1.提高程学的安全性,保护数据
2.隐藏代码的实现细节
3.统一接口
4.系统可维护性增加
 */
public class Application {
    public static void main(String[] args) {

        Student s1 = new Student();

        s1.setName("张三");

        System.out.println(s1.getName());

        s1.setAge(18);
        System.out.println(s1.getAge());
    }
}

super详解

//学生  is  人 : 派生类,子类
//子类继承父类,就会拥有父类的全部方法!
public class Student extends Person {

    public Student(){
        //隐藏代码:调用了父类的无参构造
        super();//调用父类的构造器,必须要在子类构造器的第一行
        System.out.println("Student无参执行了");
    }
    private String name="lisi";
    public void print(){
        System.out.println("Student");
    }
    public void test(){
        print(); //Student
        this.print();;//Student
        super.print();//Person
    }
    public void test(String name){
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
    }
}
//在Java中,所有的类,都默认直接或者间接继承Object
//Person 人 :父类

public class Person/*extend Object*/{

    public Person(){
        System.out.println("Person无参执行了");
    }
    protected String name="zhangsan";

    //私有的东西无法被继承
    public void print(){
        System.out.println("Person");
    }

}
public class Application01 {

    public static void main(String[] args) {
        Student student = new Student();
//        student.test("李四");
//        student.test();
    }
}
super注意点
    1.super调用父类的构造方法,必须在构造方法的第一个
    2.super必须只能出现在子类的方法或者构造器中!
    3.super和this不能同时调用构造方法!
Vs this:
    代表的对象不同:
        this: 本身调用者这个对象
        super: 代表对象的应用
    前提
        this: 没有继承也可以使用
        super:只能在继承条件下可以使用
    构造方法
        this():本类的构造
        super():父类的构造!

方法重写

package oop.demo05;

public class Application02 {

    public static void main(String[] args) {

        //方法的调用只和左边定义的数据类型有关
        A a =new A();
        a.test();

        //父类的引用指向了子类
        B b=new A();
        b.test();
    }
}
package oop.demo05;

public class A extends B{
    @Override//注解:有功能的注释!
    public void test() {
        System.out.println("A=>test()");
    }
}
package oop.demo05;

//重写都是方法的重写,和属性无关
public class B {

    public   void test(){
        System.out.println("B=>test()");
    }
}
重写:需要有继承关系,子类重写父类的方法!
   1.方法名必须相同
   2.参数列表必须相同
   3.修饰符,范围可以扩大:  public>Protected>Dafault>private
   4.抛出的异常:范围,可以被缩小,但不能扩大: ClassNotFoundException-->Exception(大)

重写, 子类的方法和父类一致:方法体不同!

为什么需要重写
    1.父类的功能,子类不一定需要,或者不一定满足
    Alt+Insert: override

什么是多态

package oop.Demo06;

public class Person{

    public void run(){
        System.out.println("run");
    }

}

/*
多态注意事项
1.多态是方法的多态,属性没有多态
2.父类和子类,有联系  类型转换异常! ClassCastException!
3.存在条件: 继承关系,方法需要重写,父类引用指向子类对象!  father f1=new Son();

   1.static 方法,属于类,它不属于实例
   2.final  常量
   3.private方法
 */
package oop.Demo06;

public class Student extends Person{
    @Override
    public void run() {
        System.out.println("son");
    }

    public void eat(){
        System.out.println("eat");
    }

}
package oop.Demo06;

public class Application {
    public static void main(String[] args) {
        //一个对象的实际关系类型是确定的
        //new Student();
        //new Person();

        //可以指向的引用类型就不确定了;父类的引用指向子类

        //Student 能调用的方法都是自己的或者继承父类的!

        Student s1=new Student();

        //Person 父类型,可以指向子类,但是不能调用子类独有的方法

        Person s2=new Student();
        Object s3=new Student();

        s2.run();//子类重写了父类的方法,执行子类的方法
        s1.run();

        //对象能执行哪些方法,主要看对象左边的类型,和右边关系不大!
        s1.eat();  //子类重写了父类的方法,执行子类的方法


    }
}

instanceot和类型转换

public class Application {
    public static void main(String[] args) {


//Object > String
//Object > Person > Teacher
//Object > Person > Student

Object object  = new oop.Demo06.Student();

//System.out.println(X instanceof V);能不能编译通过

System.out.println(object instanceof Student);  //ture
System.out.println(object instanceof Person);   //ture
System.out.println(object instanceof Object);   //ture
System.out.println(object instanceof Teacher);  //fasle
System.out.println(object instanceof String);   //fasle
System.out.println("===================");
Person person=new Student();
System.out.println(person instanceof Student);  //ture
System.out.println(person instanceof Person);   //ture
System.out.println(person instanceof Object);   //ture
System.out.println(person instanceof Teacher);  //Fasle
//System.out.println(person instanceof String); //编译器错!
System.out.println("=======================");
Student student=new Student();
System.out.println(student instanceof Student);  //ture
System.out.println(student instanceof Person);   //ture
System.out.println(student instanceof Object);   //ture
//System.out.println(student instanceof Teacher);//编译器错
//System.out.println(student instanceof String); //编译器错
}
}

public class Application {
    public static void main(String[] args) {
        //类型之间的转化: 父  子

        //高

        //Person obj = new Student();
        //student.go();  //go 报错

        //student 将这个对象转换为Student类型,我们就可以使用Student类型的方法了!

        //Student student=(Student) obj;
        //student.go();

        //((Student)obj).go();


        //子类转换为父亲,可能丢失自己的本来的一些方法!
        Student student = new Student();
        student.go();
        Person person=student;


    }
}

static关键字详解

package oop.Demo07;

public class Student {

    private static int age; //静态的变量
    private double score;   //非静态的变量


    public void run(){
        go();
    }

    public static void go(){}

    public static void main(String[] args) {

        Student.go();//go();也行

    }
    
//    public  static void main(String[] args){
//        Student s1= new Student();
//        System.out.println(Student.age);
//        System.out.println(s1.age);
//        System.out.println(s1.score)
//
//    }

}
package oop.Demo07;

public class Person {

    //2:赋初值

    {
        System.out.println("匿名代码块");
    }

    //1:只执行一次
    static {
        System.out.println("静态代码块");
    }
    public Person(){
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Person person1 = new Person();
        System.out.println("===========");
        Person person2 = new Person();


    }











//    {
//        //代码块(匿名代码块)
//    }
//
//    static {
//        //静态代码块
//    }

}
package oop.Demo07;

//静态导入包~
import static java.lang.Math.random;
import static java.lang.Math.PI;

public class Test01 {

    public static void main(String[] args) {
        System.out.println(random());
        System.out.println(PI);
    }

}

抽象类

//abstract  抽象类:类extend:    单继承~    (接口可以多继承)
public abstract class Action {

    //约束~ 有人帮我们实现~
    //abstract,抽象方法,只有方法名字,没有方法的实现!
    public abstract void doSomething();

    //1.不能new这个抽象类,只能靠子类去实现它:约束
    //2.抽象类中可以写普通的方法~
    //3.抽象方法必须在抽象类中~
    //抽象的抽象:约束~

    //思考题?  new, 存在构造器么?
    //存在的意义   抽象出来~ 提高开发效率

    public void hello(){}


}
package oop.Demo08;
//抽象类的所有方法,继承了它的子类,都必须要实现它的方法~除非~
public class A extends Action {
    @Override
    public void doSomething(){}
}

接口的定义与实现

package oop.Demo09;

//抽象的思维~Java 架构师

//interface 定义的关键字 ,接口都需要有实习类
public interface UserService {

    //常量 public static final

    int AGE=99;

    //接口中的所有定义的方法其实都是抽象的 public  abstract

    void add(String name);
    void delete(String name);
    void update(String name);
    void query(String name);


}
package oop.Demo09;

public interface TimeService {

    void timer();
}
package oop.Demo09;

//抽象类: extend~
//类  可以实现接口 implements
//实现了接口的类,就需要重写接口中的方法

//多继承~ 利用接口实现多继承~
public class UserServiceImpl implements UserService,TimeService{
    @Override
    public void add(String name){

    }
    @Override
    public void delete(String name){
    }
    @Override
    public void update(String name){
    }
    @Override
    public void query(String name){
    }
    @Override
    public void timer(){

    }
}
作用:
    1.约束
    2.定义一些方法,让不同的人实现~  10 --> 1
    3.public abstract
    4.public static final
    5.接口不能被实例化,接口中没有构造方法
    6.implements可以实现多个方法
    7.必须要重写接口中的方法
    8.总结博客

N种内部类

package oop.Demo10;

public class Outer {

    //局部内部类
    public void method(){
        class Inner{
            public  void in(){

            }
        }
    }


//
//    private int id=10;
//    public void out(){
//        System.out.println("这是外部类的方法");
//    }
//
//    class static class Inner{
//        public void in(){
//            System.out.println("这是内部类的方法");
//        }
//    }

}
//一个java类中可以有多个class类,但是只能有一个public class
//class A{
//    public static void main(String[] args) {
//
//    }
//
//
//
//}
package oop.Demo10;

public class Application01 {

    public static void main(String[] args) {
        Outer outer=new Outer();


    }

}
package oop.Demo10;


public class Test{
    public static void main(String[] args) {
        //没有名字初始化类,不用讲实例保存到变量中
        new Apple().eat();

        new UserService(){

            @Override
            public void hello() {

            }
        };
    }
}

class Apple{
    public void eat(){
        System.out.println("1");
    }
}
interface UserService{

    void hello();
}

Error和Exception

捕获和抛出异常

package exception;

public class Test01 {

    public static void main(String[] args) {
        new Test01().test01(1,0);

    }
    //假设这方法中,处理不了这个异常,方法上抛出异常
    public void test01(int  a,int b){
        if (b==0){
            throw new ArithmeticException();//主动的抛出异常,一般作方法中使用
        }
    }
}


//        int a =1;
//        int b=0;
//
//        //假设捕获多个异常:  从小到大!
//
//        try { //try监控区域
//            if (b==0){ // throw  throws
//                throw new ArithmeticException(); //主动的抛出异常
//            }
//
//            new Test01().a();
//        }catch(Error e){ //catch(想要捕获的异常类型!) 捕获异常
//            System.out.println("Error");
//        }catch(Exception e){
//            System.out.println("Exception");
//        }catch(Throwable t){
//            System.out.println("Throwable");
//        }finally{ //处理善后工作
//            System.out.println("finally");
//        }
//
//        //finally  可以不要finally ,假设10,资源,关闭!
//
//    }
//
//    public void a(){b();}
//    public void b(){a();}
package exception;

public class Test02 {
    public static void main(String[] args) {
        int a =1;
        int b =0;


        //Ctrl + Alt +T
        try {
            System.out.println(a/b);
        } catch (Exception e) {
            e.printStackTrace(); //打印错误的栈信息
        } finally {
        }
    }
}

自定义异常及经验小结

package exception.Demo02;

public class Test01 {

    //可能会存在异常的方法


    static void test(int a)throws MyException{

        System.out.println("传递的参数为:"+a);

        if (a>10){
            throw new MyException(a); //抛出
        }
        System.out.println("OK");

    }
    public static void main(String[] args){
        try {
            test(11);
        }catch (MyException e){
            System.out.println("MyException=>"+ e);

        }
    }


}
package exception.Demo02;

//自定义的异常类
public class MyException extends Exception{

    //传递数字>10;
    private int derail;
    public MyException(int a ){
        this.derail=a;
    }

    //toString
    @Override
    public String toString(){
        return "MyException{"+derail+'}';
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值