【Java入门】-- Java基础详解之 [Java面向对象编程(初级)]

目录

1.类与对象

2.类与对象的区别与联系

3.对象在JVM内存中的存在形式(重要)

4.属性/成员变量/字段

5.如何创建对象

6.类和对象的内存分配机制

7.面向对象的三大特征?

8.面向对象和面向过程?

9.匿名对象

10.方法(method)

11.方法的重载(overload)

12.可变形参

13.递归

14.封装

15.四种访问权限修饰符

16.构造器

17.什么是javaBean

18.this是什么?

19.package和import


1.类与对象

抛砖引玉,一个小动物的问题引出类与对象:小明养了两只小狗狗,一只名字叫小黑,今年2岁,黑色。还有一只叫小白,4岁,白色。输入小狗名字就显示狗狗的名字,年龄,颜色。如果输入的名字错误,就显示没有这个狗狗。

  • 使用现有的技术解决:
    • 定义变量方式解决
    • 使用数组解决
  • 使用这两个技术解决问题的痛点:
    • 不利于数据的管理,效率低。所以Java设计者引入了类与对象的概念,解决新的需求。
  • 代码:
    public class Object01{
    //小明养了两只小狗狗,一只名字叫小黑,今年2岁,黑色。还有一只叫小白,4岁,白色。
    //输入小狗名字就显示狗狗的名字,年龄,颜色。如果输入的名字错误,就显示没有这个狗狗。
        public static void main(String[] args){
            //如何使用面向对象(OOP)解决
            //1.创建一只狗狗对象(实例化)  new Cat();
            //Dog dog1 = new Dog(); 把创建的狗狗赋给cat1
            //dog1就是一个对象了
        
            //创建第一只狗狗
            Dog dog1 = new Dog();
            dog1.name = "小黑";
            dog1.age = 2;
            dog1.color = "黑色";
              
            //创建第二只狗狗
            Dog dog2 = new Dog();
            dog2.name = "小白";
            dog2.age = 4;
            dog2.color = "白色";
            
            System.out.println("第一只狗狗的信息:"+dog1.name+","+dog1.age+"岁,"+dog1.color);
            System.out.println("第二只狗狗的信息:"+dog2.name+","+dog2.age+"岁,"+dog2.color);
        }
    }
    
    //定义狗狗类
    class dog{
        String name;
        int age;
        String color;
    }

2.类与对象的区别与联系

  •  类是抽象的,是概念,代表一类事物,如动物,植物等...

  • 对象是具体的,实际的,代表一个具体的事务。

  • 类是对象的模板,对象是类其中的一个实例。

3.对象在JVM内存中的存在形式(重要)

4.属性/成员变量/字段

 从概念或叫法上看:成员变量 = 属性 = field(字段)

属性是一个类的组成部分,一般是基本数据类型,也可以是引用数据类型。

注意事项:

  • 属性的定义语法同变量。例如:访问修饰符  属性类型   属性名;
    访问修饰符有四种:public、proctected、默认、private
  • 属性的定义的类型可以是基本数据类型或引用数据类型。
  • 属性不赋值,有默认值。

byte 0  short 0  int 0  long 0  flout 0.0  double 0.0  boolean false  String null   char \u0000

5.如何创建对象

  •  先声明再创建
    Cat cat;  //声明对象cat
    cat = new  Cat();  //创建
  • 直接创建
    Cat cat = new Cat();

如何访问属性:

基本语法:对象名.属性名     如:cat.name;

6.类和对象的内存分配机制

  1. Java内存的结构分析
    1. 栈:一般存放基本数据类型(局部变量)
    2. 堆:存放对象(Cat cat,数组等)
    3. 方法区:常量池(常量,如字符串),类加载信息。

7.面向对象的三大特征?

  • 继承:继承是指一个类(称为子类或派生类)可以继承另一个类(称为父类或基类)的属性和方法。子类可以重用父类的代码,并且可以在此基础上进行扩展或修改。通过继承,子类可以获得父类的特性,形成类之间的层次结构。这样可以提高代码的可重用性和灵活性,减少重复编写代码的工作量。
  • 封装:封装是将数据和对数据的操作封装到一个类中,对外部隐藏具体的实现细节,只对外暴露必要的接口。通过封装,我们可以控制对数据的访问方式,提供统一的接口来操作数据,从而提高代码的可读性、可维护性和安全性。封装还有助于实现代码的模块化和解耦。
  • 多态:多态是指同一个方法可以在不同的对象上具有不同的行为。在多态的使用中,我们可以使用父类类型的引用指向子类的对象。通过多态机制,我们可以实现动态绑定和运行时的方法调用。多态提高了代码的灵活性和可扩展性,使得程序能够以更加通用和抽象的方式进行编写。

8.面向对象和面向过程?

面向过程(POP):强调的是功能行为,以函数为最小的单位,考虑怎么做。

面向对象(OOP):将功能封装进对象,强调具备了功能的对象,以类\对象为最小单位,考虑谁去做。

9.匿名对象

我们可以不定义对象的句柄,直接调用这个对象的方法。例如:new Cat().start();
注意:如果一个对象的方法只需要一次调用,那么可以使用匿名对象。

10.方法(method)

  • 方法是类或者对象的"行为“ ,用来完成某个操作;方法不能独立存在,必须定义在类中。
  • 方法的声明格式:
    访问修饰符  返回值类型  方法名(参数类型 形参,.....){
             方法体;
            return  返回值;(返回值类型void,没有返回值)
  • }
  • 举例:
    public class Car{
        private int age;
        public int getAge(){
           return age;     
        }
    }

注意事项:

  1. 方法被调用一次就会执行一次。
  2. 没有具体返回值的情况,返回值类型用void,方法体就不必用return。
  3. 不可用在方法内部定义方法。 

11.方法的重载(overload)

重载就是允许存在一个以上的同名方法,只要他们参数个数或类型不同。

特点:

与返回值类型无关,参数列表不同。

例如:

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

int add(int a){return x;}

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

12.可变形参

JDK5以前采用数组形参来定义方法,传入多个同类型的变量

public static void test(int a,String[] aa);

JDK5以后采用可变个数形参来定义方法

public static void test(int a, String...aa);

注意:

  • 声明格式:方法名(参数类型名...参数名)。
  • 可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个。
  • 可变个数形参的方法与同名方法之间彼此构成重载。 
  • 可变参数方法的使用与方法参数部分使用数组一致。
  • 同一个方法的形参上只能声明一个可变参数。

13.递归

 简单来说就是一个方法体调用它自己。

递归方法包含了一种隐式的循环,它会重复执行某段代码。

递归一定要向已知的方法递归,否则递归就变成了无穷递归,类似死循环.

举例:

//计算1--100自然数的和

public int sum(int num){

        if(num == 1){

               return 1;        

        }else{

                return num + sum(num -1) ;       

        }

}

14.封装

  •  为什么需要封装?有什么用?
    • 比如我要使用电脑,只需要开机进入系统就能用了,没有必要了解系统底层或硬件内结构
  • 程序设计追求高内聚,低耦合。
    • 高内聚是指类的内部数据操作细节自己完成,不允许外部干涉。
    • 低耦合:仅对外暴露少量的方法使用。
  • 隐藏方法内部,之对外公开简单的接口。便于外界调用,提高系统的可扩展性,可维护性。

15.四种访问权限修饰符

class只能使用public,默认

public 类可以在任何地方访问。

默认类只能被同一个包的类访问。

16.构造器

构造器的特征:

  • 具有类相同的名称。
  • 不声明返回值类型
  • 不能被static,final,synchronized,abstract,native修饰,不能有return语句。

构造器作用:

创建对象,初始化对象

注意:

  • Java语言中每个类都有构造器
  • 默认构造器的修饰符与类的修饰符一致。
  • 一旦显示定义了构造器,系统不再提供默认构造器。
  • 一个类可以创建多个重载的构造器。
  • 父类构造器不可被继承。

属性赋值的过程:

默认初始化--》显式初始化--》构造器初始化--》通过"对象.属性"或"对象.方法"赋值

17.什么是javaBean

  • JavaBean是Java写成的可重用组件。
  • 所谓JavaBean指的是符合如下标准的Java类:
    • 类是公共的
    • 有一个无参的公共构造器
    • 有属性,且有get,set方法
  • 用户可以使用JavaBean将功能,处理,值,数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部JSP页面,Servlet,其他JavaBean,applet程序或者应用来使用这些对象。用户可以认为javaBean提供了一种随时可以复制粘贴的功能,而不用关心变化。

举例:

18.this是什么?

this可以调用类的属性,方法,构造器。

它可以在方法内部使用,这个方法所属对象的引用。

在构造器内部使用,表示该构造器正在初始化的对象。

注意:

  • 可以在类的构造器使用”this(形参列表)“的方式,调用本类中重载的其他构造器!
  • 构造器中不能通过this(形参列表)调用自身构造器
  • this(形参列表)必须声明在类的构造器首行!
  • 类的构造器中,最多只能声明一个this(形参列表)

19.package和import

包(package):

  • package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包
    格式:package  顶层包.子包名;
  • 包对应于文件系统的目录,package语句中,用“.”来指明包(目录)的层次;
  • 包通常用小写单词标识。
  • 包的作用:
    • 包可以包含类和子包,划分项目层次,便于管理
    • 解决类命名冲突问题
    • 控制访问权限

导入 (import):

为使用定义在不同包中的Java类,需要用import语句引入指定包层次下所需的类或全部类

语法:import  包名.类名;

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
Java泛型是Java 5引入的新特性,可以提高代码的可读性和安全性,降低代码的耦合度。泛型是将类型参数化,实现代码的通用性。 一、泛型的基本语法 在声明类、接口、方法时可以使用泛型,泛型的声明方式为在类名、接口名、方法名后面加上尖括号<>,括号中可以声明一个或多个类型参数,多个类型参数之间用逗号隔开。例如: ```java public class GenericClass<T> { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } } public interface GenericInterface<T> { T getData(); void setData(T data); } public <T> void genericMethod(T data) { System.out.println(data); } ``` 其中,`GenericClass`是一个泛型类,`GenericInterface`是一个泛型接口,`genericMethod`是一个泛型方法。在这些声明中,`<T>`就是类型参数,可以用任何字母代替。 二、泛型的使用 1. 泛型类的使用 在使用泛型类时,需要在类名后面加上尖括号<>,并在括号中指定具体的类型参数。例如: ```java GenericClass<String> gc = new GenericClass<>(); gc.setData("Hello World"); String data = gc.getData(); ``` 在这个例子中,`GenericClass`被声明为一个泛型类,`<String>`指定了具体的类型参数,即`data`字段的类型为`String`,`gc`对象被创建时没有指定类型参数,因为编译器可以根据上下文自动推断出类型参数为`String`。 2. 泛型接口的使用 在使用泛型接口时,也需要在接口名后面加上尖括号<>,并在括号中指定具体的类型参数。例如: ```java GenericInterface<String> gi = new GenericInterface<String>() { private String data; @Override public String getData() { return data; } @Override public void setData(String data) { this.data = data; } }; gi.setData("Hello World"); String data = gi.getData(); ``` 在这个例子中,`GenericInterface`被声明为一个泛型接口,`<String>`指定了具体的类型参数,匿名内部类实现了该接口,并使用`String`作为类型参数。 3. 泛型方法的使用 在使用泛型方法时,需要在方法名前面加上尖括号<>,并在括号中指定具体的类型参数。例如: ```java genericMethod("Hello World"); ``` 在这个例子中,`genericMethod`被声明为一个泛型方法,`<T>`指定了类型参数,`T data`表示一个类型为`T`的参数,调用时可以传入任何类型的参数。 三、泛型的通配符 有时候,我们不知道泛型的具体类型,可以使用通配符`?`。通配符可以作为类型参数出现在方法的参数类型或返回类型中,但不能用于声明泛型类或泛型接口。例如: ```java public void printList(List<?> list) { for (Object obj : list) { System.out.print(obj + " "); } } ``` 在这个例子中,`printList`方法的参数类型为`List<?>`,表示可以接受任何类型的`List`,无论是`List<String>`还是`List<Integer>`都可以。在方法内部,使用`Object`类型来遍历`List`中的元素。 四、泛型的继承 泛型类和泛型接口可以继承或实现其他泛型类或泛型接口,可以使用子类或实现类的类型参数来替换父类或接口的类型参数。例如: ```java public class SubGenericClass<T> extends GenericClass<T> {} public class SubGenericInterface<T> implements GenericInterface<T> { private T data; @Override public T getData() { return data; } @Override public void setData(T data) { this.data = data; } } ``` 在这个例子中,`SubGenericClass`继承了`GenericClass`,并使用了相同的类型参数`T`,`SubGenericInterface`实现了`GenericInterface`,也使用了相同的类型参数`T`。 五、泛型的限定 有时候,我们需要对泛型的类型参数进行限定,使其只能是某个类或接口的子类或实现类。可以使用`extends`关键字来限定类型参数的上限,或使用`super`关键字来限定类型参数的下限。例如: ```java public class GenericClass<T extends Number> { private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } } public interface GenericInterface<T extends Comparable<T>> { T getData(); void setData(T data); } ``` 在这个例子中,`GenericClass`的类型参数`T`被限定为`Number`的子类,`GenericInterface`的类型参数`T`被限定为实现了`Comparable`接口的类。 六、泛型的擦除 在Java中,泛型信息只存在于代码编译阶段,在编译后的字节码中会被擦除。在运行时,无法获取泛型的具体类型。例如: ```java public void genericMethod(List<String> list) { System.out.println(list.getClass()); } ``` 在这个例子中,`list`的类型为`List<String>`,但是在运行时,`getClass`返回的类型为`java.util.ArrayList`,因为泛型信息已经被擦除了。 七、泛型的类型推断 在Java 7中,引入了钻石操作符<>,可以使用它来省略类型参数的声明。例如: ```java List<String> list = new ArrayList<>(); ``` 在这个例子中,`ArrayList`的类型参数可以被编译器自动推断为`String`。 八、总结 Java泛型是一个强大的特性,可以提高代码的可读性和安全性,降低代码的耦合度。在使用泛型时,需要注意它的基本语法、使用方法、通配符、继承、限定、擦除和类型推断等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月月崽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值