黑马程序员—面向对象(下)

本文详细介绍了Java中的面向对象、抽象类、接口、包与内部类的概念与应用,包括抽象类的特点、接口的定义与实现、包的作用与访问规则,以及内部类的定义与访问特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

面向对象:

 

 

抽象类:

概述:用abstract 关键字修饰的类(当多个类中出现相同功能,但是功能主体不同,这时可以进行向上抽取;只抽取功能定义,而不抽取功能主体。)

 

抽象类的特点

A:抽象类和抽象方法必须使用abstract修饰

B:抽象类不能被实例化

C:抽象类有构造方法,用于子类实例化使用

D:如果一个类是抽象类,那么,继承它的子类

要么是抽象类。

要么重写所有抽象方法。

抽象类的成员特点

A:成员变量 --可以变量,也可以是常量

B:构造方法 --有构造方法

C:成员方法 --可以有抽象方法,也可以有非抽象方法(全是抽象方法或者非抽象方法都是可以的) 

abstract不能和哪些关键字共存?

Final  private   static

补充:

抽象类和一般类:

相同点:抽象类和一般类都是用来描述事物的,都在内部定义了成员。 

不同点: 

1)一般类有足够的信息描述事物;而抽象类描述事物的信息有可能不足。 

2)一般类中不能定义抽象方法,只能定义非抽象方法.而抽象类中可定义抽象方法,同时也可以定义非抽象方法。 

3)一般类可以被实例化;而抽象类不可以被实例化。 

 

代码示例:

abstract class Student
{
abstract final void study();
//abstract void study1();
void sleep()
{
System.out.println("躺着");
}
}
/*
 
class ChongCiStudent extends Student
{
void study()
{
System.out.println("chongci study");
}
}
 
class BaseStudent extends Student
{
void study()
{
System.out.println("base study");
}
}
 
class AdvStudent extends Student
{
void study()
{
System.out.println("adv study");
}
}
*/
class AbstractDemo 
{
public static void main(String[] args) 
{
//new Student();
//new BaseStudent().study();
}
}

 

 

接口

概述;当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口 (interface)。 

格式: interface接口名{} 

 

如何定义一个接口?用interface 关键字声明。

定义好了一个接口,如何去使用这个接口?用implements 关键字实现接口中所有的方法。

代码示例:

interface Inter
{
public static final int NUM = 3;
public abstract void show();
}
 
interface InterA
{
public abstract void show();
}
 
class Demo
{
public void function(){}
}
 
class Test extends Demo implements Inter,InterA
{
public void show(){}
}
 
 
interface A
{
void methodA();
}
interface B //extends A
{
void methodB();
}
 
interface C extends B,A
{
void methodC();
}
 
class D implements C
{
public void methodA(){}
public void methodC(){}
public void methodB(){}
}
 
 
class InterfaceDemo 
{
public static void main(String[] args) 
{
Test t = new Test();
System.out.println(t.NUM);
System.out.println(Test.NUM);
System.out.println(Inter.NUM);
 
}
}


 

 

补充:
implements( 实现 )

*  注意:接口不可以实例化;只能由实现了接口的子类并覆盖了接口中所有的抽象方法后,该子类才可以实例化:否则这个子类也是抽象类。 

*  在Java中不直接支持多继承,因为会出现调用的不确定性。 所以Java将多继承机制进行改良,在Java中变成了多实现。 

*一个类可以实现多个接口。 

      接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。 

      接口的出现避免了单继承的局限性。

 

注意:加abstract 的情况接口可以不被多实现。

 

接口的特点:

A:接口不能被实例化。

B:一个类如果实现了接口:

要么是抽象类。要么实现接口中的所有方法。

 

接口的成员特点:

A:成员变量 只能是常量。默认修饰符 public static final

B:成员方法 只能是抽象方法。默认修饰符 public abstract

推荐:永远手动给出修饰符。

接口的思想特点:

A:对外暴露的规则

B:是功能的扩展

C:降低耦合度

耦合:类与类的关系

内聚:类自己完成某件事情的能力接口上的成员有哪些特点?

类,接口的关系

A:类与类

继承关系,只能单继承,可以多层继承。

B:类与接口

实现关系,可以单实现,也可以多实现。

还可以在继承一个类的同时实现多个接口。

C:接口与接口

继承关系,可以单继承,也可以多继承。

抽象类和接口的区别?

相同点:都是不断向上抽取而来的。 

不同点: 

1,抽象类需要被继承,而且只能单继承。接口需要被实现,而且可以多实现。 

2,抽象类中可以定义抽象方法和非抽象方法,子类继承后,可以直接使用非抽象方法。 

注意:接口中只能定义抽象方法,必须由子类去实现。 

3,抽象类的继承,是is a关系,在定义该体系的基本共性内容。接口的实现是like a关系。

 

代码示例练习:

/*
abstract class Student
{
abstract void study();
void sleep()
{
System.out.println("sleep");
}
 
}
 
interface Smoking//不是每个学生都抽烟,所以定义为接口,扩展功能
{
void smoke();
}
 
class ZhangSan extends Student implements Smoking
{
void study(){}
public void smoke(){}
}
class Lisi extends Student 
{
}
 
 
 
abstract class Sporter
{
abstract void play();
}
interface Study
{
}
class wangwu extends Sport implements Study
{
}
*/
 
class  
{
public static void main(String[] args) 
{
System.out.println("Hello World!");
}
}


 

 

包 package

一.概念:

1*对类文件进行分类管理 

2*给类提供多层命名空间 

3*写在程序的第一行 

4*类名的全称是 包名.类名 

5*包也是一种封装形式 

二.格式:Package pack;//定义一个包(package 包名)

注意: Java中定义包是的规则是字母都是小写//package com.itcast.pack.demo

 

类的全名称是:包名.类名

 

    编译命令:javac –d 位置(.当前路径) java源文件 

 

包是一种封装形式,用于封装类,想要被包以外的程序访问,该类必须用public修饰

 

 

三.包与包之间访问:

*需要设置classpath告诉Jvm去哪里找指定的package

*包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰
*不同包中的子类还可以直接访问父类中被protected(被保护的)权限修饰的成员
*包与包之间可以使用的权限只有两种,public protected


                            public     protected     default     private
     同一个类中      ok              ok            ok            ok
     同一个包中      ok              ok            ok
     子类             ok          ok
     不同包中         ok 

 

推荐:

成员变量 private

构造方法 public

成员方法 public

 

四.不同修饰符修饰的内容(掌握 和内部类无关)

类 成员变量 成员方法 构造方法

private Y Y Y

默认 Y Y Y Y

protected Y Y Y

public Y Y Y Y

abstract Y Y

static Y Y

final Y Y Y

 

注意,常见规则如下:

以后,所有的类都用public修饰。并且,在一个java文件中,只写一个类。

 

以后,所有的成员变量用private修饰。

 

以后,所有的成员方法用public修饰。

如果是抽象类或者接口:

public abstract + ...

 

以后,所有的构造方法用public修饰。

如果类是工具类或者单例类:

构造用private修饰

 

 

 

 

 

import 关键字: 

当我们用到某个包中的类的时候,就用关键字import把包的所有的类导入进行。 

 

内部类

1.概述:将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。 

简单的说就是类中还有一个类,就是内部类。 

字节码文件名:外部类名$内部类名.class 

 

2.内部类访问特点: 

l 内部类可以直接访问外部类中的成员,包括私有成员。 

l 而外部类要访问内部类中的成员必须要建立内部类的对象。 

 

3.一般用于类的设计。 

分析事物时,发现该事物描述中还有事物,而且这个事物还在访问被描述事物的内容。 

这时就是还有的事物定义成内部类来描述。 

直接访问外部类中的内部类中的成员。 

 

4.格式:

外部类名.内部类名 = new 外部类对象.new 内部类对象; 

Outer.Innerin = new Outer().new Inner(); 

in.method(); 

如果内部类是静态的。 相当于一个外部类 

外部类名.内部类名 = new 外部类对象.内部类; 

Outer.Inner in = new Outer.Inner(); 

in.method(); 

如果内部类是静态的,成员是静态的。 

外部类名.内部类名.静态函数名; 

Outer.Inner.function(); 

 

注:如果内部类中定义了静态成员,该内部类也必须是静态的。

代码示例:

class Outer
{
private int x = 3;
 
class Inner//内部类
{
//int x = 4;
void function()
{
//int x = 6;
System.out.println("innner :"+Outer.this.x);//输出6,直接X;输出4,this.x;输出3,Outer.this.x
}
}
 
/**/
void method()
{
Inner in = new Inner();
in.function();
}
}
 
 
class  InnerClassDemo
{
public static void main(String[] args) 
{
Outer out = new Outer();
out.method();
 
//直接访问内部类中的成员。
//	Outer.Inner in = new Outer().new Inner();
//	in.function();
}
}


 

 

5.为什么内部类能直接访问外部类中成员呢? 

因为内部类持有了外部类的引用。  外部类名.this 

内部类可以存放在局部位置上。(也就是定义在外部类的成员函数里面,主函数也是函数)
内部类在局部位置上只能访问局部中被final修饰的局部变量。 

 

补充:

静态内部类+内部类定义规则

/*

1,当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。

可以直接建立内部类对象。

访问格式:

外部类名.内部类名  变量名 外部类对象.内部类对象;

Outer.Inner in = new Outer().new Inner();

 

2,当内部类在成员位置上,就可以被成员修饰符所修饰。

比如,private:将内部类在外部类中进行封装。

static:内部类就具备static的特性。

当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问局限。

 

在外部其他类中,如何直接访问static内部类的非静态成员呢?

new Outer.Inner().function();

 

在外部其他类中,如何直接访问static内部类的静态成员呢?

outer.Inner.function();

 

注意:当内部类中定义了静态成员,该内部类必须是static的。

  当外部类中的静态方法访问内部类时,内部类也必须是static的。

 

当描述事物(类)时,事物的内部还有事物,该事物用内部类来描述。

因为内部事务在使用外部事物的内容。

如:

class Dome

{

private class Lisi

{

 

}

 

public void show()

{

new  Lisi().

}

}

 

*/

class Outer

{

private static  int x = 3;

 

static class Inner//静态内部类

{

static void function()

{

System.out.println("innner :"+x);

}

}

 

static class Inner2

{

void show()

{

System.out.println("inner2 show");

}

}

 

public static void method()

{

//Inner.function();

new Inner2().show();

}

 

}

 

class  InnerClassDemo2

{

public static void main(String[] args) 

{

Outer.method();

//Outer.Inner.function();

//new Outer.Inner().function();

//直接访问内部类中的成员。

// Outer.Inner in = new Outer().new Inner();

// in.function();

}

}

/*

 

 

内部类定义在局部时

内部类定义在外部类中的某个方法中,创建了这个类型的对象时,且仅使用了一次,那么可在这个方法中定义局部类。

特点:

1,不可以被成员修饰符修饰(Static,private)

2可以直接访问外部类中的成员,因为还持有外部类中的引用。

但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。(生命周期不同)

*/
 
class Outer
{
int x = 3;
 
void method(final int a)
{
final int y = 4;
int yy = 888;
class Inner
{
void function()
{
System.out.println(y);
System.out.println(a);
//System.out.println(yy);不能访问方法中的局部变量,需要用final修饰
}
}
//只能在局部方法中创建局部内部类对象
Inner in= new Inner();
in.function();
}
}
 
 
class  test3
{
public static void main(String[] args) 
{
Outer out = new Outer();
out.method(7);//运行局部成员函数,运行完出栈
out.method(8);
}


 

 

 

匿名内部类:(匿名子类对象)  

其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,也可以理解为,带内容的对象。  

1.概述:是定义在局部位置的没有名字的内部类。

2:前提:内部类必须是继承一个类或者实现接口。

3:格式:new 父类或者接口(){定义子类的内容}

 

4:使用

当你看到方法的形式参数是接口或者抽象类的时候。用匿名内部类改进

代码示例:

abstract class AbstractDemo
{
abstract void show();
}
 
class Outer
{
int x = 3;
 
/*
class Inner extends AbstractDemo
{
int num = 90;
void show()
{
System.out.println("show :"+num);
}
void abc()
{
System.out.println("hehe");
}
}
*/
 
public void function()
{
//AbstractDemo a = new Inner();
//	Inner in = new Inner();
//	in.show();
//	in.abc();
 
AbsDemo d = new AbsDemo()
{
int num = 9;
void show()
{
System.out.println("num==="+num);
}
void abc()
{
System.out.println("haha");
}
};
 
d.show();
//d.abc();//编译失败;
 
 
}
}
 
class InnerClassDemo4 
{
public static void main(String[] args) 
{
new Outer().function();
}
}


 



------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

资源下载链接为: https://pan.quark.cn/s/9648a1f24758 这个HTML文件是一个专门设计的网页,适合在告白或纪念日这样的特殊时刻送给女朋友,给她带来惊喜。它通过HTML技术,将普通文字转化为富有情感和创意的表达方式,让数字媒体也能传递深情。HTML(HyperText Markup Language)是构建网页的基础语言,通过标签描述网页结构和内容,让浏览器正确展示页面。在这个特效网页中,开发者可能使用了HTML5的新特性,比如音频、视频、Canvas画布或WebGL图形,来提升视觉效果和交互体验。 原本这个文件可能是基于ASP.NET技术构建的,其扩展名是“.aspx”。ASP.NET是微软开发的一个服务器端Web应用程序框架,支持多种编程语言(如C#或VB.NET)来编写动态网页。但为了在本地直接运行,不依赖服务器,开发者将其转换为纯静态的HTML格式,只需浏览器即可打开查看。 在使用这个HTML特效页时,建议使用Internet Explorer(IE)浏览器,因为一些老的或特定的网页特效可能只在IE上表现正常,尤其是那些依赖ActiveX控件或IE特有功能的页面。不过,由于IE逐渐被淘汰,现代网页可能不再对其进行优化,因此在其他现代浏览器上运行可能会出现问题。 压缩包内的文件“yangyisen0713-7561403-biaobai(html版本)_1598430618”是经过压缩的HTML文件,可能包含图片、CSS样式表和JavaScript脚本等资源。用户需要先解压,然后在浏览器中打开HTML文件,就能看到预设的告白或纪念日特效。 这个项目展示了HTML作为动态和互动内容载体的强大能力,也提醒我们,尽管技术在进步,但有时复古的方式(如使用IE浏览器)仍能唤起怀旧之情。在准备类似的个性化礼物时,掌握基本的HTML和网页制作技巧非常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值