栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

后端开发学习日志(面向对象篇)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

后端开发学习日志(面向对象篇)

目录

一、初识面向对象

什么是面向对象

二、回顾方法的定义

1)方法的语法

2)break和return的区别 

3)方法名 

4)参数列表

5)异常抛出

三、回归方法的调用

四、类和对象的创建

如何创建对象?

 五、构造器详解

六、创建对象内存分析

七、封装

 八、继承

Super详解

九、方法重写

十、多态

 instanceof

强制转化

十一、static关键字详解

十二、抽象类

十三、接口

 十四、N种内部类


一、初识面向对象

面向过程思想:
1.步骤清晰简单,第一步做什么,第二步做什么.....
2.面对过程适合处理一些较为简单的问题

面向对象思想:
1.物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
2.面向对象适合处理复杂的问题,适合处理需要多人协作的问题

对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。

什么是面向对象

面向对象编程英文全称为Object-Orjented Programming,简称为OOP。其本质是以类的方式组织代码,以对象的组织(封装)数据。

核心思维:抽象

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

从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象

从代码运行角度考虑是先有类后有对象。类是对象的模板。

二、回顾方法的定义

1)方法的语法
修饰符  返回值类型   方法名(...){
       //方法体
       return 返回值;
    public String sayhello(){
        return "hello world";
    }
    public void hello(){
        return;
    }

    public int max(int a , int b){
        return a > b ?a :b;
    }

2)break和return的区别 

break可以跳出switch语句;结束循环

return代表方法结束,返回一个结果;返回值必须与返回值类型相同

3)方法名 

注意规范即可。
见名知意:如果不知道方法名意思可以看着方面名去猜测

4)参数列表

参数类型和参数名可以有多个

5)异常抛出

见后文

三、回归方法的调用

方法分为静态方法(static)和非静态方法

 public void a(){
       b()
    }
public  void b(){

    }

以上没有静态方法,a可以直接调用b。

  public static void a(){
       b()
    }

    //类实例化之后才存在
    public static void b(){

    }

两个都是静态方法,a也可以直接调用b

 public static void a(){
       b()
    }

    
 public void b(){

    }

若a是静态方法而b不是,a无法直接调用b。这是因为a是和一起加载的,b是对象创建之后加载的,类实例化后才存在。

        int add = Demo03.add(1,2);
        System.out.println(add);


    }

    private static int add(int a, int b) {
    return a+b;
    }

实际参数和形式参数的类型要对应。

值传递:

        int a = 1;
        System.out.println(a);

        Demo04.change(a);

        System.out.println(a);
    }

    public static void change(int a){
        a = 10;

    }

引用传递:

    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.name);

        Demo05.change(person);

        System.out.println(person.name);

    }

    public static void change(Person person){
        person.name = "xiaoxian";

    }

四、类和对象的创建

类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物。像动物、植物、手机、电脑...都是抽象的概念。这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为。

对象是抽象概念的具体实例。张三就是一个人的具体实例,张三家里的旺财就是狗的一个具体实例。能够体现出特点,展现出功能的是具体的实例,而不是一个抽象的概念。

如何创建对象?

使用new关键字创建对象。使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。

类中的构造器也称为构造方法,是在进行创建对象的时候必须调用的。并且构造器有以下两个特点:

1.必须和类的名字相同

2.必须没有返回类型,也不能写void

//学生类
public class Student {

    //属性:字段
    String name;
    int age;


    //方法
    public void study(){
        System.out.println(this.name+"学生在学习");
    }

}

测试类: 

public class Application {

    public static void main(String[] args) {

        //类:抽象的,实例化
        //类实例化后会返回一个自己的对象
        //student对象就是一个Student类的具体实例
        Student xiaoming = new Student();
        Student xh = new Student();

        xiaoming.name = "小明";
        xiaoming.age = 6;

        System.out.println(xiaoming.name);

        System.out.println(xiaoming.age);

        xh.name = "小红";
        xh.age = 6;
        System.out.println(xh.name);
        System.out.println(xh.age);
    }
}

 
五、构造器详解

特点:

方法名和类名相同没有返回值作用:

1.new本质在调用构造器方法

2.初始化对象的值

idea快捷键: Alt+insert

注意点:定义了有参构造之后,如果还想使用无参构造,必须要显式地定义一个无参的构造。

//java----> class
public class Person {
    
    String name;
    int age;

    //显示的定义构造器
    //一个类即时什么也没写,它也会存在一个隐式的构造器方法(无参,默认值)

    public Person(){
    this.name = "xiaoxian" ;
   }

}

1. 使用new关键字,必须要有构造器

2.用来初始化值

有参构造

    public Person(){

    }
    public Person(String name){
        this.name = name;

一旦定义了有参构造,无参就必须显示定义

构造器:
1.和类名相同
2.没有返回值

作用:
1. new本质在调用构造方法
2.初始化对象的值
注意点:
定义有参构造之后,如果想使用无参构造,显示的定义一个无参的构造

六、创建对象内存分析
import oop.demo03.Pet;

public class Application {

    public static void main(String[] args) {

        Pet dog = new Pet();
        dog.name = "旺财";
        dog.age = 3;
        dog.shout();

        System.out.println(dog.name);
        System.out.println(dog.age);

    }
}
public class Pet {

    public String name;
    public int age;

    public void shout(){
        System.out.println("叫了一声");


    }
}

输出结果为:

叫了一声
旺财
3 

 

 小结:

1。类与对象
类是一个模板:抽象,对象是一个具体的实例
2.方法
定义、调用!
3.对应的引用
引用类型:基本类型(8)
对象是通过引用来操作的:栈--->堆
4.属性:字段FieLd 成员变量
默认初始化:
数字:0.0
char : u0000
boolean:false
引用: null
修饰符   属性类型    属性名 = 属性值!
5.对象的创建和使用
-必须使用new关键字创造对象,构造器 Person kuangshen = new Person( );
        -对象的属性kuangshen.name
-对象的方法kuangshen.sleep()
6.类:
静态的属性    属性
动态的行为    方法

七、封装

1.该露的露,该藏的藏。

我们程序设计要追求”高内聚,低耦合“。
高内聚就是类的内部数据操作细节自己完成,不允许外部干涉。
低耦合:仅暴露少量的方法给外部使用。

封装(数据的隐藏)
通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏.

记住这句话就够了:属性私有,get/set

//类 private:私有

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;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getId() {
                return id;
        }

        public void setId(int id) {
                this.id = id;
        }

        public char getSex() {
                return sex;
        }

        public void setSex(char sex) {
                this.sex = sex;
        }

        public int getAge() {
                return age;
        }

        public void setAge(int age) {
                if(age<0||age>120){//不合法的输入
                        this.age = 3;
                }else{
                        this.age = age;
                }
        }

}
import oop.demo04.Student;


public class Application {


        public static void main( String[ ] args) {
            Student s1 = new Student( );
            s1.setName("小贤");
            System.out.println(s1.getName());

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

 优点:
1.提高程序的安全性,保护数据
2.隐藏代码的实现细节
3.统一接口
4.系统的可维护性增加了

 八、继承

继承的本质是对某—批类的抽象,从而实现对现实世界更好的建模.
extends的意思是“扩展”。子类是父类的扩展。
JAVA中类只有单继承,没有多继承
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
继承关系的俩个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
子类和父类之间,从意义上讲应该具有"is a"的关系

优先级:public>protected>default>private

 我们创立一个”person“的文件,再创立”Student"和“Teacher”两个文件作为子集,我们对Person进行编写:

public class Person {

    public int money = 10_0000_0000;
    public void say(){
        System.out.println("说了一句话");
    }
}

在Application中写以下代码

import oop.demo05.Student;


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

        Student student = new Student();
        student.say();
        System.out.println(student.money);
    }

}

可以发现Student继承了Person里中的money。如果我们将person改为private,则不能继承,但我们可以通过一些方法获取:

public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}

在Java中,所有的类,都默认直接或者间接继承Object

Super详解

super注意点:

super调用父类的构造方法,必须在构造方法的第一个

super 必须只能出现在子类的方法或者构造方法中。

super和 this不能同时调用构造方法!(因为super();和this();都必须在第一行)

与this的不同:

代表的对象不同:
​​​​​​​​​​​​​​this:本身调用者这个对象
super:代表父类对象的应用

前提
this:没有继承也可以使用
super:只能在继承条件才可以使用

构造方法
super():父类的构造
this();本类的构造

//父类
public class Person {

    public Person() {
        System.out.println("Person无参执行了");
    }

    protected String name = "gsx";

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

//派生类
// Student: 派生类,子类
public class Student extends Person {
    public Student() {
        //隐藏代码,如果未显式调用父类构造器,默认调用父类无参构造
        //super();
        // 调用父类构造器或子类的其他构造器,必须在构造器的第一行
        System.out.println("Student的无参执行了");
    }
    public Student(String name){
        this.name = name;
    }

    private String name = "xian";

    public void print( ){
        System.out.println("Student");
    }
    public void test1(){
        print();
        this.print();
        super.print();
    }
    public void test(String name) {
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);

    }

}

import oop.demo05.Student;
import oop.demo05.Person;
//执行类
public class Application {
        public static void main(String[] args) {
            Student student = new Student();
            // student.test("芸");
            //student.test1();

        }
}

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

    public static void test(){
        System.out.println("B=>test()");
    }


}
//子类
public class A extends B{

    public static void test(){
        System.out.println("A=>test()");
    }


}
import oop.demo05.A;
import oop.demo05.B;

//执行类
public class Application {
        public static void main(String[] args) {

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

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

 输出结果:

A=>test()
B=>test()

 重写:
需要有继承关系,子类重写父类的方法!
1.方法名必须相同
2.参数列表列表必须相同
3.修饰符:范围可以扩大但不能缩小: public>protected>Default>private
4.抛出的异常:范围,可以被缩小,但不能扩大; ClassNotFoundException --> Exception(大)
重写,子类的方法和父类必要一致;方法体不同
为什么需要重写:
父类的功能,子类不一定需要,或者不一定满足
Alt + Insert ; override;

​​​​​​​

import oop.demo05.A;
import oop.demo05.B;

//执行类
public class Application {
        public static void main(String[] args) {

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

            //父类的引用指向了子类
            B b = new A();//子类重写了父类的方法
            b.test();//B
        }
}
public class A extends B{



    @Override//注解,有功能的注释
    public void test() {
        System.out.println("A=>test()");
    }
}
//重写都是方法的重写,和属性无关
public class B {

    public void test(){
        System.out.println("B=>test()");
    }


}

十、多态

即同一方法可以根据发送对象的不同而采用多种不同的行为方式。一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多、

多态存在的条件:
1.有继承关系
2.子类重写父类方法
3.父类引用指向子类对象

注意:多态是方法的多态,属性没有多态性。
instanceof 引用类型的类型转换

多态注意事项

1.多态是方法的多态,属性没有多态

2.父类和子类,有联系,不然会报错类型转换异常! CLassCastException 

3.存在条件:继承关系,方法需要重写,父类引用指向子类对象

Father f1 = new Son( );

 不能重写的方法

static 方法,属于类,不属于实例。

final 常量

private方法

public class Person {


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

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

//执行类
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();


            // 对象能执行哪些方法,主要看对象左边的类型,和右边关系不大
            ((Student)s2).eat();
            s1.run();
        }
}

 instanceof

 boolean result = obj instanceof Class;  

import oop.demo06.Person;
import oop.demo06.Student;
import oop.demo06.Teacher;


            //Object > String
            //Object > Person > Student
            //Object > Person > Teacher
            Object object = new Student();
            System.out.println(object instanceof Student);
            System.out.println(object instanceof Person);
            System.out.println(object instanceof Object);
            System.out.println(object instanceof Teacher);
            System.out.println(object instanceof String);
            System.out.println("==================================");
            Person person = new Student();
            System.out.println(person instanceof Student);
            System.out.println(person instanceof Person);
            System.out.println(person instanceof Object);
            System.out.println(person instanceof Teacher);
         //   System.out.println(person instanceof String);
            System.out.println("==================================");
            Student student = new Student();

            System.out.println(student instanceof Student);
            System.out.println(student instanceof Person);
            System.out.println(student instanceof Object);
            //System.out.println(student instanceof Teacher);
            //System.out.println(student instanceof String);

编译器检查是看引用类型,运行结果是看引用对象的实际类型。即编译能否通过看左边引用类型说明,运行结果看右边实际对象构造。 

强制转化
import oop.demo06.Person;
import oop.demo06.Student;
import oop.demo06.Teacher;


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

            //高                    低
           // Person obj = new Student();

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

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


            Student student = new Student();
            student.run();
            Person person = student;

        }
}

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

public class Person {


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

}

多态的总结:

1.父类引用指向子类的对象

2.把子类转换为父类,向上类型转换,可能会丢失子类自己的方法。

3.把父类转换为子类,向下类型转换,强制转换,子类可以调用父类的方法。

4.方便方法的调用,减少重复的代码,简洁。

十一、static关键字详解
public class Person {
    {//2:赋初始值
        System.out.println( "匿名代码块");

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

    }

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


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

public class Test {

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

 final修饰类无法被继承(断子绝孙)、

十二、抽象类

abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
抽象类,不能通过使用new关键字来创建对象,它是用来让子类继承的。
抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。

特点:

1. 不能new这个抽象类,只能靠子类去实现它:约束

2. 抽象类中可以写普通方法

3. 抽象方法必须在抽象类中 抽象的抽象

思考题: 1. 不能new?存在构造器吗 存在

2. 抽象类的意义 提高开发效率

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

    //约束 有人帮我们实现
    //abstract 抽象方法,只有方法名字,没有方法的实现
    public abstract void doSomething();
    public void hello(){
        public Action() {
            System.out.println("抽象类构造器");
      }
    }

}
//抽象类的所有方法,继承了它的子类,都必须要实现它的方法。除非子类也是抽象类
    public class A extends Action{
        public A() {
            System.out.println("子类构造器");
        }

        @Override
        public void doSomething() {

        }
    }
}

public class Application {
    public static void main(String[] args) {
        A a = new A();
    }
}

十三、接口

三者区别:

普通类:只有具体实现

抽象类:具体实现和规范(抽象方法)都有!

接口:只有规范!自己无法写方法,专业的约束!约束和实现分离:面向接口编程

接口就是规范,定义的是一组规则,体现了现实世界中”如果你是…则必须能…”的思想。如果你是天使,则必须能飞。如果你是汽车,则必须能跑。如果你好人,则必须干掉坏人;如果你是坏人,则必须欺负好人。
接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守。
面向对象的精髓,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、java、c等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。
声明类的关键字是class,声明接口的关键字是interface

作用:

1.约束

2.定义一些方法,让不同的人实现

3.方法都是 public abstract 

4.public static final 静态常量

5.接口不能被实例化,因为接口中没有构造方法

6.implements可以实现多个接口

7.必须要重写接口中的方法

//加象类:extends~
// 类可以实现接口  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() {
        System.out.println("timer");
        System.out.println(TimeService.age);
        System.out.println(UserService.age);
        //System.out.println(age);//编译报错
        System.out.println(name);
    }
}
public interface TimeService {
    int age = 2;
    void timer();
}
public interface UserService {
    //接口中的所有成员都是常量 public static final
    public static final int age = 99;
    String name = "name";
    //接口中的所有定义其实都是抽象 public abstract
    void add(String name);
    void delete(String name);
    void update(String name);
    void query(String name);

    void timer();

}
import oop.demo09.TimeService;
import oop.demo09.UserService;
import oop.demo09.UserServiceImpl;

public class Application {
    public static void main(String[] args) {
        TimeService time = new UserServiceImpl();
        time.timer();
        UserService user = new UserServiceImpl();
        user.timer();
    }
}

 十四、N种内部类

内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。内部类分为成员内部类、静态内部类、局部内部类、匿名内部类。

成员内部类

public class Outer {

    private int id = 10;
    public void out(){
        System.out.println("这是外部类方法");
    }
    public class Inner{
        public void in(){
            System.out.println("这是内部类方法");
        }
        //获得外部类的私有属性
        public void getID(){
            System.out.println(id);
        }
    }
}
import oop.demo10.Outer;


public class Application {
    public static void main(String[] args) {
        Outer outer = new Outer();
        //通过这个外部类来实例化内部类
        Outer.Inner inner = outer.new Inner();
        inner.in();
        inner.getID();
    }
}

 局部内部类:

// 外部类
public class Outer{
  //实例变量
  private String name = "芸";
  private int age = 19;
  
  //方法
  public void show(){
    // 定义局部变量
    String address = "sz";
    
    // 局部内部类:注意不能加任何访问修饰符
    class Inner{
      private String phone = "123456";
      private String email = "5161561@163.com";
      //private static String country = ""; 不能包含静态成员
      private static final String country1 ="中国";//但是能包含静态常量

      public void show2(){
        // 访问外部类的属性
        System.out.println(name); // 相当于 Outer.this.name
        System.out.println(age);
        // 访问内部类的属性
        System.out.println(this.phone);
        System.out.println(this.email);
        System.out.println(address);
      }
    }
    // 创建局部内部类对象
    Inner inner = new Inner();
    inner.show2();
  }
}
// 测试类
public class Test{
  public static void main(String[] args){
    // 创建外部类对象
    Outer outer = new Outer();
                     
    outer.show();
  }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995542.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号