java基础-day15
第01天 java面向对象
今日内容介绍
u 包和权限修饰符
u 内部类
第1章 包和权限修饰符
1.1 包的概述
java的包,其实就是我们电脑系统中的文件夹,包里存放的是类文件。
当类文件很多的时候,通常我们会采用多个包进行存放管理他们,这种方式称为分包管理。
在项目中,我们将相同功能的类放到一个包中,方便管理。并且日常项目的分工也是以包作为边界。
1.2 包的声明格式
通常使用公司网址反写,可以有多层包,包名采用全部小写字母,多层包之间用”.”连接
类中包的声明格式:
package 包名.包名.包名…;
如:黑马程序员网址itheima.com那么网址反写就为com.itheima
传智播客 itcast.cn 那么网址反写就为 cn.itcast
注意:声明包的语句,必须写在程序有效代码的第一行(注释不算)
代码演示:
package com.itheima_01;
/*
* 包的特点:
* 可以有多层
* 不同包下的文件名可以重复
* 包的声明必须是第一行代码
*
*/
public class PackageDemo {
}
1.3 包之间互相访问
在访问类时,为了能够找到该类,必须使用含有包名的类全名(包名.类名)。
包名.包名….类名
如: java.util.Scanner
java.util.Random
cn.itcast.Demo
带有包的类,创建对象格式:包名.类名 变量名 = new包名.类名();
cn.itcast.Demo d = new cn.itcast.Demo();
前提:包的访问与访问权限密切相关,这里以一般情况来说,即类用public修饰的情况。
类的简化访问
当我们要使用一个类时,这个类与当前程序在同一个包中(即同一个文件夹中),或者这个类是java.lang包中的类时通常可以省略掉包名,直接使用该类。
我们每次使用类时,都需要写很长的包名。很麻烦,我们可以通过import导包的方式来简化。
可以通过导包的方式使用该类,可以避免使用全类名编写(即,包类.类名)。
导包的格式:
import 包名.类名;
1.3.1 案例代码一:
package com.itheima_01;
import java.util.ArrayList;
/*
*
* 不同包之间的互相访问
* 使用类的全名
* 使用关键字import将类导入
*
*
* 注意:*代表的是通配符,代表导入了这个包下所有的类,并没有导入子包下的类
*
* 类的全名:包名.类名
*
*
*/
public class PackageDemo2 {
public static void main(String[] args) {
//相同包下的类可以直接访问,不需要做其他的操作
//PackageDemo pd = new PackageDemo();
java.util.ArrayList list = new java.util.ArrayList();
ArrayList list2 = new ArrayList();
}
}
1.4 权限修饰符
在Java中提供了四种访问权限,使用不同的访问权限时,被修饰的内容会有不同的访问权限,以下表来说明不同权限的访问能力:
public |
protected |
default |
private |
|
同一类中 |
√ |
√ |
√ |
√ |
同一包中(子类与无关类) |
√ |
√ |
√ |
|
不同包的子类 |
√ |
√ |
||
不同包中的无关类 |
√ |
归纳一下:在日常开发过程中,编写的类、方法、成员变量的访问
A:要想仅能在本类中访问使用private修饰
B:要想本包中的类都可以访问除了private修饰符,其它都可以
C:要想本包中的类与其他包中的子类可以访问使用protected修饰
D:要想所有包中的所有类都可以访问使用public修饰。
注意:如果类用public修饰,则类名必须与文件名相同。一个文件中只能有一个public修饰的类。
1.4.1 案例代码二:
package com.itheima_02;
/*
* 权限修饰符:
public 当前类,相同包下不同的类,不同包下的类
default 当前类,相同包下不同的类
private 当前类
protected 当前类,相同包下不同的类
default:当前包下使用
protected:让子类对象使用
*
*/
public class PermissionsDemo {
public void publicMethod() {
System.out.println("publicMethod");
}
void defaultMethod() {
System.out.println("defaultMethod");
}
private void privateMethod() {
System.out.println("privateMethod");
}
protected void protectedMethod() {
System.out.println("protectedMethod");
}
public static void main(String[] args) {
PermissionsDemo pd = new PermissionsDemo();
pd.publicMethod();
pd.defaultMethod();
pd.privateMethod();
pd.protectedMethod();
}
}
package com.itheima_02;
public class PermissionsDemo2 {
public static void main(String[] args) {
PermissionsDemo pd = new PermissionsDemo();
pd.publicMethod();
pd.defaultMethod();
//pd.privateMethod();
pd.protectedMethod();
}
}
package com.itheima_03;
import com.itheima_02.PermissionsDemo;
public class PermissionsDemo3 {
public static void main(String[] args) {
PermissionsDemo pd = new PermissionsDemo();
pd.publicMethod();
//pd.defaultMethod();
//pd.privateMethod();
//pd.protectedMethod();
}
}
package com.itheima_03;
import com.itheima_02.PermissionsDemo;
public class PermissionsDemo4 extends PermissionsDemo {
public void function() {
super.publicMethod();
super.protectedMethod();
}
public static void main(String[] args) {
}
}
第2章 内部类
2.1 内部类概述
A:什么是内部类
将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类。
B:什么时候使用内部类
在描述事物时,若一个事物内部还包含其他可能包含的事物,比如在描述汽车时,汽车中还包含这发动机,这时发动机就可以使用内部类来描述。
class 汽车 { //外部类
class 发动机 { //内部类
}
}
2.2 成员内部类
成员内部类,定义在外部类中的成员位置。与类中的成员变量相似,可通过外部类对象进行访问
A:定义格式
class 外部类 {
修饰符 class 内部类 {
//其他代码
}
}
B:访问方式
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
2.2.1 案例代码三
package com.itheima_01;
/*
* 成员内部类:
* 在类的成员位置,和成员变量以及成员方法所在的位置是一样的
* 在内部类当中,可以直接访问外部类的成员,包括私有成员
*/
public class InnerDemo {
public static void main(String[] args) {
//Outer o = new Outer();
//o.method();
Outer.Inner i = new Outer().new Inner();
i.function();
}
}
class Outer {
private int num = 10;
public void method() {
Inner i = new Inner();
i.function();
}
class Inner {
public void function() {
System.out.println(num);
}
}
}
成员内部类
成员内部类可以使用的修饰符:private,public,procted,final,static,abstract
2.2.2 案例代码四
package com.itheima_01;
/*
* 成员内部类的修饰符:
* 我们可以使用权限修饰符修饰成员内部类,但是如果使用私有来修饰,则无法在其他类中访问
* 我们可以使用static修饰成员内部类,不用再创建外部类的对象了
*
* 我们可以使用abstract,final修饰成员内部类
*/
public class InnerDemo2 {
public static void main(String[] args) {
//Outer2.Inner2 i;
//Outer2.Inner2 i = new Outer2.Inner2();
//i.function();
Outer2.Inner2.function();
}
}
class Outer2 {
public void method() {
Inner2 i = new Inner2();
}
static class Inner2 {
public static void function() {
System.out.println("function");
}
}
}
2.3 局部内部类
局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问
A:定义格式
class 外部类 {
修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}
B:访问方式
在外部类方法中,创建内部类对象,进行访问
2.3.1 案例代码五:
package com.itheima_02;
/*
* 局部内部类
* 在方法内,出了方法之后就无法使用
*
*
*/
public class InnerDemo3 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
class Outer {
public void method() {
int num = 10;
class Inner {
public void function() {
System.out.println("function");
}
}
Inner i = new Inner();
i.function();
}
public void test() {
//Inner i = new Inner();
//System.out.println(num);
}
}
2.4 匿名内部类
A:作用:匿名内部类是创建某个类型子类对象的快捷方式。
B:格式:
new 父类或接口(){
//进行方法重写
};
代码演示
//已经存在的父类:
public abstract class Person{
public abstract void eat();
}
//定义并创建该父类的子类对象,并用多态的方式赋值给父类引用变量
Person p = new Person(){
public void eat() {
System.out.println(“我吃了”);
}
};
//调用eat方法
p.eat();
使用匿名对象的方式,将定义子类与创建子类对象两个步骤由一个格式一次完成,。虽然是两个步骤,但是两个步骤是连在一起完成的。
匿名内部类如果不定义变量引用,则也是匿名对象。代码如下:
new Person(){
public void eat() {
System.out.println(“我吃了”);
}
}.eat();
2.4.1 案例代码六:
package com.itheima_03;
/*
* 匿名内部类:
* 可以把匿名内部类看成是一个没有名字的局部内部类
* 定义在方法当中
* 必须在定义匿名内部类的时候创建他的对象
* 格式:
* new 类/接口(){
* 如果是创建了继承这个类的子类对象,我们可以重写父类的方法
* 如果是创建了实现这个接口的子类对象,我们必须要实现该接口的所有方法
* };
* 原理:而是创建了继承这个类的子类对象或者是创建了实现这个接口的子类对象
*
*/
public class InnerDemo4 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
interface Inner {
public void function();
}
class Outer {
public void method() {
/*new Inner() {
@Override
public void function() {
System.out.println("function");
}
}.function();;*/
Inner i = new Inner() {
@Override
public void function() {
System.out.println("function");
}
};
i.function();
i.function();
}
}
2.4.2 案例代码七:
匿名内部类作为参数传递
package com.itheima_04;
public interface Animal {
public abstract void eat();
}
package com.itheima_04;
public class Cat implements Animal {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
package com.itheima_04;
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("狗啃骨头");
}
}
package com.itheima_04;
/*
* 匿名内部类的应用场景:
* 作为参数进行传递
*
*
*/
public class InnerDemo5 {
public static void main(String[] args) {
//method(new Dog());
//method(new Cat());
method(
new Animal() {
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
);
}
public static void method(Animal a) {
a.eat();
}
}
java基础-day15的更多相关文章
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- 【JAVA面试题系列一】面试题总汇--JAVA基础部分
JAVA基础 基础部分的顺序: 基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法 线程的语法,集合的语法,io 的语法,虚拟机方面的语法 每天几道,持续更新!! 1.一个". ...
- 最适合作为Java基础面试题之Singleton模式
看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...
- java基础练习 字符串,控制流,日历,日期等
1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...
- Java基础知识【下】( 转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- Java基础知识【上】(转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- java基础学习03(java基础程序设计)
java基础程序设计 一.完成的目标 1. 掌握java中的数据类型划分 2. 8种基本数据类型的使用及数据类型转换 3. 位运算.运算符.表达式 4. 判断.循环语句的使用 5. break和con ...
- Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)
线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...
随机推荐
- istio分布式调用链Jaeger
1.安装 kubectl apply -n istio-system -f https://raw.githubusercontent.com/jaegertracing/jaeger-kuberne ...
- C# fckeditor浏览服务器和上传目录不一致,看不到上传过的文件
fckeditor在上传标签页面,传过文件后,在浏览服务器那里,看不到之前上传的文件,通过浏览服务器页面上传文件,保存的目录也和上传标签页面上传的不是同一个文件夹. 修改方法如下: 打开fckedit ...
- nginx 启动报错 “/var/run/nginx/nginx.pid" failed” 解决方法
问题: 重启虚拟机后,再次重启nginx会报错: open() "/var/run/nginx/nginx.pid" failed (2: No such file or dire ...
- CSharp陷阱1
CSharp陷阱1 环境:sharpdevelop 3 .net 2.0 正确的 internal static readonly string[] string_2 = new ...
- 异步Servlet和异步过虑器
异步处理功能可以节约容器线程.此功能的作用是释放正在等待完成的线程,是该线程能够被另一请求所使用. 要编写支持异步处理的 Servlet 或者过虑器,需要设置 asyncSupported 属性为 t ...
- connect: Address is invalid on local machine or port is not valid on remote
idea 运行正常打成jar包运行提示“connect: Address is invalid on local machine or port is not valid on remote” , 解 ...
- 尝试解决nginx的499错误1
- 使用EventLog Analyzer监控、管理及分析日志
- 清幽傲竹实现的kbmMWServer数据库联接失败重联(转载红鱼儿)
1.修改kbmMWUnidac单元的TkbmMWUNIDACConnection.InternalOpenConnection方法,加上: //支持unidac重联 ...
- Django学习经验
1.在1.9——>到2.0的版本中, Django.core.urlresolvers import reverse ——>django.urls 2.当无法访问时把原来的数据清空: 首先 ...