多态&继承&一些java的基础知识

本文详细介绍了Java编程的基础知识,包括字符型常量与字符串常量的区别、数据类型、注释、运算符、控制流程以及多态、继承与实现等核心概念。强调了在编程中应当注意的细节,如数据溢出、代码注释的适当性以及构造函数与变量的作用域。此外,还讨论了Java中的代码复用技术,如继承、组合及其优缺点。最后,探讨了类变量、成员变量和局部变量的存储位置及访问权限的重要性。
摘要由CSDN通过智能技术生成

字符型常量和字符串常量的区别?

1.字符串是单引号引起的一个字符,字符串常量是双引号引起的若干字符包括0.
2.字符常量相当于一个整形值(ASCII值),可以参加表达式运算;字符串常量代表一个地址值(该字符串在内存中存放位置)
3.字符常量只占两个字节(char在java中占两个字节),字符串常量占若干个字节
java要确定每种基本类型所占存储空间的大小,它们的大小不像其他大多语言那样随机器硬件架构的变化而变化,所占存储空间的不变性是java程序比用其他大多语言编写的程序更具有可一致性的一个原因。

八种基本数据类型

(我室友面试大连外包还考了这个。。。。)
boolean(布尔型)
char(字符型)
整型:
byte(-128 127)一个字节存储
short 两个字节存储
int 四个字节存储
long 八个字节存储
浮点型:
float 四个字节
double 八个字节
由于计算机中保存的小数是十进制的小数的近似值并非准确值,因此不要在代码中使用浮点数表示金额,最好用Long
注意:String是引用数据类型不是基本数据类型
发生溢出现象不会抛出异常,无任何提示因此在程序中,使用同类型的数据进行运算时,一定要注意数据溢出问题。

注释

java三种注释:
单行注释
多行注释
文档注释。
代码的注释不是越详细越好。实际上好的代码本身就是注释,我们要尽量规范和美化自己的代码来减少不必要的注释。
若编程语言足够有表达力,就不需要注释,尽量通过代码来阐述。

标识符与关键字的区别

编写程序时需要大量为程序,类,变量,方法取名字,于是有了标识符,但是有些标识符,java已经赋予了特殊的含义,只能用于特定地方,这种标识符就是关键字。

自增自减运算符

在写代码的过程中,常见的一种情况是需要某个整数类型变量增加 1 或减少 1,Java 提供了一种特殊的运算符,用于这种表达式,叫做自增运算符(++)和自减运算符(–)。
++和–运算符可以放在变量之前,也可以放在变量之后,当运算符放在变量之前时(前缀),先自增/减,再赋值;当运算符放在变量之后时(后缀),先赋值,再自增/减。例如,当 b = ++a 时,先自增(自己增加 1),再赋值(赋值给 b);当 b = a++ 时,先赋值(赋值给 b),再自增(自己增加 1)。也就是,++a 输出的是 a+1 的值,a++输出的是 a 值。用一句口诀就是:“符号在前就先加减,符号在后就后加/减”。

continue,break,return的区别

continue:跳出当前循环,接着下一次循环
break:跳出整个循环,接着执行循环后的语句
return:跳出所在方法,结束该方法运行

多态

同一操作作用不同对象,可以有不同结束,产生不同执行结果。
多态的必要条件:

  1. 有类继承或者接口实现
  2. 子类要重写父类方法
  3. 子类的引用指向子类对象
public class Parent{
    
    public void call(){
        sout("im Parent");
    }
}

public class Son extends Parent{// 1.有类继承或者接口实现
    public void call(){// 2.子类要重写父类的方法
        sout("im Son");
    }
}

public class Daughter extends Parent{// 1.有类继承或者接口实现
    public void call(){// 2.子类要重写父类的方法
        sout("im Daughter");
    }
}

public class Test{
    
    public static void main(String[] args){
        Parent p = new Son(); //3.父类的引用指向子类的对象
        Parent p1 = new Daughter(); //3.父类的引用指向子类的对象
    }
}

同样是Parent类的实例,p.call 调用的是Son类的实现、p1.call调用的是Daughter的实现。
多态多指运行期间的概念

重载和重写

重载:函数或者方法有同样的名称,但是参数列表不同,这样的同名不同参数的函数或者方法之间互相称之为重载函数或者方法。
重写:java子类和父类有两个名称,参数列表都相同的方法的情况,由于他们有相同的方法签名,所以子类的新方法将覆盖父类中原有的方法。
重载是一个编译期的概念,重写是运行期间概念
重载在编译时根据参数变量的类型判断应该调用哪个方法,而重写则在运行时,根据引用变量所指向的实际对象的类型来调用方法。
因为重载在编译期已经确定调用哪个方法,所以重载不是多态,而重写是多态。(重载是编译时多态简称静态多态,但是java中提到的多态指的是动态多态)
重写:

class Dog{
    public void bark(){
        System.out.println("woof ");
    }
}
class Hound extends Dog{
    public void sniff(){
        System.out.println("sniff ");
    }

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

public class OverridingTest{
    public static void main(String [] args){
        Dog dog = new Hound();
        dog.bark();
    }
}

输出结果是bowl
重载的条件:

  1. 被重载的方法必须改变参数列表
  2. 被重载的方法可以改变返回类型
  3. 被重载的方法可以改变访问修饰符
  4. 被重载的方法可以声明新的或更广的检查异常
  5. 方法能够在同一个类中或者在一个子类中被重载

java的继承和实现

继承:如果多个类的某个部分功能下灵通,那么可以抽象一个类,把他们的相同的部分都放在父类中,让他们继承这个类。
实现:如果多个类处理的目标一样,但是处理方法方式不同,那么就定义一个接口,让它们实现这个接口,各自实现自己具体的处理方法处理目标。
java中支持一个类同时实现多个接口,但是不支持同时继承多个类。

class Car extends Benz implements GasolineCar, ElectroCar{

}

我们定义了一辆汽车,他实现了电动车和汽油车两个标准,但是他属于奔驰这个品牌。
所以我们可最大程度遵守标准,并复用奔驰车所有已有的功能组件。

java为何不支持多继承

一个类只有一个父类,称作单继承,而一个类有多个父类叫做多继承。
c++支持多继承,主要因为编程过程是对现实世界的一种抽象,而现实世界确实存在多继承。
比如猫既可以是哺乳动物的子类,拥有进食,繁殖功能,也可以是宠物的子类,拥有宠物独有功能。多年来,反对者认为它增加了程序复杂性和含糊性。
在这里插入图片描述
B,C继承A,D继承B,C就会导致使用D时如果想调用A的方法就会产生歧义(继承到两份来自A中的属性和方法)
C++为了解决这个问题,引入了虚继承,但经过分析,人们发现我们其实真正想要使用多继承的情况不多。所以就不允许多继承了但可以一个类实现多个接口。

java的继承和组合

**面向对象的复用技术:**作为面向对象开发的语言,代码复用是java引人注意的功能,java代码复用有继承,组合,代理三种具体表现形式。
组合和继承区别,联系:
继承中父类内部细节对子类是可见的,所以我们通常可说通过继承代码复用是白盒代码复用。(如果基类实现改变,派生类实现也将随之改变,导致子类行为不可预知性)
组合是通过现有的对象进行拼装产生新的复杂的功能,对象之间,各自内部细节不可见,所以也是这是黑盒代码复用。
组合在写代码时可以采用面向接口编程,类组合关系一般在运行期确定,继承在写代码就要指明具体继承哪个类,编译器就确定关系。
在同样可行情况下,优先使用组合,因为组合更安全,更简单,更灵活,更高效
该图是继承,表示“是一个”关系

在这里插入图片描述
该图是组合,表示“有一个”关系
在这里插入图片描述

构造函数与默认构造函数

构造函数主要用来创建对象时初始化对象,就是为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
构造器的函数名称必须和它所属的类的名称相同。它承担着初始化对象数据成员的任务。
默认情况下,一个Java类中会自动生成一个默认无参构造函数。默认构造函数一般会把成员变量的值初始化为默认值,如int -> 0,Integer -> null。
如果我们手动在某个类中定义了一个有参数的构造函数,那么这个默认的无参构造函数就不会自动添加了。需要手动创建。

类变量,成员变量,局部变量

java三种变量类变量,成员变量,局部变量分别存放在JVM的方法区,堆内存和栈内存中。

    /**
     * @author Hollis
     */
    public class Variables {
    
        /**
         * 类变量
         */
        private static int a;
    
        /**
         * 成员变量
         */
        private int b;
    
        /**
         * 局部变量
         * @param c
         */
        public void test(int c){
            int d;
        }
    }

成员变量和方法作用域

public:表明该成员变量或者方法是对所有类或者对象都是可见的,所有类或者对象都可以直接访问。
private:: 表明该成员变量或者方法是私有的,只有当前类对其具有访问权限,除此之外其他类或者对象都没有访问权限.子类也没有访问权限.。
protected:表明成员变量或者方法对类自身,与同在一个包中的其他类可见,其他包下的类不可访问,除非是他的子类
default: 表明该成员变量或者方法只有自己和其位于同一个包的内可见,其他包内的类不能访问,即便是它的子类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

龙崎流河

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

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

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

打赏作者

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

抵扣说明:

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

余额充值