带妹学Java第六天(至Object类)

知识点

1. 接口

2. package、import、class

3. 修饰符

4. 5种内部类

5. Eclipse常用快捷键

6. Object类

重点

1.接口

  • 什么是接口:就是指java的interface,接口就是定义一些规则
  • 接口的特点
    a:接口用关键字interface表示
    interface 接口名{}
    b:类实现接口用implements表示
    class 类名 implements 接口名{}
    c:接口不能实例化
    按照多态的方式来实例化
    接口 变量名 = new 实现类();
    d:接口的子类
    可以是抽象类,但意义不大
    可以是具体类,要重写接口中的所有方法

2.类与类,类与接口,接口与接口的关系讲解

  • 类与类:
    继承关系,只能是单继承,可以多层继承

  • 类与接口
    实现关系,可以单实现,也可以多实现
    并且还可以在继承一个类的同时实现多个接口

  • 接口与接口
    继承关系,可以单继承,也可以多继承

3.package关键字

package其实就是一个文件夹,它用于代码的分模块
package的命令规则是域名的倒写+模块名称
eg:www.baidu.com
com.baidu.student
com.baidu.teacher

4.包的注意事项

1.package必须放在代码的第一行
2.导入一个包的类有两种方法
com.baidu.model.Student;只导入一个类
com.baidu.model.*;导入这个包的所有类
3.创建对象的另一个方式
以前:Student stu = new Student();
现在可以使用: com.baidu.model.Student stu = new com.baidu.model.Student();

5.import关键字

1.import用来导入其它包的类
2.import必须放在package的下面

6.用在类身上的修饰符

1.如果一个类不写任何的修饰符(default),代表这个类,只能在当前包被访问
2.如果一个类写了public,代表这个类,任何人都能访问,public类就是共享的
3.如果一个类声明为final,代表这个类没有子类,不能被继承
4.如果一个类声明为abstract抽象,代表这个类不能new,只能由子类来继承抽象并,并且要实现抽象类的抽象方法

7.用在属性上的修饰符

1.如果一个属性声明为private,代表这个属性只能在当前类中使用
2.如果一个属性什么都不声明,代表是默认的,表示在同一个包中能被访问,其它包不访问这个属性
3.属性声明为protected,代表的意思先放着。。。后面讲
4.属性声明为public,代表任何地方都可以访问这个属性
5.属性声明为static,代表是一个静态属性,访问的时候,通过类名访问
6.属性声明为final,代表这个属性变成了"常量",如果是常量,最好一旦声明就赋值

8.用在构造方法上的修饰符

1.如果构造方法声明为public,代表这个类的外面可以调用构造方法来创建对象
2.如果构造方法声明为private,代表这个类的外面不可以调用构造方法来创建对象
但是这个类的内部是可以调用构造方
3.构造方法声明为protected,很少用,不用学…
4.构造方法前面不写,代表默认,同一个包内可以调用构造方法

9.用在方法上的修饰符

1.如果方法声明为private,代表这个方法只能在当前类中使用
2.如果方法声明不写权限,就是默认的权限,代表这个方法在同一个包中可能被访问,其它包不能访问
3.如果方法声明为protected,先放着,后面讲
4.如果方法声明为public,代表任何地方都可以访问这个方法
5.如果方法声明为static,代表静态方法,通过类名调用方法
6.如果方法声明为final,这个方法不能被 重写/覆盖 override
7.如果方法声明为abstract,这个方法需要被子类实现

10.修饰符配合使用

成员方法:

  • public static
  • public abstract
  • public final

成员变量:public static final

abstract class A{
//公共的静态常量…
public static final int MAX_INT = 140;//最大的数字

//这个方法任何人都能访问,使用静态方法访问
public static void test1(){
	System.out.println("...");
}

//这个方法是公共,需要子类实现
public abstract void test2();

//这个方法也是公共,任何人都能访问,但是不能被子类重写
public final void test3(){
	System.out.println("....");
}

}

11.protected 受保护的

  1. protected修饰的方法只能在当前包中访问,或者子类访问

12.内部类(*)

类里面再声明类

  • 五种分类
  1. 默认内部类
class Outer{
	private int a = 12;
	class Inner{
		public void test2(){
			//"内部类"可以直接访问"外部类"的成员,包括私有。 
			System.out.println("内部类访问外部的变量a=" + a);
		}
	}
}
  1. 私有内部类
class Outer{
	private int a = 12;
	private class Inner{
		public void test2(){
			System.out.println("内部类访问外部的变量a=" + a);
		}
	}
	
	public void test1(){
		Inner inner = new Inner();
		inner.test2();
	}
}
  1. 静态内部类
class Outer{
	private int a = 12;
	static class Inner{
		public void test2(){
			System.out.println("内部类访问外部的变量a=" + a);
		}
	}
}
  1. 局部内部类
class Outer{
	public void test1(){
		final int a = 10;//局部变量
		class Inner{//局部内部类
			public void test2(){
				System.out.println(a);
			}
		}
		Inner inner = new Inner();
		inner.test2();
	}
}
  1. 匿名内部类

a抽象类的匿名内部类
b接口的匿名内部类
c new 抽象类 或者接口,都必须实现里面的所有方法

13.抽象类与接口的区别

/* 成员区别
1.抽象类:
*属性:可以变量,也可以常量
*构造方法:有
*成员方法:可以抽象,也可以非抽象
2.接口:
*属性:只可以常量
成员方法:只可以抽象
3.关系区别
类与类: 继承关系,单继承
类与接口: 实现关系,单实现和多实现都可以
接口与接口: 继承关系,单继承和多继承
4.设计理念区别
抽象类 抽象类中定义的是该继承体系的共性功能
接口 接口中定义的是该继承体系的扩展功能
/

public class Demo01 {

	public static void main(String[] args) {
	
		System.out.println(AnimalInteface.MAX_LEGS);
	}

}

abstract class Animal{
	String name;//变量
	final int MAX_LEGS = 4;//常量
	
	public Animal(String name) {
		super();
		this.name = name;
	}
	
	//非抽象的方法
	public void say(){
		
	}
	
	//抽象方法 
	public  abstract void speak();
}

interface AnimalInteface{
	
	//String name;//接口不能写变量
	final int MAX_LEGS = 4;//接口中只能写常量,默认加了静态
	
	public void say();//默认就是抽象方法,而且接口只能写抽象方法
	
	//接口的方法不能写实现 
	/*public void speak(){
		
	}*/
}

14.Eclipse快捷键

//1.ctrl + n :新建文件
//2.ctr + shift + f:代码格式化
//3.ctrl + shift + o :快速导包
//4.ctrl + shift + / :多行注释
//5.ctrl + shift + \ :取消多行注释
//6.ctrl + / :单行注释
//7.alt + 上、下键:代码移动
//8.ctrl + 鼠标点击:查看源码
//9.Fn + F3 看源码
//10.ctrl + shift + t :查找类
//11.ctrl + o: 找类的方法
//12.ctrl + 1: 快速修复问题
//13.ctrl + d: 删除代码
//14.alt + shift + m:抽取方法
//15.alt + shift + r:改名
//16.添加自己的内容辅助键(alt + /)

15.生成jar包的导入jar包到项目

jar的作用:jar就是把.class文件进行压缩
在项目中的使用:别人写好的功能进行打包,我们使用的时候,
只需要知识方法怎么用就行了,至用方法内部的实现(算法)我们不用理会
/***

  • 1.如何生成一个jar包
  • 选中项目 – 右键 – Export – Java – Jar – 自己指定一个路径和一个名称 - Finish
  • 2.使用jar包
  • 》在项目中创建一个lib文件夹(lib-library类库)
  • 》把jar包放在lib下
  • 》右键.jar - bulid path
    */

16. Object

1》Object类的概述
1.Object是类层次结构的根类
2.所有类都直接或者间接的继承Object类
3.Object类的构造方法:public Object()
4.子类的构造方法默认访问的是父类的无参构造方法

2》Object的hashCode方法
1.Object有一个方法 public int hashCode()
2.方法返回对象的哈希码值,默认情况下该方法会根据对象的地址来计算
3.不同对象的hashCode()一般来说不会相同,但同一个对象的hashcode值肯定是相同的
4.hashCode不是对象的实际地址值,可以理解为逻辑地址值

3》Object的getClass方法
1.public final class getClass()
2.返回此object运行时类
3.可以通过class类中的一个方法,获取对象的真实类的全名称

练习题

1.员工抽象类

1.程序员、项目经理
2.程序员:名字,工号,工资,项目经理有个特殊奖金

abstract class Employee{
	String name;
	String id;
	double salary;
	
	//3个构造方法
	//say方法
	public abstract void say();
}

class Progremmer extends Employee{
	public void say(){
		{
		System.out.println( name);
		System.out.println( id);
		System.out.println( salary);
	}
	}
}

class ProjectMananger extends Employee{
	double bonuses;
	//构造方法(4个参数){
		调用父类的3个参数构造方法
		this.bonuses = bonuses;public void say(){
		{
		System.out.println( name);
		System.out.println( id);
		System.out.println( salary);
		System.out.println( bonuses);
	}
	
}

//比较好的写法
class ProjectMananger extends Progremmer{
	double bonuses;
	//构造方法(4个参数){
		调用父类的3个参数构造方法
		this.bonuses = bonuses;public void say(){
		{
		supper.say();
		System.out.println( bonuses);
	}
	
}

2.抽象类和接口综合案例

  1. 共性的东西写抽象类
  2. 非共性可以写在接口
/***
 * 结论:
 * 如果一个类,即继承抽象类,又实现接口,最好不要用多态的写法
 * 如果是多态的写法,接口的方法不能调用,或者说抽象类的方法不能调用
 **/
public class Demo01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//练习-抽象类与接口综合案例
	/*	动物类:姓名,年龄,吃饭,睡觉
		猫和狗
		动物培训接口:跳高*/

		//使用多态来用类
		//Animal cat = new Cat();//多态:抽象类指向子类对象
		//JumpInterface cat = new Cat();//多态:接口指向子类对象
		Cat cat = new Cat();
		cat.name = "小花";
		cat.age = 1;
		cat.eat();
		cat.sleep();
		cat.jump();
		
		System.out.println("=============");
		Animal dog = new Dog();
		dog.name = "小黑";
		dog.age = 3;
		dog.eat();
		dog.sleep();
	}

}

//抽象类声明的是共同属性和行为
abstract class Animal{
	String name;
	int age;
	
	public abstract void eat();
	public abstract void sleep();
}

class Cat extends Animal implements JumpInterface{

	@Override
	public void eat() {
		System.out.println("猫吃鱼...");
	}

	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		System.out.println("猫躺着睡...");
	}

	@Override
	public void jump() {
		System.out.println("猫跳火圈...");
		
	}
}

class Dog extends Animal{

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("狗啃骨头...");
	}

	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		System.out.println("狗趴着睡...");
	}
}

//跳高不是共性,所以声明到一个接口中,不放在抽象类
interface JumpInterface{
	public void jump();
}

3.某女星和某干爹的例子讲解

eg.一个人只能有一个亲爹,可以有多个干爹
如同一个类只能继承一个父类,可以实现多个接口

/***
 * 案例是帮助大家更好的理解
 *  1.类与类 为什么只能是单继承
 *  2.类与接口 可以多实现
 * @author zx
 *
 */
public class Demo01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//某女星和某干爹的例子
		刘亦菲 lyf = new 刘亦菲();
		lyf.drive();
		lyf.东成西就();
		lyf.芳华();
	}
}

class 亲爹{
	
	public void drive(){
		System.out.println("开着三轮车...");
	}
	
}

interface 张艺谋干爹{
	
	public void 东成西就();
}

interface 冯小刚干爹{
	public void 芳华();
}

class 刘亦菲 extends 亲爹 implements 张艺谋干爹,冯小刚干爹{

	@Override
	public void 东成西就() {
		System.out.println("恭喜,张艺谋干爹给你演东成西就主角...");
		
	}

	@Override
	public void 芳华() {
		System.out.println("恭喜,冯小刚干爹给你演芳华主角...");
		
	}
	
}

面试题

1.pacage,import,class,有没顺序?

a. package只能有一个,必须放在java文件的第一行
b. import只能放在package的下面,多个import应放在一起
c. class 放在 package 或者import的下面

2.局部内部类访问局部变量时,变量要加final修饰,为什么?

jdk1.8,不加final代码不会报错,jdk1.7以下的版本不写final会报错
其实就是在jdk1.8的环境下,系统帮你默认添加了final关键字

public class Demo01 {
	public static void main(String[] args) {
		Outer outer = new Outer();
		outer.test1();
	}
}
/**
 * 1.局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么? 
 * 2.jdk1.8,不加final代码不会报错,jdk1.7以下的版本不写final会报错
 * */
class Outer{
	public void test1(){
		final int a = 10;//局部变量
		class Inner{//局部内部类
			public void test2(){
				System.out.println(a);
			}
		}
		Inner inner = new Inner();
		inner.test2();
	}
}

3.内部类面试题

interface Inter { 
	void show(); 
}

class A implements Inter{

	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("HelloWord");
	}
}

class Outer { 
	//补齐代码
	//第一种写法
	/*public static A method(){
		return new A();
	}*/
	
	/*public static Inter method(){
		return new A();
	}*/
	//第二种写法:接口指向匿名内部类对象
	//方法的返回值类型是接口
	public static Inter method(){
		return new Inter() {
			
			@Override
			public void show() {
				// TODO Auto-generated method stub
				System.out.println("HelloWord");
			}
		};
	}
}

class OuterDemo {
	public static void main(String[] args){
		
		  Outer.method().show();
	  }
}

总结

今天带妹学习了面向对象的接口、4种修饰符、5种内部类等知识点。说实话,Java这一块的内容有点绕,特别是内部类里,种类繁多,如果该类或者方法被static、abstract、final、private等修饰符修饰,实例化对象也有变化。不过知识循序渐进的,理解哪些是类属性,哪些是对象属性,就好做了。抽象类和接口的区别在于,抽象类-属性:可以是变量,也可以常量,构造方法:有;成员方法:可以抽象,也可以非抽象。而接口:属性:只可以常量,成员方法:只可以抽象抽象类拥有属性。另外对数据存储,栈区、堆区、方法区有深一步的理解,便于逻辑思维的养成。最后希望大家要坚持敲代码,练出码感。

发布了24 篇原创文章 · 获赞 4 · 访问量 620

猜你喜欢

转载自blog.csdn.net/qq_43488797/article/details/103737386