以下为《Java面向对象总结》的无排版文字预览,完整内容请下载
Java面向对象总结
面向对象的三大基本特征:继承性,封装性,多态性
一、关于java面向对象概念的理解
别人问你对象是什么,类是什么?你会怎么回答?
对于基本概念,自己的心里要有一个思路
要了解对象要先知道类,引用一句书本的概念:类用于描述客观世界里某一类对象的共同特征,而对象则是类的具体存在。
所以你的回答可以是:许多对象的共同特征的抽象概念就是类,而对象则是类的具体存在。
用代码来,解释一下:比如People类,有类成员:变量name和方法eat();
这里的People类只是一个抽象的概念,不能有实际的行为eat,这时候就需要实例化对象people来表现实际的行为。
实例化:People xiaoming=new People();
怎么理解这个表达式呢?左边是实例化还是右边是实例化呢?
其实右边才是实例化,然后把实例化的东西,赋值给左边的People类对象的引用地址
然后就有了People类的实例化对象xiaoming
对象就可以有实际行为了:
xiaoming.name= ”小明? ”;//赋予名字
xiaoming.eat();//执行某些操作
这里实例化就会运行类的构造方法,
比如你在另一个类的方法里面只编写new People(),即使没有赋值对象,也会运行People里面的构造方法,
重写一下People的构造方法,并在里面输出一句话,运行,就可以看到输出的语句。
?
借助网上一个例子解释,面向对象的思想:
???????所谓面向对象,书上说的都是关于对象的概念,这东西很抽象,难以理解,很简单的一个思路,如,我要木头,从建材市场这个对象拿,***出售木头这个方法,返回我一个木头。至于建材市场的木头哪来的,我不知道,也不用知道,这个社会有各行各业,他们全都是对象,都有一个方法,返回该职业能返回给社会的事物,之所以说面向对象更接近于人的正常思维,妙处就在这,我们把能拿到我们想要的东西的出处抽取成一个对象,我们直接访问它,拿到我们要的东西,它又从它该拿到东西的对象处拿东西,看似互不相干,却又有很多关系,这就是面向对象,记住,每一个对象,一个方法,只做它自己该做的事,其他的,交给其他的方法,其他的对象,层次理清楚,你能写出很棒的程序。
?
二、面向对象知识点总结
面向对象主要的内容:类和对象的关系,封装(机箱故事),继承,多态,构造函数,this,supper,static,内部类(用处很少),抽象类,接口
?
面向对象是一种思想,能让复杂的问题简单化,让我们角色从执行者变成指挥者,不要知道过程,只要知道结果。(一切皆对象。)
对象的特点在于封装数据,数据包含着属性和行为。
一般一个程序可以由很多个类组成,也可以有多个主函数,但一般有一个主函数就可以。
?
格式:引用类名对象名=new构造函数名(参数);
例:class DuiXiang{}
则建立对象为:DuiXiang mingZi=new DuiXiang();
如果要实现功能,则格式为:
mingZi.变量或函数名();
?
(一)面向对象之封装
函数是最小的封装体。类也是一个封装体。
private:私有的,权限修饰符,用来修饰类中的成员(成员变量 、成员函数),其只在本类中有效。
每个成员变量通常都会对应两个访问方式:一个设置,一个获取。
注意:私有仅是封装的一种表现形式。
因为语句都必须在函数内,所以,私有化后,再提供访问方式,就可以在访问方式的函数内实现变量控制。这样就提高代码的健壮性。
一般进行封装,要对类中的大部分属性都隐藏,最低权限是private。
类里有一个setXxx函数(一般返回值是void,保存数据,要带参数)和getXxx函数(有返回值类型,但一般没参数,getXxx之后一般用一个变量来接收:stringx=p.getXxx),那代表一定有一个私有化属性。
成员变量都有初始化值, 局部变量可以没有。
举例:
class? XueSheng
{
???????private?Stringname;
?????? public void?setName(Stringname)//这个函数方便以后赋值
?????? {
????????????? this.name=name;
?????? }
?????? public String?getName()//这个函数是方便以后有需要调用的,比如以后要打印name的值
?????? {
????????????? return name;
?????? }
?
?
构造函数:
函数名与类名一致,不用返回值类型,不可以用return,主要用来初始化对象。
对象一建立,就默认调用其构造函数。一个对象一建立,就有其默认的属性和行为。(如一个人刚出生就会呼吸,哭...)。
如果我们没有指认,那么类建立就会默认建一个构造函数(类名(){}),不然对象无法初始化,也就无法建立。(注意:只要我们有重写,那么就不会使用默认的建构造函数)
其与普通函数的区别除了写法上之外:
1,构造函数只在对象建立时运行一次,不再运行了,而普通函数可以调用多次,另外,构造函数是用来初始化对象的,而一般方法是用来添加对象具备的功能。
何时我们要手动添加构造函数:当我们分析事物时,该事物存在一些特性或行为,那么我们就给其定义一个构造函数,如果有变量参与运算,那么我们就给构造函数定义一个参数。
?
构造函数写法举例:
class Person
{
?????? Person(String name,int age)
//注意:在新建一个对象时要加上参数进行区分,因为一个类可以放很多个构造方法。
//比如调用方式:Person p =new Person("fada",20)//构造函数已经被重写了,默//认的构造方法已经不存在了,再调用?Person p=new Person();会报错
?????? {
????????????? this.name = name;
????????????? this.age = age;
?????? }
??????
?
?
?
初始化代码块:(不怎么用)
1,所有对象在建立时都先执行构造代码块初始化,再执行构造函数初始化。
2,作用:当所有对象有共性时,那么就可以定义一个构造代码块(例如:所有小孩先出来就是哭,然后才有其它的属性)
构造代码块的写法(就是在类里面用一个大括号)举例:
class Person
{
{
System.out.print("fada")
//这样一写,那么以后每次建立一个构造函数时便先初始化这个构造代码块
}
}
?
this关键字的用法
This在类中就是三个代表:代表对象的成员变量,在函数中代表对象调用函数,代表类中的构造函数。
?
格式:this.变量=变量;
this是用来区分局部变量和成员变量同名时的关键字,因为如果在构造函数里比如(name=name),那么其是赋值给他本身,而不是赋值给类里面的name。
何某某this?当定义类中的函数时,需要调用该函数的对象时,这个时候就用this来表示这个对象。
但凡本类功能内部使用到了本类对象,用this表示。
看到this就是有代表对象,代表哪个对象就看其所在功能被哪个对象调用。
这样就知道谁在参与运算。
?
例:
class Person
{
?????? private String name;
?????? Person(String name)
?????? {
??????????????this.name= name;//this.name=p1.name;
}
}
class PersonDemo3
{
?????? public static void main(String[] args)
?????? {
?
????????????? Person?p1?=new Person("fada");
?
?
?
?
?
this的应用之定义类中函数的调用:当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。
????????????? 但凡本类功能内部使用了了本类对象,都用this表示。
例:
class Person
{
private String name;
?????? Person(String name)
?????? {
??????????????this.name= name;//this.name=p1.name;
this.fada();//其实就==p1.fada();
//这里写这p1是因为p1这个对象在调用这个函数。一句话,谁调用它就在代表谁。
}
private int age;
Person(int age)
{
?????? this.age =age;
}
public void fada()
?????? {
????????????? System.out.println("fada");
}
/*
???????需求:给人定义一个用于比较年龄是否相同的功能。也就是是否是同龄人。
?????? */
?????? public boolean compare(Person p)
?????? {
????????????? return?this.age==p.age;
?
?????? }
}
?
class PersonDemo
{
?????? public static void main(String[] args)
?????? {
?
????????????? Person p1 = new Person(20);
????????????? Person p2 = new Person(25);
//因为是两个人比,所以要先建立两人的对象
????????????? boolean b = p1.compare(p2);
//这里定义了一个布尔型变量去接收p1调用compare函数的值
????????????? System.out.println(b);
?
?
另一种this用法:格式this(变量)
用于构造函数间的相互调用,而且只能放在构造函数的第一行。
然后先初始化其this调用的构造函数,再初始化本身的构造函数。
其实this(变量);=new 构造函数名(变量);(因为所有构造函数名是一样的,都是重载函数,所以,通过变量来标记构造函数,用this去引用)
例:
classPerson
{
?????? private String name;
?????? private int age;
??????
???????Person()
?????? {
?????? ?????? System.out.println("personrun");
?????? }
?????? Person(String name)
?????? {
??????????????This();
this.name =name;
?????? }
}
?
二、super
?
?? super关键和this作用类似,是被屏蔽的成员变量或者成员方法或变为可见,或者说用来引用被屏蔽的成员变量和成员成员方法。不过super是用在子类中,目的是访问直接父类中被屏蔽的成员,注意是直接父类(就是类之上最近的超类)。下面是一个综合运用super的例子,有两个类:一个Father类,一个Father类的子类Son,通过这两个类完全演示了super的用法,一下是代码:
?
public class Father {?public String v="Father";?public String x="输出了Father类的public成员变量x!!!";??public Father() {??System.out.println("Father构造方法被调用!");?}??public Father(String v){??this.v="Father类的带参数构造方法!运行了.";?}?public void outinfo(){??System.out.println("Father的outinfo方法被调用");?}?
?public static void main(String[] args) {??// TODO?自动生成方法存根?}}
?
?
public class Son extends Father{
?public String v="Son";??public Son() {??super();??????//调用超类的构造方法,只能放到第一行.??System.out.println("Son无参数构造方法被调用!");??//super();??????//错误的,必须放到构造方法体的最前面.?}???public Son(String str){??super(str);??System.out.println("Son带参数构造方法被调用!");?}?//覆盖了超类成员方法outinfo()?public void outinfo(){???System.out.println("Son的outinfo()方法被调用");?}???public void test(){????String v="哈哈哈哈!";???//局部变量v覆盖了成员变量v和超类变量v????System.out.println("------1-----");??System.out.println(v);???//输出局部变量v??System.out.println(this.v);??//输出(子类)成员变量v??System.out.println(super.v);?//输出超类成员变量v?????System.out.println("------2-----");??System.out.println(x);???//输出超类成员变量v,子类继承而来??System.out.println(super.x);?//输出超类成员变量v????System.out.println("------3-----");??outinfo();???//调用子类的outinfo()方法??this.outinfo();??//调用子类的outinfo()方法??super.outinfo();?//调用父类的outinfo()方法?}???public static void main(String[] args) {??new Son().test();???}}
?
子类Son运行结果:
?
Father构造方法被调用!Son无参数构造方法被调用!------1-----哈哈哈哈!SonFather------2-----输出了Father类的public成员变量x!!!输出了Father类的public成员变量x!!!------3-----Son的outinfo()方法被调用Son的outinfo()方法被调用Father的outinfo方法被调用
?
????说明:例子仅仅为了说明super的用法,实际在设计类的时候一般都尽可能私有(private)化。
?
???通过上面的例子,下面总结一下super的用法:???第一、在子类构造方法中要调用父类的构造方法,用“super(参数列表)”的方式调用,参数不是必须的。同时还要注意的一点是:“super(参数列表)”这条语句只能用在子类构造方法体中的第一行。???第二、当子类方法中的局部变量或者子类的成员变量与父类成员变量同名时,也就是子类局部变量覆盖父类成员变量时,用“super.成员变量名”来引用父类成员变量。当然,如果父类的成员变量没有被覆盖,也可以用“super.成员变量名”来引用父类成员变量,不过这是不必要的。???第三、当子类的成员方法覆盖了父类的成员方法时,也就是子类和父类有完全相同的方法定义(但方法体可以不同),此时,用“super.方法名(参数列表)”的方式访问父类的方法。
?
??this、super的用法也不过这些,只有理解了其中的原理,才不会跌入陷阱!
?
?
Static(静态)关键字:
static是一个修饰符:
三种修饰:修饰类的变量、方法和构造代码块。静态方法只能直接引用和访问静态变量和方法
注意(函数即方法,对象也叫实例)
有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main() 。因为在程序开始执行时必须调用main() ,所以它被声明为static。 声明为static的变量称为静态变量或类变量。可以直接通过类名引用静态变量,也可以通过实例名来引用静态变量,但最好采用前者,因为后者容易混淆静态变量和一般变量。静态变量是跟类相关联的,类的所有实例共同拥有一个静态变量。关键点:静态变量与实例变量的区别:静态变量也叫类变量,为所有对象所共有,所以一个对象的变量值改变,那么所有对象的值一起发生改变。
而实例变量则是各自独立的不受影响。
声明为static的方法称为静态方法或类方法。静态方法可以直接调用静态方法,访问静态变量,但是不能直接访问实例变量和实例方法。静态方法中不能使用this关键字,因为静态方法不属于任何一个实例。静态方法不能被子类的静态方法覆盖。
特有属性随着对象存储于堆内存中,而static修饰后的属性,存在于方法区.
什么时候使用静态修饰符?
当对象中出现共享数据时,使用静态修饰。
但对象内的特有数据要定义成非静态存在于堆内存中。
而对于方法时:
当功能内部没有访问到非静态数据时,(即对象的特有数据)
那么可以使用静态修饰。
静态代码块:
用于给类做初始化的。不管有没有对象都执行,只要调用了类里面成员或方法,就会执行,而且优先于主函数,优先执行级别最高。
?
例:
class JingTai
{
?????? static intage;
?????? staticString name;
?????? static//静态代码块初始化类的,所以最先运行。
?????? {
????????????? System.out.println("name="+name);
?
?????? }
//下面是构造代码块,第二个运行
?????? {
????????????? System.out.println("age="+age);
?????? }
?????? publicstatic void jing(int x)//被对象调用,第三个运行。
?????? {
????????????? x=age+1;//因为age是静态的,所以能调用
内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 线程
setdaemon(ture)方法:守护线程,也就是后台线程,要在线程运行前加载。
特点为:当只剩下守护线程时,java虚拟机自动退出。
应用:输入出输出,不再输入了,输出就没有意义,所以可以把输出线程标记为守护线程,那么输入线程也就是前台线程运行结束,这个时候输出线程也会自动结束。
等待线程中止
join();
一旦线程调用它,那么主线程便会释放cpu执行权,直到调用它的线程运行完,并抛出一个异常,主线程才会激活继续运行。这个可以用来插入线程。
提高权限优先级
setPriority();方法,总共有1—10,因为是常量,所以给一个名称,例如给最高的优先级。则为线程名.setPriority(Thread.MAX_PRIORITY);
暂停当前执行的线程,让其它线程运行。
Thread.yield();这样可以让线程交替运行,平均执行权。?
当一个主函数里有多个循环或运行程序,则可使用匿名内部类封装成多个线程。这样程序高效,不干扰。
?
?上面是java面向对象和类涉及到的一些知识,有自己写的,也有网上借鉴的,有的是比较基础的,也有的是复杂点的,可以根据自己的情况适当阅读。
[文章尾部最后500字内容到此结束,中间部分内容请查看底下的图片预览]请点击下方选择您需要的文档下载。
以上为《Java面向对象总结》的无排版文字预览,完整内容请下载
Java面向对象总结由用户“duanhailong”分享发布,转载请注明出处