Java面向对象学习笔记

一、类

1、类的基本内容

//  类的结构:
//  修饰符 class 类名{}
//  注:1、一个.Java文件里只能有一个public修饰的类。
//     2、普通类(外部类):只能用public、default(不写)、abstract、final作修饰符。
public class Vehicle {

//    类的私有属性:其他类无法直接获取,要通过get方法(看)set方法(改)
//    声明实例变量时,如果没有赋初值,将被初始化为null(引用类型)或者0、false(原始类型)    
    private String brand,color;
    private double speed;

//    类的公有属性:子类可以直接用,直接改
    public double price=100;

//    构造方法的作用是给类初始化
//    如果没有写构方法,Java虚拟机会自动添加一个无参的构造方法,如果写了构造方法Java虚拟机就不会在自动添加构造方法了
//    构造方法不可写返回值类型,因为返回值类型是由java虚拟机决定的,不能在方法中用return语句返回值
//    构造方法只能通过new关键字调用
//    构造方法的结构:
//    类名(参数列表){}
    Vehicle(String brand,String color)
    {
//        参数列表里的值就是局部变量,局部变量随着栈帧进入栈
//        而对象的属性会随着对象进入堆里面,它俩不在一个地方,所有它俩可以重名
//        this.=指的是当前对象的(this.brand指的是当前对象的私有属性brand)
        this.brand=brand;
        this.color=color;
        speed=0;
    }
//    构造方法可以重载
    Vehicle()
    {

    }
//     get方法
    String getBrand()
    {
        return brand;
    }
    String getColor()
    {
        return color;
    }
    double getSpeed()
    {
        return speed;
    }
//     set方法
    void setColor(String color)
    {
        this.color=color;
    }
//    类的方法
    void run()
    {
        System.out.println("Vehicle内:汽车品牌:"+brand+"颜色:"+color+"汽车速度:"+speed);
    }
}
class VehicleTest
{
    public static void main(String[] args) {
//        创建Vehicle对象
        Vehicle vehicle=new Vehicle("benz","black");
//        调用对象里的方法
        vehicle.run();
        run(vehicle);
    }
//    定义的Vehicle类是一种引用数据类型
    static void run(Vehicle vehicle)
    {
        vehicle.price=500;
        System.out.println("Vehicle外:汽车品牌:"+vehicle.getBrand()+"颜色:"+vehicle.getColor()+"汽车速度:"+vehicle.getSpeed()+" "+vehicle.price);
    }
}

2、内存的类别

  • 栈stack:栈的存取速度比堆快,效率高。在栈内保存基本数据类型的局部变量和对象的引用值。
  • 堆heap:堆可以保存那些对空间要求较大的变量。如对象的属性和数组的元素。在堆内存中开辟空间,只能通过内存分配操作符号new,凡是出现关键字new的地方必定分配了一个堆内存。

3、匿名类

创建了对象但没有变量指向它,它执行完后会被Java垃圾回收机制清理。

new Vehicle("benz","black").run();

 4、类的继承

类只能继承一个类。

//继承的关键字extends
class Car extends Vehicle{
    int loader;
    public Car(int loader,String brand,String color)
    {
//        super()的作用是调用父类的构造方法
//        1. 只能出现在子类的构造方法中,且必须是第一行
//        2. super()中的参数,决定了调用父类哪个构造方法
        super(brand,color);
        this.loader=loader;
    }
//    方法的重写
//    1. 相同的方法名
//    2. 相同的参数列表(参数数量、参数类型、参数顺序都要相同)
//    3. 子类的返回值类型必须要小于或者 等于父类的返回值类型。
//    4. 子类的权限修饰符必须要大于或者等于父类的权限修饰符。
    void run(){
        price=1000;
        System.out.println("Vehicle内:汽车品牌:"+getBrand()+"颜色:"+getColor()+"汽车速度:"+getSpeed()+"车载人数"+loader+"  " +price);
    }
}

5、多态

//父类
public class Vehicle {
    private String brand,color;
    private double speed;
    public double price=100;

    Vehicle(String brand,String color)
    {
        this.brand=brand;
        this.color=color;
        speed=0;
    }
    String getBrand()
    {
        return brand;
    }
    String getColor()
    {
        return color;
    }
    void setColor(String color)
    {
        this.color=color;
    }
    double getSpeed()
    {
        return speed;
    }
    void setSpeed(double speed)
    {
        this.speed=speed;
    }
//    类的方法
    void run()
    {
        System.out.println("Vehicle内:汽车品牌:"+brand+"颜色:"+color+"汽车速度:"+speed);
    }
}
//子类
class Car extends Vehicle{
    int loader;
    public Car(int loader,String brand,String color)
    {
        super(brand,color);
        this.loader=loader;
    }
//    方法的重写
    void run(){
        price=1000;
        System.out.println("Vehicle内:汽车品牌:"+getBrand()+"颜色:"+getColor()+"汽车速度:"+getSpeed()+"车载人数"+loader+"  " +price);
    }
}

class VehicleTest
{
    public static void main(String[] args) {
//        下溯造型,即向下转型(Downcasting)称之为强制转换,是将父类对象显式的转换成子类类型。
        Car vehicle1=(Car) new Vehicle("benz","black");
//        上溯造型,即向上转型(Upcasting)是指子类转换为父类,这是自动转换;转换的前提是具有继承或实现关系。
//        多态存在的三个必要条件:
//         1、要有继承,或实现
//         2、要有重写
//         3、父类引用指向子类对象
        Vehicle car=new Car(2,"Honda","red");
//        提高了代码的扩展性
//        run函数在不同类里有不同的表示
//        但调用的还是子类的run函数
        car.run();
        run(car);
    }

//    提高了代码的维护性( 提高可替换性)
//    子类代码的更改不会影响下面run代码
//    维护时只用去改对应子类即可
    static void run(Vehicle vehicle)
    {
        vehicle.price=500;
        System.out.println("Vehicle外:汽车品牌:"+vehicle.getBrand()+"颜色:"+vehicle.getColor()+"汽车速度:"+vehicle.getSpeed()+" "+vehicle.price);
    }
}

 6、instanceof 运算符 

1)判断某个对象是不是某个类,返回值布尔类型

对象  instanceof  类

2)判断某个对象是不是某个接口,返回值布尔类型

对象  instanceof  接口

7、final关键字

final是一个关键字,可以修饰程序中的多种元素,包括类、方法、属性和局部变量。

1)使用final修饰的类不能被继承。

2)使用final修饰的方法不能被重写。

3)使用final修饰的变量(属性和局部变量)不能被重新赋值,系统不会对final属性默认的赋初始值,必须要有初始值,并遵守常量命名规范。

8、static关键字

修饰成员变量、成员方法、成员内部类(成员的东西),不可修饰局部内部类,局部变量(局部的东西)。

1)静态变量的特点:

  • 内存中只有一份,无论创建多少对象
  • 类加载时静态变量就进入内存了
  • 静态变量可以改值
  • 不用创建对象,用类名.即可调用

2)静态方法的特点:

  • 类名.即可调用,也可以创建对象调用
  • 类加载的时候静态变量就进入内存了
  • 静态方法内不能用this
  • 静态方法不能调用成员方法和成员属性

9、单例模式:

单例模式(singleton)是保证一个类仅有一个实例,并提供一个访问它的全局访问点,单例模式要点包括:

public class Singleton { 
    //在自己内部定义自己的一个实例,只供内部调用
    private static Singleton instance = new Singleton(); 
    private Singleton(){
    } 

//这里提供了一个供外部访问本class的静态方法,可以直接访问 
public static Singleton getInstance(){ 
	return instance; 
}

10、包 

//  package 包名;
package yunque_exercises;
//  import 包名.*;
import java.*;
//  import 包名.子包名.*;
import java.util.*;
//  import 包名.子包名.类名;
import java.util.Scanner;
//  Java类库中常用的包有多个,列举如下几类:
//  java.lang:Java编程语言的基本类库
//  java.awt:提供了创建用户界面以及绘制和管理图形、图像的类
//  javax.swing: 提供了一系列轻量级的用户界面组件,是目前Java用户界面常用的包
//  java.awt.event:图形用户界面事件处理包
//  java.sql:提供了访问和处理来自于Java标准数据源(通常是一个关系型数据库)数据的类
//  java.io:提供了通过数据流、对象序列以及文件系统实现的系统输入、输出
//  java.util:包括集合类、时间处理模式、日期时间工具等各类常用工具包
//  java.net:提供了用于实现网络通讯应用的所有类
//遇到重名的类各用此方法区分开来(包路径不相同)
yunque_exercises.Vehicle vehicle1=new yunque_exercises.Vehicle("benz","black");

二、抽象类

一个类中没有包含足够的信息来描绘一个具体的对象,它只能被继承,派生出子类,这样的类就是抽象类。

1、抽象类不能被实例化;

2、其包含的抽象方法必须在其子类中被实现,否则该子类只能声明为abstract;

3、抽象方法不能为static;

4、抽象类和方法不能被final修饰;

5、其他情况和类相同;

6、在下列情况下,一个类必须声明为抽象类:

  • 当一个类的一个或多个方法是抽象方法时;
  • 当类是一个抽象类的子类,并且没有实现父类的所有抽象方法,即只实现部分;
  • 当一个类实现一个接口,并且不能为全部抽象方法都提供实现时;
​
[public] abstract class 类名[extends父类][implements接口列表]
{
属性声明及初始化;
抽象方法的声明;
非抽象方法声明及方法体;
}

​

三、接口

1.修饰接口的修饰符只有public和默认修饰符两种;

2.接口可以是多继承接口;类可以实现多个接口

3.没有构造方法,也不允许被new对象

4.属性必须是public static final(常量,有初值),方法必须是抽象的(无方法体)且为public。

JDK8的接口新特性:

5.接口允许使用静态方法(不能是静态抽象方法);

6.允许使用defau方法,能写逻辑方法,不要求子类必须重写。

[public] interface 接口名 [extends 父接口列表]{
     // 属性声明
     [public] [static] [final] 属性类型属性名 = 常量值 ;
     // 方法声明
     [public] [abstract] 返回值类型方法名 ( 参数列表 ) ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值