对java类的理解
类与对象
类有两部分组成:类声明与类体,类体可以包括成员变量和⽅法。
使⽤new运算符和类的构造⽅法为声明的对象分配成员变量,创建对象就是为它分配成员变量并获得⼀个引⽤,确保对象对相应成员变量的管理。
如果类中没有构造函数,系统默认⼀个⽆参构造函数。
当类创建⼀个对象时,成员变量被分配内存空间,这些内存空间被称为该对象的实体或变量。
Java具有垃圾回收机制:Java的运⾏环境会周期地检测某个实体是否已经不再被任何对象引⽤,如果发现这样的实体,就会释放实体占有的内存。例如:对象t1被重新构造或被t2赋值或被赋值null,原来的实例占有的内存就会被释放。
变量
实例变量:⾪属于不同的对象,不同对象的实例变量分配不同的空间
类变量(静态变量):⽤关键字static修饰,该类创建的所有对象的这个变量分配给相同的内存。
常量
⽤final修饰,命名习惯⽤⼤写字母。不占⽤内存,不能被修改,所以必须被初始化。
⽅法
构造⽅法:专门⽤于创建对象,⽤来给出类所创建的对象的初始状态。
⼀个类可以重载多个构造⽅法(多个⽅法的⽅法名相同,但参数不同)。
实例⽅法:可以调⽤该类中的实例⽅法或类⽅法,可以操作成员变量。
类⽅法:⽤static修饰,类⽅法只能调⽤该类的类⽅法和操作类变量,不能调⽤实例⽅法和操作实例变量。
引⽤型数据:数组、对象、接⼝。变量存储的是引⽤(地址)⽽⾮实体。
this:表⽰的是当前对象,不可以出现在类⽅法中。
构造⽅法是创建对象的初始化过程,实例⽅法依托于对象,当然可以使⽤this
使⽤this可以区分成员变量和局部变量。
private修饰-私有变量和私有⽅法类的私有
public修饰-共有变量和共有⽅法 完全共有
不⽤修饰符-友好变量和有好⽅法 同⼀个包内可以引⽤
protected修饰-受保护的变量和有好⽅法同⼀个包内可以引⽤
⼦类可以继承不在同⼀个包中⽗类的protected的成员变量和⽅法。与调⽤protected的实例变量和实例⽅法有差异。
抽象类与接⼝
2.1基本概念
abstract class和interface在Java语⾔中都是⽤来进⾏抽象类定义的,那么什么是抽象类,使⽤抽象类能为我们带来什么好处呢?
在⾯向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所
有的类都是⽤来描绘对象的,如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。抽象类往往⽤来表征我们在对问题领域进⾏分析、设计中得出的抽象概念,是对⼀系列看上去不同,但是本质上相同的具体概念的抽象。⽐如:如果我们进⾏⼀个图形编辑软件的开发,就会发现问题领域存在着圆、三⾓形这样⼀些具体概念,它们是不同的,但是它们⼜都属于形状这样⼀个概念,形状这个概念在问题领域是不存在的,它就是⼀个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以⽤以表征抽象概念的抽象类是不能够实例化的。
在⾯向对象领域,抽象类主要⽤来进⾏类型隐藏。我们可以构造出⼀个固定的⼀组⾏为的抽象描述,但是这组⾏为却能够有任意个可能的具体实现⽅式。这个抽象描述就是抽象类,⽽这⼀组任意个可能的具体实现则表现为所有可能的派⽣类。模块可以操作⼀个抽象体。由于模块依赖于⼀个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派⽣,也可扩展此模块的⾏为功能。熟悉OCP的读者⼀定知道,为了能够实现⾯向对象设计的⼀个最核⼼的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
2.2抽象类与接⼝的区别
1.abstract class 在 Java 语⾔中表⽰的是⼀种继承关系,⼀个类只能使⽤⼀次继承关系。但是,⼀个类却可以实现多个interface。
2.在abstract class 中可以有⾃⼰的数据成员,也可以有⾮abstarct的成员⽅法,⽽在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中⼀般不定义数据成员),所有的成员⽅法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表⽰的是"is-a"关系,interface表⽰的是"like-a"关系。例如:带报警的门可以设计成本质上是报警器同时具有门的功能。继承报警器抽象类,实现门的接⼝。
4.实现抽象类和接⼝的类必须实现其中的所有⽅法。抽象类中可以有⾮抽象⽅法。接⼝中则不能有实现⽅法。
.接⼝中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
6.抽象类中的变量默认是 friendly 型,其值可以在⼦类中重新定义,也可以重新赋值。
7.接⼝中的⽅法默认都是 public,abstract 类型的。
结论:abstract class 和 interface 是 Java语⾔中的两种定义抽象类的⽅式,它们之间有很⼤的相似性。但是对于它们的选择却⼜往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是
否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语⾔的⼀种的惯⽤法,希望读者朋友能够细细体会。
对⾯向对象的理解
⾯向对象是⼀种思想
⼀.设计步骤:
(1)程序设计⾸先解决的是基本类的设计(动物)――有属性和⽅法。
(2)实例化产⽣对象(⼈),这样动物有的属性和⾏为,⼈不⽤定义也可以拥有,符合⾃然规律。
(3)对对象进⾏各种操作。
⼆.设计意义:
通过使⽤⾯向对象的设计原则,程序员可以把⼀个复杂程序分成各个独⽴组成模块,需要具有⾼内聚低耦合的特性,便于设计与维护。
三.特点:
(1)封装
封装隐藏了类的内部实现机制,可以在不影响使⽤者的前提下修改类的内部结构,同时保护了数据。
(2)继承
⼦类继承⽗类就拥有了⽗类的属性和⽅法。同时⼦类可以重写⽗类的⽅法。
(3)多态
相同的⽅法有不同的表现形式。
i.⽅法重载
在类中定义了⼆个或以上的相同名称⽅法,但它们拥有不同的参数列表。调⽤时需要完全相同。
ii.⽅法的重写
在⼦类中声明了⼀个和⽗类相同的⽅法,⽗类的⽅法在⼦类中就被覆盖了。⼦类重写⽗类的⽅法时访问修饰符要⼤于或者等于⽗类的,绝对不能⼩于。如果要在⼦类中调⽤⽗类被重写的⽅法,可以使⽤super.⽅法名(参数列表),如果不⽤super.⽅法名(参数列表),则调⽤的是⾃⼰重写的⽅法。
iii.⽗类的引⽤指向⼦类的对象时
根据指向的对象不同,同样的⽅法会有不同的表现。
例如⽗类Animal,⼦类Cat,Dog。其中Animal可以是类也可以是接⼝,Cat和Dog是继承或实现Animal的⼦类。
Animal animal1 = new Cat();或Animal animal2 = new Dog();
即声明的是⽗类,实际指向的是⼦类的⼀个对象。
对象的上转型对象的实质是⼦类负责创建,但上转型对象失去了原对象的⼀些功能。上转型对象只能操作⼦类继承的成员变量和隐藏的成员变量、⼦类继承的⽅法或重写的⽅法。
//对象的上转型对象可以调⽤上型变量(包括被继承和被隐藏的)和下型⽅法(包括继承的和重写的)
//不能操作⼦类新增的变量和⽅法
//可以将上转型对象强制转换成⼀个⼦类对象。
//优点总结:可以重写⽅法,灵活转换,其余与上型⼀致。
4 关键字
1.super:
(1)⼦类使⽤它调⽤⽗类构造⽅法(⼦类不继承⽗类构造⽅法),默认在⼦类构造⽅法中有super();即调⽤⽗类⽆参构造⽅法。
(2)⼦类⽤它调⽤被⼦类隐藏的成员变量和⽅法。
2.this:
在类的实例⽅法中,相当于“我”,可以引⽤该⽅法当前对象。
五、修饰符
java中的修饰符分为类修饰符,字段修饰符,⽅法修饰符。根据功能的不同,主要分为以下⼏种。
java类的概念1、权限访问修饰符
public,protected,default,private,这四种级别的修饰符都可以⽤来修饰类、⽅法和字段。
可以继承的⼦类所在:
public:所有的
protected:⾃⼰包内+其他包中⼦类
default:⾃⼰包内
private:⾃⼰类中
2、final修饰符
final的意思是不可变,他可以修饰类、字段、⽅法。
修饰类后类不能被继承。修饰字段后字段的值不能被改变(应该对字段进⾏⼿动初始化)。修饰⽅法后该⽅法不能被重写。
3、abstract修饰符
abstract是抽象的意思,⽤来修饰类和⽅法。(必须重写使具体化)
修饰类后,该类为抽象类,不能被实例化,必需进⾏扩展。修饰⽅法后,该⽅法为抽象⽅法必须被⼦类重写(override)。
4、static修饰符
static⽤来修饰内部类,⽅法,字段。(属于类)
修饰内部类说明该内部类属于外部类⽽不属于外部类的某个实例。修饰字段说明该字段属于类⽽不属于类实例。修饰⽅法说明该⽅法属于类⽽不属于类实例。
5 内部类
5.1 匿名内部类
匿名类是不能有名称的类,所以没办法引⽤它们。必须在创建时,作为new语句的⼀部分来声明它们。这就要采⽤另⼀种形式的new语句,如下所⽰: new <;类或接⼝> <;类的主体> 这种形式的new语句声明⼀个新的匿名类,它对⼀个给定的类进⾏扩展,或者实现⼀个给定的接⼝。它还创建那个类的⼀个新实例,并把它作为语句的结果⽽返回。要扩展的类和要实现的接⼝是new语句的操作数,后跟匿名类的主体。如果匿名类对另⼀个类进⾏扩展,它的主体可以访问类的成员、覆盖它的⽅法等等,这和其他任何标准的类都是⼀样的。如果匿名类实现了⼀个接⼝,它的主体必须实现接⼝的⽅法。
java 代码
1. interface pr
2. {
3. void print1();
4. }
5.
6. public class noNameClass
7. {
8. public pr dest()
9. {
11.public void print1()
12. {
13. System.out.println("Hello world!!");
14. }
15. };
16.}
17.
18.public static void main(String args[])
19.{
20. noNameClass c=new noNameClass();
21. pr hw=c.dest();
22. hw.print1();
23.}
24.}
25.
pr也可以是⼀个类但是你外部调⽤的⽅法必须在你的这个类或接⼝中声明外部不能调⽤匿名类内部的⽅法
Java中内部匿名类⽤的最多的地⽅也许就是在Frame中加⼊Listner了吧。
如下:
java 代码
1. import java.awt.*;
2. import java.awt.event.*;
3.
4. public class QFrame extends Frame {
5. public QFrame() {
6. this.setTitle("my application");
7.
8. addWindowListener(new WindowAdapter() {
9. public void windowClosing(WindowEvent e) {
10. dispose();
11. it(0);
12.}
13. });
14.
15.this.setBounds(10,10,200,200);
16. }
17.}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论