java类的认识

java使用类来构造自己的数据类型,类其实就是对一类数据和行为的数据封装;可以达到低耦合功能;


java

注意啦:用类也是我们为了定义自己数据类型的一种方法,所以结构体,共用体也是一样的;都是为了处理数据而用的方法!

类的存放问题: java源代码文件是以类为中心的,一个类的定义源码必须只在一个源文件实现;一个“文件名.java”文件名必须与文件中用public class 修饰的类名一致,java语法还规定一个源文件中必须有且只能只有一个public类,public是一个访问修饰符,public的意思是我这个类可以供别的类使用,在任何地方。

从数据类型的角度看待类就有全新的认识:类是通过将别的数据类型封装到自己类里面作为自己的属性,代表一种全新的复杂数据类型。

类的构造方法:

方法名和类名是一样的

构造方法在创建对象的时候会java平台自动调用构造方法

构造方法没有返回值


类变量和类方法

类变量是该类的所有对象共享的变量,该类的任何一个对象访问它时候,取到的都是同一个内存地址的值; 同样任何一个该类的对象去修改它时,修改的也是同一个变量。类变量可以被对象的普通方法(非静态方法)去维护;

类变量是与类有关的公有属性

实例变量是属于每个对象个体的属性

类变量可以通过类名.类变量名直接访问

定义语法

访问修饰符 static 数据类型 变量名

访问类变量方式

类名.类变量名 或者 对象名.类变量名(不提倡)

程序有代码区和栈区

类方法

类方法定义形式

访问修饰符 static 返回值类型 函数名(参数列表)

类方法中不能访问非静态变量,

public static int getTotalFee()

{

age++; //对象属性,非静态变量

return totalFee;

}

但是普通方法可以访问静态变量(类变量)和对象属性(成员变量)

调用方式

通过类名.类方法名直接访问;

类方法属于与类相关的,公共的方法

实例方法属于每个对象个体的方法

java中默认遵守的规则:类变量用类方法去维护;


方法重载

1、方法一样

2、需要参数类型,参数数量,参数顺序至少有一项不同

3、参数返回值和方法修饰符可以不同,但是不能作为判定重载的依据:

比如两个函数,参数类型,数量,或顺序都是一致的,方法名一样;单纯的只是返回值不同或者方法修饰符不同那么这样不构成方法重载。编译器是会报错的

方法覆盖

方法覆盖是指子类有个方法和父类的某个方法在 返回值类型 + 方法名 +参数列表 一样;那么就说子类的方法覆盖了父类的这个方法。

类的继承可以做到代码的复用,但是也有一个问题,类中实现同一个功能的方法,父类和子类实现形式是不一样的;如果单纯地继承不能做到个性化。

方法覆盖是对父类方法在子类中重新实现;以在子类中调用该方法后直接调用子类方法而不去调用父类方法。方法覆盖需要 访问修饰符 + 返回类型 +方法名 +参数列表都一样;

总的来说方法覆盖有两点

1、子类方法的返回类型,方法名,参数列表要和父类的方法在这些方面完全一样

2、子类方法不能缩小父类方法的访问权限


Java命名规范

局部变量名(Local Variable Name)

1、局部变量名一般包含多个单词,一般不包含动词;第一个单词首字母小写 ;如myCar

2、变量名能突出变量作用,则应该突出变量类型;比如Car类型变量的引用,可以命名为car

3、数组名最好后面加 s,表示多

4、对于 boolean类型变量习惯以is开头

成员变量(Member Variable Name)

习惯上在变量名前加 m字母表示成员变量。表示member

类名 (Class Name)

类名习惯上有一个或几个单词组成,每个单词的首字母都大写

方法名 (method Name)

方法名表示该方法的功能,一般以动词开头,第一个单词的首字母小写:

参数名(parameter Name)

参数命名规则和局部变量命名规则差不多,但是为了区分一个变量是不是参数,可以给参数名前面加上一个p前缀,这个p代表parameter

包名(package Name)

包名一般是小写

包名一般用一个单词构成,它的全限定名应该可以表达包中类的作用,例如common包最好放在叫car包中,这样全限定名car.common就能够表示出common包存放的是普通汽车类


抽象类和接口

抽象类:解决父类方法的不确定性,比如父类的一个方法实例,但是子类对该方法又有不一样的实现方式,需要方法覆盖了。那么父类的该方法就永远也不会调用。这时候我们可以用abstract修饰父类方法,那么这个方法就是抽象方法;如果用abstract修饰该类,那么该类就叫抽象类。

抽象类是java里面比较重要的类,

注意事项

1、用abstract修饰的类那么该类就是抽象类

2、用abstract修饰的方法,那么这个方法就是一个抽象方法,这个抽象方法的实现必须在子类里面实现,不能在父类定义抽象方法进行方法实现。同时必须实现。

3、抽象方法在实际编程中用的不多,但是面试问的较多:

4、抽象类不能实例化

Animal a =new Animal(); //这样是错的

5、抽象类可以有没有用abstract修饰的方法

6、一旦类包含了用abstract修饰符修饰了方法,则这个类必须声明为abstract类

7、 抽象类里面的抽象方法不能有主体:比如

abstract public void cry() {}

这样是错误的。

当一个类继承的父类是抽象类的话,那么需要我们将父类里面的所有抽象方法全部实现

abstract class Animal
{
 String name;
 int age;
 abstract public void cry();

}
class Cat extends Animal
{
 public void cry()
 {

 }
}

接口:

先举例说明:

现实生活中的usb接口插槽:我们不用担心任何一个设备的usb接口和电脑连不上,因为usb插槽设备厂商和外设设备厂商遵守了一个共同的协议,比如usb尺寸,排线等;但是设备内部又是不一样。

使用背景:java是单继承的面向对象编程语言,而类实现接口编程可以实现多个接口,这在一定程度上呢弥补了类扩展的局限。

定义:

接口就是给出一些没有内容的方法,封装在一起,到某个类要使用的时候,然后再根据具体情况把这些方法实现出来。

语法:

class 类名 implements 接口
{
    实现所有接口方法;
    变量;
}

一个重要的原则:是当一个类实现了一个接口,就要求该类实现这个接口的所有方法,

小结:接口是相比抽象类是更抽象的类,抽象类可以有方法体(比如没有用abstract修饰的方法有方法体),但是接口的所有方法都没有方法体,接口实现了程序设计的多态和高内聚和低耦合的设计思想。

接口的注意事项

接口不能实例化;如Usb usb = new Usb();所有这些对接口实例化都是错误的,因为接口是一些没有内容的方法的封装。

接口中所有的方法都不能有方法主体,比如这样的 public void KK() { } 这些都是错的。

一个类可以实现多个接口,

接口中可以使用变量,关于接口中的变量有两点需要说明:、

接口中的变量本质上都是static的,

在java实际开发中,经常把用到的变量定义在接口中,作为全局变量使用。访问形式:接口名.变量名

一个接口不能继承类,但是可以继承其他的接口

抽象类和接口对比

不同:

抽象类可以有函数主体 的方法,但是如果方法用abstract修饰了的话,那么不能有方法体。

接口中所有的都不能有实现的主体,

相同:

用abstract修饰的方法,以及接口里面的方法必须在子类或者实现接口类中实现

继承和实现接口对比

java里面是单继承的,也就是说一个类只能继承一个父类,这样的机制可以保证类的纯洁性,比C++里面的多继承机制简单,问题就是对子类功能扩展有一定影响;但是实现接口是可以实现多个接口的,一定程度是弥补了子类扩展的缺陷。

还有一点是继承是层级式的,倘若类1发生变化,那么类1下面的其他类都将受到影响,而接口可以避免这个问题,因为接口只对实现接口的类有作用,当然如果实现接口的类被其他子类继承了,那么实现接口类实现的接口方法在子类也是可以用的。比如在类1我实现了一个接口,那么类 2 3 4 5 都可以我类1实现的接口类方法;

final

final可以修饰变量和方法

使用final修饰的变量,必须在创建/声明的时候赋初值,并且是确定的;赋值后不能在更改。

对于用final修饰的引用类型变量,java也是要求必须在声明时给予初始值。

final修饰的变量叫常量,final变量名命名

XXX_XXX_ZZZ

可能使用场景

当不希望父类的某个方法被子类覆盖时候,用final修饰该方法

当不希望类中变量被修改,用final修饰,同时必须初始化

当不希望该类被继承 final class Akk{ }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 00:45:05

java类的认识的相关文章

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

Java类的定义及其实例化

如果你不了解类和对象的概念,请猛击这里:Java类和对象的概念 类必须先定义才能使用.类是创建对象的模板,创建对象也叫类的实例化. 下面通过一个简单的例子来理解Java中类的定义: public class Dog{ String name; int age; void bark(){  // 汪汪叫 System.out.println("汪汪,不要过来"); } void hungry(){  // 饥饿 System.out.println("主人,我饿了")

js原型对象与Java类的区别

在我学习Javascript的原型对象时,我总是不自觉地拿Java的类思想来做比较,时间久了,我渐渐认识到二者有巨大的不同. 首先,类是不能直接当方法来运行,它最简便的方式是调用其静态方法:而原型对象本身就是一个方法体,它可以直接运行.二者在构造对象的过程中,js可以扮演两种角色,一个可以将原型对象当方法来使用,才接触js时,都是以这种形式来使用,即万物皆方法体,像c;另一个是模仿面向对象的特性,为原型对象定义属性,运用构造器时,将构造器构造的对象的指针指通过原型链指向原型对象的属性,从而实现面

Java类的设计----Object 类

Object类 Object类是所有Java类的根父类如果在类的声明中未使用extends关键字指明其父类,则默认父类为Object类 public class Person { ... } 等价于: public class Person extends Object {. ... }例: method(Object obj){-}//可以接收任何类作为其参数 Object o=new Person; method(o); ==操作符与equals方法 ==操作符与equals方法的区别: =

java类的生命周期

类的生命周期:加载.连接(验证.准备.解析).初始化.使用.卸载主动引用(有且只有)初始化: 1.new.getstatic.putstatic.invokestatic如果类没初始化,则初始化new关键字实例化对象.读取或设置一个类的静态字段(被final修饰.*已在编译期把结果放入常量池的静态字段除外).调用一个类的静态方法  2.使用java.lang.reflect包的方法对类进行发射调用的时候,如果类没有进行过初始化,则初始化 3.当初始化一个类的时候,父类没初始化,则初始化 4.当虚

Java —类和对象

类和对象 类是对象的类型,是具有相同的属性和方法的一组对象的集合. 定义类 访问修饰符 class 类名 { 数据类型 属性名: 访问修饰符 返回值类型 方法名 {} } 创建对象:类名 对象名 = new 类名(); 使用对象:引用对象的属性:对象名.属性名;引用对象的方法:对象名.方法名(); 可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立. 成员变量和局部变量 成员变量:在类中定义,描述对象将要有什么.可以在本类的方法或其他类的方法中使用.java会给成员变量一个初始

Eclipse或MyEclipse没有在java类文件上显示Spring图标的问题

Eclipse或MyEclipse没有在java类文件上显示接口图标的问题解决办法: 前: 后:

Java类的生命周期详解

引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正. 首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区域,这几

jsp页面应用Java类

两种方法将Java类应用到jsp页面中: 1. <jsp:useBean id="类实例名字" class="具体的类" scope="page/request/session/application" /><jsp:setProperty name="id的值" property="参数名" value="参数值" />//或者多个参数直对<jsp:get

java 类排序

参考文档:Java排序: Comparator vs Comparable 入门 java类经常面临排序问题,据我所知:java提供comparable和comparator两种比较方式: 1. comparable方法需要排序的类继承comparable接口,重写compareTo函数,但是只能实现一种对比方法(重写compareTo一次),例如: 类定义如下: class Student implements Comparable<Student> { private String nam