Java笔记_基础_对象和类

类/方法

class

class Demo { //定义一个叫 Demo 的类 如果被 public 修饰则要求该文件的文件名必须与该类名相同

	int i = 10; //成员变量 类中方法外 这个类公用的变量
	
	public Demo() { //构造方法 与类同名 不用加返回值 是在其他类创建这个类时调用 可以无参或有参
	}
	
	public static int a(int a) { //public static:权限修饰符 int:返回值类型(void:无返回值) a:方法名称 (int a):输入的参数((int... a):可变参数可以添加多组数据,底层为数组)
		return 15; //返回值为15 返回值为我们调用这个方法所得到的结果
	}
}

一个类就相当于一个Java文件
Java方法是Java代码块在一起执行一个功能
一般类名采用大驼峰命名法,而方法采用小驼峰命名法
大驼峰命名法: 首字母大写 之后每个单词首字母大写
小驼峰命名法: 首字母小写 之后每个单词首字母大写

修饰符

default //默认   在同一包内可用(可以不用写)
private //私有   只在本类中可用
public //公开   所有类都可用
protected //保护   只在本类和继承本类的子类中可用
static //静态   代码块:与类一起加载只执行一次  变量:无论声明多少对象变量都为同一个  方法:类名.方法名可以直接调用(静态方法不能使用非静态变量) 被 static 所修饰的内容都为单例,即只有一个对象
final //最终   变量:不可改变  成员变量:直接赋值或在构造方法中赋值  方法:可以被继承,但不能被重写  类:不能被继承
abstract //抽象   方法:无内容,必须由子类重写  类:有抽象方法必须为抽象类

枚举:

enum

public enum Season {
	SPRING("春"){ //枚举是静态的,可以直接"枚举类.枚举项"调用
		@Override //每个枚举项都是该枚举类的对象,故若枚举类中有抽象方法则枚举项中必须重写
		public void show() {
			System.out.println(this.name);
		}
	},
	SUMMER("夏"){
		@Override
		public void show() {
			System.out.println(this.name);
		}
	},
	AUTUMN("秋"){
		@Override
		public void show() {
			System.out.println(this.name);
		}
	},
	WINTER("冬"){
		@Override
		public void show() {
			System.out.println(this.name);
		}
	};

	public String name; //枚举项的定义必须在枚举类开头,变量需定义在枚举项之下

	private Season(String name){ //构造方法
		this.name = name;
	}

	public abstract void show(); //抽象方法
}

枚举类.枚举项名.name();获取枚举项名
枚举类.枚举项名.ordinal();返回该枚举索引值
枚举类.枚举项名.compareTo(枚举对象);比较两个枚举项 返回索引的差值
枚举类.value();获取所有枚举项 返回枚举类[]
Enum.valueOf(class, 枚举项名);获取枚举类中的枚举项 Enum:所有枚举类的父类

泛型

<?>泛型通配符,可以匹配所有类型 <? extends 类名>匹配该类和其所有父类泛型 <? super 类名>匹配该类和其所有子类泛型

public class Demo {
    public static void main(String[] args) {
        String s = "ABC";
        B b = new B();
        A<String> a = new A<>(s); //这里指定 E 为String字符串类型 所以构造方法输入的参数 s 为String字符串类型
        A<B> ab = new A<>(b); //这里指定 E 为B这个类 所以构造方法输入的参数 b 为B这个类的对象

        System.out.println(a.e); //ABC 这里的 e 是String字符串类型 内容为"ABC"
        System.out.println(ab.e); //BCD 这里的 e 表示的是B这个类的对象 内容为B这个类的toString方法输出的"BCD"
        System.out.println(ab.b(s)); //ABC 这里指定 T 为String字符串类型 此处打印的是 A这个类 的b方法的返回值
    }
}

class A<E> { //指定E为泛型,一般用单个大写字母表示 表示通配任意类型
    public E e;

    public A(E e) { //此处E与创建类时所指定的E的类型一样
        this.e = e;
    }

    public <T> T b(T t) { //指定T为泛型,与E无关
        return t;
    }
}

class B {
    @Override
    public String toString() {
        return "BCD";
    }
}

泛型表示可以通配任意类型对象

注解

//元注解: 标注注解的注解
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD}) //指定注解使用的位置(成员变量, 类, 方法)
@Retention(RetentionPolicy.RUNTIME) //指定该注解的存在时间
@Inherited //指定该注解可以被继承
pulic @interface 注解名{ //声明这是一个注解
	属性类型 属性名() default 默认值;
	属性类型 属性名(); //若没有赋默认值,则需定义时赋值
	String value(); //特殊: 若只有value需要赋值,则value可以省略,直接写定义值
}

@Override重写方法
@Deprecated方法过时
@SuppressWarnings(value = "all")压制警告

内部类

类中的类

成员内部类

类名.内部类名 对象名 = 外部类对象.new 内部类名();

public class Demo {
    public static void main(String[] args) {
        Demo1 demo1 = new Demo1();
        Demo1.Demo2 demo2 = new Demo1().new Demo2(); //创建 Demo1的内部类Demo2 的对象
        System.out.println(demo1.a); //10
        System.out.println(demo2.a); //15
    }
}

class Demo1 {
    int a = 10;
    class Demo2 {
        int a = 15;
    }
}

静态成员内部类

类名.内部类名 对象名 = new 外部类名.内部类名();

public class Demo {
    public static void main(String[] args) {
        Demo1 demo1 = new Demo1();
        Demo1.Demo2 demo2 = new Demo1.Demo2(); //创建 Demo1的静态内部类Demo2 的对象
        System.out.println(demo1.a); //10
        System.out.println(demo2.a); //15
    }
}

class Demo1 {
    int a = 10;
    static class Demo2 {
        int a = 15;
    }
}

匿名内部类 / lambda表达式

匿名内部类: 没有类名的内部类 一般由创建对象时创建内部类来重写其方法

public class Demo {
    public static void main(String[] args) {
        Demo1 demo1 = new Demo1() { //使用匿名内部类的方式重写 Demo1 中的抽象方法并创建对象
            @Override
            public int a(int a) {
                return a + 1;
            }

            @Override
            public int b(int a) {
                return a - 1;
            }
        };
        System.out.println(demo1.a(10)); //11
        System.out.println(demo1.a(10)); //9
    }
}

class Demo1 {
    int a(int a) {
        return 1;
    }

    int b(int a) {
        return 2;
    }
}

lambda表达式: 匿名内部类的简化书写方式 要求外部类只能为接口,并且有且只有一个抽象方法

public class Demo {
    public static void main(String[] args) {
        Demo1 demo1 = new Demo1() { //匿名内部类
            @Override
            public int a(int a) {
                return a + 1;
            }
        };

        Demo1 demo11 = (a) -> { //lambda表达式 意义与上方匿名内部类完全相同 可省略大部分重复代码 (变量名) -> {代码块}
            return a + 1;
        };

        System.out.println(demo1.a(10)); //11
        System.out.println(demo11.a(10)); //11
    }
}

interface Demo1 {
    int a(int a);
}

面向对象

封装

new

import java.util.Random; //导包 说明我们用到的类的位置(全类名)

public class Demo {
    public static void a() {
        Random r = new Random(); //类名 对象名 = new 类名(); 创建一个类的对象 即将此类封装成一个叫 r 的对象
		int a = r.nextInt(100); //对象名.方法名 调用这个对象的这个方法 可以用一个变量承接返回值
    }
}

静态方法可直接类名.方法名;调用

继承

extends

public class Demo1 extends Demo { //class 类名 extends 父类:继承父类的非私有的方法和变量(不能多继承,但可以多重继承)
    
    int i = 10;
    
    public void b() {
		int a1 = this.i; //10 this:声明为本类中的变量
		int a2 = super.i; //100 super:声明为父类中的变量
    }

    @Override //重写父类方法 以本类调用此方法时将不再调用父类方法
    public int a() { //需与父类 方法名,参数 都相同
        return 1;
    }
}

class Demo { //父类

	int i = 100;

	public int a(){
		return 12;
	}
}

父类的方法和自己独有的方法都可以调用

抽象

abstract

 class Demo1 extends Demo { //若继承的类有抽象方法则此类必须重写抽象方法

    @Override
    public int b() {
        return 1;
    }
}

abstract class Demo { //有抽象方法的类也必须被abstract修饰
    public int a() {
        return 1;
    }

    abstract int b(); //abstract:定义一个抽象方法
}

抽象方法即没有方法体的方法,由继承此类的类重写

接口

interface
implements

public class Demo1 implements Demo { //implements实现一个接口 可以多实现 所有抽象方法必须被重写
    
    @Override
    public int a() {
        return 1;
    }

    @Override
    public int b() {
        return 0;
    }
}

interface Demo { //interface:定义一个接口 即只有抽象方法的类
    int a();
    int b();
}

接口即只有抽象方法的类
变量默认添加修饰词 public static final开放 静态 最终
方法默认添加修饰词 public abstract开放 抽象 不可用static修饰

多态

父类 对象名 = new 子类

class Demo1 extends Demo {
    public int c() {
        return 1;
    }
    
    @Override
    public int b() {
        return 1;
    }


}

abstract class Demo {
    public int a() {
        return 1;
    }

    abstract int b();
}

可以使用父类变量承接子类对象
但不能调用子类独有方法
{
Demo demo = new Demo1();
demo.a(); //可以
demo.b(); //可以
demo.c(); //不可以
}

异常

弹出异常

throw new 异常名弹出异常

public class Demo {
    public static void main(String[] args) throws Exception { //throws 异常名   跟在在类名之后,表示有可能会遇到该异常,若遇到则抛出给调用者 (Exception 最上级异常,所有异常的父类)
        throw new Exception("异常: Exception"); //弹出异常
    }
}

运行结果:
弹出异常

自定义异常

继承RuntimeException并创建构造方法

public class Demo {
    public static void main(String[] args) throws Exception { //抛出异常
        throw new A("异常: A"); //弹出异常
    }
}

class A extends RuntimeException { //自定义异常 A
    public A(String s) {
	    super(s);
        System.out.println(s);
    }
}

运行结果:
抛出异常

异常处理:

{
try{ //有可能出现异常的代码
}catch(异常名 e){ //捕捉异常之后封装为异常对象并继续运行此处代码
}finally{ //表示不管有没有异常,此处代码一定会执行,除非JVM退出
}
}

public class Demo {
    public static void main(String[] args) {
        try {
            a(); //a方法添加了 throws Exception 若遇到异常将抛出到此处
            System.out.println("未遇到异常A"); //此打印语句在异常之下,若异常未起作用将打印
        } catch (Exception e) {
            System.out.println("遇到异常A");
            e.printStackTrace(); //默认异常处理机制 即打印异常
        } finally {
            System.out.println("异常A 已处理完");
        }
        System.out.println("其他代码");
    }

    public static void a() throws Exception { //抛出异常给调用者
        throw new A("异常: A"); //弹出异常
    }
}

class A extends RuntimeException {

    public A(String s) {
        System.out.println(s);
    }
}

运行结果:
异常处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值