面向对象(上)

1.Unicode,Ascill和UTF-8,ANSI 的区别

  • Unicode,Ascill 是一种映射关系,记录了字符与数字相互的映射关系
  • UTF-8 是一种编码方式,依赖Unicode的映射关系的编码方式
  • ANSI使用多个字节来代表一个字符的各种汉字延伸编码方式(国家不同)

        详解:unicode、utf-8、ansi、gbk、gb2312编码详解-腾讯云开发者社区-腾讯云

ANSI详解:ANSI是什么编码? - malecrab - 博客园 (cnblogs.com)

2.表达式类型的自动提升

public class Test {
    public static void main(String[] args) {
        short a = 2;
//        a = a + 2;    报错:   Required type: short
//                             Provided:int
        char c = 97;
//      c = c + 2;     //错误:c + 2 提升到int类型,不能直接赋值给char型
        c += 2;        //正确:这里Java会自动帮助您进行类型转换,因此不会报错
        System.out.println(c);  //打印出字符c,这里c会自动转化为char类型
    }



}

3.逻辑运算符&与&&,|和 || 的区别  (page68)

&不会短路,作用与&&一致

|不会短路,作用与 || 一致

4.Java中方法

由函数发展而来,但是与函数又有显著不同

  1)方法的属性:不能独立,必须依附于类或者实例对象

  •         方法不能独立定义,只能在类体里定义
  •         从逻辑意义上看,方法要么属于该类本身,要么属于该类的一个对象。
  •         永远不能独立执行方法,执行方法必须使用类或者对象作为调用者。

  2)方法的传参机制:值传递

基本数据类型:进行值传递。

eg:在main方法中调用A类的a方法(参数 int ),虚拟机运行main到到达a方法时,在A堆区里面传入参数进行运行方法。可是运行结束并不影响实参(在main方法中参入的变量)。

引用数据类型:进行值传递

同样的,引用变量储存的是在堆区的地址,传入方法是在堆区的地址,如果在方法中对引用变量中对应堆区的变量进行改值后,在原方法中的变量的对象也更改了值。

如果这里在方法中,传入引用数据类型参数,形参对应的值就是堆区的地址,这里如果对形参进行重新赋值,则不会改变原实参方法中的变量。

eg:

package Test;

public class Test {
    public static void main(String[] args) {
        Student student =new Student();
        student.name = "hahaha";
        student.id = 1;

        A a = new A();
        a.freeStudent(student);

        System.out.println(student.id);
        System.out.println(student.name);

        a.changeStudent(student);
        System.out.println(student.id);
        System.out.println(student.name);
    }
}

class A{
    public void freeStudent(Student student){
        student = null;
    }

    public void changeStudent(Student student){
        student.id = 2;
        student.name ="xixixixi";
    }
}

class Student{
    int id;
    String name;
}

运行结果:

1
hahaha
2
xixixixi

所以发现第一个freeStudent并没有进行成功改变student的值,在第二个changeStudent中改变了student的值。(值传递)

形参个数可变的方法:在定义方法时在最后一个形参类型后面增加(...)表明该形参可以接受多个参数值,多个参数值被当作数组传入。

  3)方法重载

允许在同一个类中定义多个同名方法,只要形参列表不同。

确实一个方法三要素:

调用者,(类或者对象)

方法名,(方法的标识)

形参列表,(与实参匹配)

5.隐藏与封装

访问控制符:private,protect,public

访问权限(当我们不写访问控制符时,默认为default。)

private (类中)  <  default(包中)  <  protect (包和其他包中子类)  <  public

6.类的继承(单继承)

实现继承的类被称为子类,被继承的类称为父类(基类,超类)利用extends关键字

父类包含的范围比子类大。

Object子类

子类重写父类的方法

当子类覆盖了父类的方法后,子类的对象无法访问父类中被覆盖的方法,但在子类方法中可以调用父类中被覆盖的方法。(父类中private修饰的方法不能重写)

super限定(限定该对象调用它从父类继承得到的实例变量和方法)

调用父类被覆盖的实例方法

实例变量:先在方法中找是否存在,如果不存在,再在类中找,如果还是不存在,再在父类中找

(如果子类中没有包含与父类同名的变量名,则无需显式使用super。)


调用父类构造器

在子类构造:显式调用,隐式调用父类构造器

java.lang.Object类构造器被默认执行

7多态

引用变量在编译阶段只能调用其编译时类型所具有的方法,运行时执行运行时所具有的方法。

这个在编译时看左边,执行时看右边。(方法)

编译看左边,执行看左边。(变量)

编译看父类是否存在这个方法,执行时先看子类是否存在这个方法。(如果有就执行子类中的方法)

在上图中,如果t实例不能执行print2,因为父类中没有这个方法。可以强转一下,就可以执行

比如:((Test)t).print2();  

8.强制类型转换

基础类型之间的转化(在数值间),布尔与数值不能转换

引用数据类型:只能在具有继承关系的两个类型之间————-如果试图把父类对象强制转化为子类类型,这个对象必须实际是子类实例才行(编译时类型为父类,运行时为子类)否则会引发ClassCastException异常。

9.instanceof运算符

insanceof:判断前一个对象是否是后面一个类的实例,

如果是返回true,否则返回false。

10.使用继承注意点

子类不能随意更改父类的信息。如果要想子类重写父类的方法,则使用修饰符protect

11.组合设计

组合设计模式通常指的是将一个类的实例作为另一个类的成员变量,以实现类之间的组合关系。这种设计模式可以更好地解耦和管理类之间的关系。

12.初始化块(第四个成员,前面有:成员变量,方法,构造器)

初始化块的模板

[修饰符] {
//初始化块的可执行代码
...

}

//初始化块的修饰符只能是static,使用static的被称为静态初始化块
//进行创建Java对象时,系统先调用该类里面的定义的初始化块,如果有两块初始化块,则先执行前面的初始化块

//普通初始化块,声明实例变量指定的默认值都可以认为是对象的初始化代码。所以它们的执行顺序与代码的排序顺序相同

这个的运行结果:2

说明后面赋值语句后执行。

在Java创建一个对象时,系统先为该对象的所有实例变量分配内存,接着程序对这些实例变量执行初始化,其初始化顺序是:先执行初始化块或声明变量时指定的初始值,再执行构造器里面的指定初始值。(会先执行父类的初始化块Object)

在使用Javac编译后,初始化块会消失,初始化代码会被还原到所有到每个构造器中(位于最前面)

静态初始化块是再创建对象之前,他在类初始化时执行。

在系统第一次创建一个A类对象时,因为系统中还不存在A类,则需要加载并初始化A类,一旦A类初始化成功则A类在虚拟机中将一直存在,第二次创建A类对象时,无需对类再次初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值